📄 gui-dial.c
字号:
u = gtk_hbox_new(1,dialog_button_spacing); gtk_widget_show(u); gtk_box_pack_start(GTK_BOX(box),u,0,0,0); chow_accel = gtk_accel_group_new(); for (i=0;i<3;i++) { static int keys[] = { GDK_l, GDK_m, GDK_u }; v = gtk_button_new_with_label(player_print_ChowPosition(i)); GTK_WIDGET_UNSET_FLAGS(v,GTK_CAN_FOCUS); gtk_widget_show(v); gtk_box_pack_start(GTK_BOX(u),v,1,1,0); chowbuttons[i] = v; gtk_signal_connect(GTK_OBJECT(v),"clicked", do_chow,(gpointer)i); gtk_accel_group_add(chow_accel,keys[i],0,0,GTK_OBJECT(v),"clicked"); gtk_label_set_pattern(GTK_LABEL(GTK_BIN(v)->child),"_"); } gtk_signal_connect(GTK_OBJECT(chow_dialog),"hide", add_or_remove_chow_accels,(gpointer)0); gtk_signal_connect(GTK_OBJECT(chow_dialog),"show", add_or_remove_chow_accels,(gpointer)1);}/* now create the declaring specials dialog. Contains a button for declare (special), kong, and done. If no flowers, just kongs.*/static GtkWidget *ds_dialog_declare_button;static GtkWidget *ds_dialog_finish_button;static GtkAccelGroup *ds_accel;static void add_or_remove_ds_accels(GtkWidget *w UNUSED, gpointer data){ if ( ds_accel == NULL ) return; if ( data ) { gtk_window_add_accel_group(GTK_WINDOW(topwindow),ds_accel); } else { gtk_window_remove_accel_group(GTK_WINDOW(topwindow),ds_accel); }}void ds_dialog_init(void) { GtkWidget *box, *bbox, *w; if ( ds_dialog ) { gtk_widget_destroy(ds_dialog); ds_dialog = NULL; } switch ( dialogs_position ) { case DialogsCentral: case DialogsUnspecified: ds_dialog = gtk_event_box_new(); gtk_fixed_put(GTK_FIXED(discard_area),ds_dialog,0,0); break; case DialogsBelow: ds_dialog = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(dialoglowerbox),ds_dialog,1,0,0); break; case DialogsPopup: ds_dialog = gtk_window_new(GTK_WINDOW_DIALOG); gtk_signal_connect (GTK_OBJECT (ds_dialog), "delete_event", GTK_SIGNAL_FUNC (gtk_widget_hide), NULL); } box = gtk_vbox_new(0,dialog_vert_spacing); gtk_container_set_border_width(GTK_CONTAINER(box), dialog_border_width); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(ds_dialog),box); bbox = gtk_hbox_new(1,dialog_button_spacing); gtk_widget_show(bbox); gtk_box_pack_end(GTK_BOX(box),bbox,0,0,0); if ( game_get_option_value(the_game,GOFlowers,NULL) ) w = gtk_label_new("Declare Flowers/Seasons (and kongs)\nSelect tile and:"); else w = gtk_label_new("Declare kongs\nSelect tile and:"); gtk_widget_show(w); gtk_box_pack_end(GTK_BOX(box),w,0,0,0); ds_accel = gtk_accel_group_new(); if ( game_get_option_value(the_game,GOFlowers,NULL) ) { ds_dialog_declare_button = w = gtk_button_new_with_label("Declare"); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(bbox),w,1,1,0); gtk_signal_connect(GTK_OBJECT(w),"clicked", turn_callback,(gpointer)PMsgDeclareSpecial); gtk_accel_group_add(ds_accel,GDK_d,0,0,GTK_OBJECT(w),"clicked"); gtk_label_set_pattern(GTK_LABEL(GTK_BIN(w)->child),"_"); } w = gtk_button_new_with_label("Kong"); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(bbox),w,1,1,0); gtk_signal_connect(GTK_OBJECT(w),"clicked", turn_callback,(gpointer)PMsgDeclareClosedKong); gtk_accel_group_add(ds_accel,GDK_k,0,0,GTK_OBJECT(w),"clicked"); gtk_label_set_pattern(GTK_LABEL(GTK_BIN(w)->child),"_"); ds_dialog_finish_button = w = gtk_button_new_with_label("Finish"); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(bbox),w,1,1,0); gtk_signal_connect(GTK_OBJECT(w),"clicked", turn_callback,(gpointer)PMsgNoClaim); gtk_accel_group_add(ds_accel,GDK_f,0,0,GTK_OBJECT(w),"clicked"); gtk_label_set_pattern(GTK_LABEL(GTK_BIN(w)->child),"_"); gtk_signal_connect(GTK_OBJECT(ds_dialog),"hide", add_or_remove_ds_accels,(gpointer)0); gtk_signal_connect(GTK_OBJECT(ds_dialog),"show", add_or_remove_ds_accels,(gpointer)1);}void ds_dialog_popup(void) { dialog_popup(ds_dialog,DPCentredOnce); if ( game_get_option_value(the_game,GOFlowers,NULL) ) grab_focus_if_appropriate(ds_dialog_declare_button); else grab_focus_if_appropriate(ds_dialog_finish_button);}/* dialog to ask to continue with next hand */static GtkWidget *continue_dialog_continue_button;static GtkWidget *continue_dialog_label;void continue_dialog_init(void) { GtkWidget *box, *w; if ( continue_dialog ) { gtk_widget_destroy(continue_dialog); continue_dialog = NULL; } switch ( dialogs_position ) { case DialogsCentral: case DialogsUnspecified: continue_dialog = gtk_event_box_new(); gtk_fixed_put(GTK_FIXED(discard_area),continue_dialog,0,0); break; case DialogsBelow: continue_dialog = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(dialoglowerbox),continue_dialog,1,0,0); break; case DialogsPopup: continue_dialog = gtk_window_new(GTK_WINDOW_DIALOG); gtk_signal_connect (GTK_OBJECT (continue_dialog), "delete_event", GTK_SIGNAL_FUNC (gtk_widget_hide), NULL); } box = gtk_vbox_new(0,dialog_vert_spacing); gtk_container_set_border_width(GTK_CONTAINER(box), dialog_border_width); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(continue_dialog),box); continue_dialog_continue_button = w = gtk_button_new_with_label("Ready"); gtk_widget_show(w); gtk_box_pack_end(GTK_BOX(box),w,0,0,0); gtk_signal_connect(GTK_OBJECT(w),"clicked", continue_callback,(gpointer)PMsgDiscard); /* created and packed second so things float to bottom */ continue_dialog_label = w = gtk_label_new("Here is some dummy text to space"); gtk_widget_show(w); gtk_box_pack_end(GTK_BOX(box),w,0,0,0); }void continue_dialog_popup(void) { static char buf[256]; /* the text of the display depends on whether we've said we're ready */ if ( ! the_game->active ) { strcpy(buf,"Waiting for game to (re)start"); gtk_label_set_text(GTK_LABEL(continue_dialog_label),buf); gtk_widget_hide(continue_dialog_continue_button); } else if ( the_game->ready[our_seat] ) { strcpy(buf,"Waiting for others "); strcat(buf,the_game->paused); gtk_label_set_text(GTK_LABEL(continue_dialog_label),buf); gtk_widget_hide(continue_dialog_continue_button); } else { strcpy(buf,"Ready "); strcat(buf,the_game->paused); strcat(buf,"?"); gtk_label_set_text(GTK_LABEL(continue_dialog_label),buf); gtk_widget_show(continue_dialog_continue_button); grab_focus_if_appropriate(continue_dialog_continue_button); } dialog_popup(continue_dialog,DPCentredOnce);}static void continue_callback(GtkWidget *w UNUSED, gpointer data UNUSED) { PMsgReadyMsg rm; rm.type = PMsgReady; send_packet(&rm);}/* how many are up; used for positioning - not multi-thread safe! */static int num_error_dialogs = 0; /* function called to close an error dialog */static void kill_error(GtkObject *data) { gtk_widget_destroy(GTK_WIDGET(data)); num_error_dialogs--;}/* popup an error box (new for each message), or an info box (which doesn't have error tile in it)' */static void _error_dialog_popup(char *msg,int iserror) { GtkWidget *box, *hbox, *w, *error_dialog, *error_message; if ( num_error_dialogs >= 10 ) { warn("Too many error dialogs up to print error: %s",msg); return; } error_dialog = gtk_window_new(GTK_WINDOW_DIALOG); gtk_signal_connect_object(GTK_OBJECT (error_dialog), "delete_event", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(error_dialog)); gtk_container_set_border_width(GTK_CONTAINER(error_dialog), dialog_border_width); box = gtk_vbox_new(0,dialog_vert_spacing); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(error_dialog),box); hbox = gtk_hbox_new(0,dialog_button_spacing); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(box),hbox,0,0,0); if ( iserror ) { w = gtk_pixmap_new(tilepixmaps[0][ErrorTile],NULL); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(hbox),w,0,0,0); } error_message = gtk_label_new(msg); gtk_widget_show(error_message); gtk_box_pack_start(GTK_BOX(hbox),error_message,0,0,0); w = gtk_button_new_with_label("OK"); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(box),w,0,0,0); gtk_signal_connect_object(GTK_OBJECT(w),"clicked", kill_error,GTK_OBJECT(error_dialog)); gtk_window_set_focus(GTK_WINDOW(error_dialog),w); dialog_popup(error_dialog,DPErrorPos); num_error_dialogs++; gdk_window_raise(error_dialog->window);}void error_dialog_popup(char *msg) { _error_dialog_popup(msg,1);}void info_dialog_popup(char *msg) { _error_dialog_popup(msg,0);}GtkWidget *openfile, *openhost, *openport, *openfiletext, *openhosttext, *openporttext, *openidtext, *opennametext, *opengamefile, *opengamefiletext, *opentimeout;GtkWidget *openallowdisconnectbutton,*opensaveonexitbutton,*openrandomseatsbutton, *openplayercheckboxes[3],*openplayernames[3],*openplayeroptions[3],*opentimeoutspinbutton;static GtkWidget *opengamepanel,*openplayeroptionboxes[3], *openconnectbutton,*openstartbutton, *openresumebutton, *openhosttoggle, *openunixtoggle;/* callback used in next function */static void openbut_callback(GtkWidget *w, gpointer data) { int active = GTK_TOGGLE_BUTTON(w)->active; switch ( (int)data ) { case 1: if ( active ) { /* selected network */ gtk_widget_set_sensitive(openfile,0); gtk_widget_set_sensitive(openhost,1); gtk_widget_set_sensitive(openport,1); } break; case 2: if ( active ) { /* selected Unix socket */ gtk_widget_set_sensitive(openfile,1); gtk_widget_set_sensitive(openhost,0); gtk_widget_set_sensitive(openport,0); } break; case 10: case 11: case 12: gtk_widget_set_sensitive(openplayeroptionboxes[((int)data)-10],active); break; }}/* the dialog for opening a connection. Arguments are initial values for id, name text entry fields, */void open_dialog_init(char *idt, char *nt) { /* Layout of the box: x Connect to host x Use Unix socket Hostname ........ Port .... Filename .... Player ID .... Name .... OPEN CANCEL */ int i; GtkWidget *box, *bbox, *but1, *but2, *w1, *w2; open_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* This one is allowed to shrink, and should */ gtk_window_set_policy(GTK_WINDOW(open_dialog),1,1,1); gtk_signal_connect (GTK_OBJECT (open_dialog), "delete_event", GTK_SIGNAL_FUNC (gtk_widget_hide), NULL); gtk_container_set_border_width(GTK_CONTAINER(open_dialog), dialog_border_width); box = gtk_vbox_new(0,dialog_vert_spacing); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(open_dialog),box); w1 = gtk_hbox_new(0,dialog_button_spacing); gtk_widget_show(w1); gtk_box_pack_start(GTK_BOX(box),w1,0,0,0); openhosttoggle = but1 = gtk_radio_button_new_with_label(NULL,"Internet server"); GTK_WIDGET_UNSET_FLAGS(but1,GTK_CAN_FOCUS);#ifndef WIN32 gtk_widget_show(but1);#endif gtk_box_pack_start(GTK_BOX(w1),but1,0,0,0); openunixtoggle = but2 = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(but1)),"Unix socket server"); GTK_WIDGET_UNSET_FLAGS(but2,GTK_CAN_FOCUS);#ifndef WIN32 gtk_widget_show(but2);#endif gtk_box_pack_end(GTK_BOX(w1),but2,0,0,0); gtk_signal_connect(GTK_OBJECT(but1),"toggled",openbut_callback,(gpointer)1); gtk_signal_connect(GTK_OBJECT(but2),"toggled",openbut_callback,(gpointer)2); w2 = gtk_hbox_new(0,dialog_button_spacing); gtk_widget_show(w2); gtk_box_pack_start(GTK_BOX(box),w2,0,0,0); openhost = gtk_hbox_new(0,0); gtk_widget_show(openhost); gtk_box_pack_start(GTK_BOX(w2),openhost,0,0,0); w1 = gtk_label_new("Host: "); gtk_widget_show(w1); gtk_box_pack_start(GTK_BOX(openhost),w1,0,0,0); openhosttext = gtk_entry_new(); gtk_widget_show(openhosttext); gtk_box_pack_start(GTK_BOX(openhost),openhosttext,0,0,0); openport = gtk_hbox_new(0,0); gtk_widget_show(openport); gtk_box_pack_start(GTK_BOX(w2),openport,0,0,0); w1 = gtk_label_new("Port: "); gtk_widget_show(w1); gtk_box_pack_start(GTK_BOX(openport),w1,0,0,0); openporttext = gtk_entry_new_with_max_length(5); gtk_widget_set_usize(openporttext,75,0); gtk_widget_show(openporttext); gtk_box_pack_start(GTK_BOX(openport),openporttext,0,0,0); openfile = gtk_hbox_new(0,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -