X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxoptions.c;h=18fc857c2026deccd2a0da1600d11b206beafdf1;hb=45609e1f60534051fc729485d692081aa7bf1314;hp=ecdbd30c22b3976244773e426dd4a3783714f846;hpb=1c03d229073e56dda9e5856db5adaae51576a3bb;p=xboard.git diff --git a/gtk/xoptions.c b/gtk/xoptions.c index ecdbd30..18fc857 100644 --- a/gtk/xoptions.c +++ b/gtk/xoptions.c @@ -427,7 +427,15 @@ CreateMenuPopup (Option *opt, int n, int def) if(mb[i].handle == RADIO) gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(entry), True); } else entry = gtk_menu_item_new_with_label(msg); - gtk_signal_connect_object (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC(MenuSelect), (gpointer) (n<<16)+i); + gtk_signal_connect_object (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC(MenuSelect), (gpointer) (intptr_t) ((n<<16)+i)); + if(mb[i].accel) { + guint accelerator_key; + GdkModifierType accelerator_mods; + + gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods); + gtk_widget_add_accelerator (GTK_WIDGET(entry), "activate",GtkAccelerators, + accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE); + }; gtk_widget_show(entry); } else entry = gtk_separator_menu_item_new(); gtk_menu_append(GTK_MENU (menu), entry); @@ -515,7 +523,7 @@ ShiftKeys () static gboolean GameListEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) { - int n = (int) gdata; + int n = (intptr_t) gdata; if(n == 4) { if(((GdkEventKey *) event)->keyval != GDK_Return) return FALSE; @@ -555,7 +563,7 @@ MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) GtkTextIter start, end; String val = NULL; gboolean res; - gint index, x, y; + gint index = 0, x, y; switch(event->type) { // figure out what's up case GDK_MOTION_NOTIFY: @@ -612,7 +620,7 @@ AddHandler (Option *opt, DialogClass dlg, int nr) case 5: // game list g_signal_connect(opt->handle, "button-press-event", G_CALLBACK (GameListEvent), (gpointer) 0 ); case 4: // game-list filter - g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (GameListEvent), (gpointer) nr ); + g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (GameListEvent), (gpointer) (intptr_t) nr ); break; case 6: // engine output (uses generic textview callback) break; @@ -626,7 +634,7 @@ AddHandler (Option *opt, DialogClass dlg, int nr) GtkWidget *shells[NrOfDialogs]; DialogClass parents[NrOfDialogs]; WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum - NULL, &wpComment, &wpTags, NULL, NULL, NULL, NULL, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph, + NULL, &wpComment, &wpTags, NULL, NULL, NULL, &wpDualBoard, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph, NULL, NULL, NULL, NULL, &wpMain }; @@ -786,7 +794,7 @@ GraphEventProc(GtkWidget *widget, GdkEvent *event, gpointer gdata) /* Get window size */ gtk_widget_get_allocation(widget, &a); w = a.width; h = a.height; -//printf("expose %dx%d @ (%d,%d)\n", w, h, a.x, a.y); +//printf("expose %dx%d @ (%d,%d): %dx%d @(%d,%d)\n", w, h, a.x, a.y, eevent->area.width, eevent->area.height, eevent->area.x, eevent->area.y); #ifdef TODO_GTK j = 0; XtSetArg(args[j], XtNwidth, &w); j++; @@ -1071,7 +1079,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent GtkWidget *box; GtkWidget *checkbutton; GtkWidget *entry; - GtkWidget *oldHbox, *hbox = NULL; + GtkWidget *oldHbox = NULL, *hbox = NULL; GtkWidget *pane = NULL; GtkWidget *button; GtkWidget *table; @@ -1086,10 +1094,10 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent GtkWidget *list; GtkWidget *graph; GtkWidget *menuButton; - GtkWidget *menuBar; + GtkWidget *menuBar = NULL; GtkWidget *menu; - int i, j, arraysize, left, top, height=999, width=1, boxStart, breakType = 0, r; + int i, j, arraysize, left, top, height=999, width=1, boxStart=0, breakType = 0, r; char def[MSG_SIZ], *msg, engineDlg = (currentCps != NULL && dlgNr != BrowserDlg); if(dlgNr < PromoDlg && shellUp[dlgNr]) return 0; // already up @@ -1097,6 +1105,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent if(dlgNr && dlgNr < PromoDlg && shells[dlgNr]) { // reusable, and used before (but popped down) gtk_widget_show(shells[dlgNr]); shellUp[dlgNr] = True; + if(wp[dlgNr]) gtk_window_move(GTK_WINDOW(shells[dlgNr]), wp[dlgNr]->x, wp[dlgNr]->y); return 0; } @@ -1110,7 +1119,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent // if(n > 50) width = 4; else if(n>24) width = 2; else width = 1; width = n / 20 + 1; height = n / width + 1; -printf("n=%d, h=%d, w=%d\n",n,height,width); +if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); // if(n && (currentOption[n-1].type == Button || currentOption[n-1].type == SaveButton)) currentOption[n].min = SAME_ROW; // OK on same line currentOption[n].type = EndMark; currentOption[n].target = NULL; // delimit list by callback-less end mark } @@ -1124,16 +1133,27 @@ printf("n=%d, h=%d, w=%d\n",n,height,width); XtCreatePopupShell(title, !top || !appData.topLevel ? transientShellWidgetClass : topLevelShellWidgetClass, shells[parent], args, i); #endif - dialog = gtk_dialog_new_with_buttons( title, - GTK_WINDOW(shells[parent]), - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR | - (modal ? GTK_DIALOG_MODAL : 0), - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - NULL ); + + if(topLevel) + { + dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dialog), title); + box = gtk_vbox_new(FALSE,0); + gtk_container_add (GTK_CONTAINER (dialog), box); + } + else + { + dialog = gtk_dialog_new_with_buttons( title, + GTK_WINDOW(shells[parent]), + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR | + (modal ? GTK_DIALOG_MODAL : 0), + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL ); + box = gtk_dialog_get_content_area( GTK_DIALOG( dialog ) ); + } shells[dlgNr] = dialog; - box = gtk_dialog_get_content_area( GTK_DIALOG( dialog ) ); // gtk_box_set_spacing(GTK_BOX(box), 5); arraysize = 0; @@ -1384,7 +1404,7 @@ printf("n=%d, h=%d, w=%d\n",n,height,width); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_OUT); if(option[i].textValue) // generic callback for double-clicking listbox item - g_signal_connect(list, "button-press-event", G_CALLBACK(ListCallback), (gpointer) (dlgNr<<16 | i) ); + g_signal_connect(list, "button-press-event", G_CALLBACK(ListCallback), (gpointer) (intptr_t) (dlgNr<<16 | i) ); /* never has label, so let listbox occupy all columns */ Pack(hbox, table, sw, left, left+r, top, GTK_EXPAND); @@ -1481,31 +1501,35 @@ printf("n=%d, h=%d, w=%d\n",n,height,width); option[i].handle = (void *) table; // remember last table in EndMark handle (for hiding Engine-Output pane). gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_NONE); + /* Show dialog */ gtk_widget_show_all( dialog ); /* hide OK/cancel buttons */ - if((option[i].min & NO_OK)) { - actionarea = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); - gtk_widget_hide(actionarea); - } else if((option[i].min & NO_CANCEL)) { - button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT); - gtk_widget_hide(button); - } - - g_signal_connect (dialog, "response", + if(!topLevel) + { + if((option[i].min & NO_OK)) { + actionarea = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); + gtk_widget_hide(actionarea); + } else if((option[i].min & NO_CANCEL)) { + button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT); + gtk_widget_hide(button); + } + g_signal_connect (dialog, "response", G_CALLBACK (GenericPopDown), (gpointer)(intptr_t) dlgNr); + } + g_signal_connect (dialog, "delete-event", G_CALLBACK (GenericPopDown), (gpointer)(intptr_t) dlgNr); shellUp[dlgNr]++; - if(dlgNr && wp[dlgNr] && wp[dlgNr]->width > 0) { // if persistent window-info available, reposition + if(dlgNr && wp[dlgNr]) { // if persistent window-info available, reposition + if(wp[dlgNr]->x > 0 && wp[dlgNr]->y > 0) gtk_window_move(GTK_WINDOW(dialog), wp[dlgNr]->x, wp[dlgNr]->y); -//printf("moved %d to (%d,%d)\n", dlgNr, wp[dlgNr]->x, wp[dlgNr]->y); + if(wp[dlgNr]->width > 0 && wp[dlgNr]->height > 0) gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height); -//printf("resized %d to %dx%d\n", dlgNr, wp[dlgNr]->width, wp[dlgNr]->height); } return 1; // tells caller he must do initialization (e.g. add specific event handlers)