X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxoptions.c;h=0737c79bac2555db319008327d9bf21dbcb9f75c;hb=af3d528cf16eae800ff7f0b8b62f77ced7493412;hp=bcc529369dadfa8289c8b86b85412ab420637d70;hpb=acc20410790b81b01914ba3e66d10114ac9ab012;p=xboard.git diff --git a/gtk/xoptions.c b/gtk/xoptions.c index bcc5293..0737c79 100644 --- a/gtk/xoptions.c +++ b/gtk/xoptions.c @@ -1,7 +1,7 @@ /* * xoptions.c -- Move list window, part of X front end for XBoard * - * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc. + * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -683,10 +683,10 @@ MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) } if(memo->value == 250 // kludge to recognize ICS Console and Chat panes && gtk_text_buffer_get_selection_bounds(memo->handle, NULL, NULL) ) { -printf("*** selected\n"); gtk_text_buffer_get_selection_bounds(memo->handle, &start, &end); // only return selected text - index = -1; // kludge to indicate omething was selected + index = -1; // kludge to indicate something was selected } else { + if(abs(button) == 3 && gtk_text_buffer_get_selection_bounds(memo->handle, NULL, NULL)) return FALSE; // normal context menu // GTK_TODO: is this really the most efficient way to get the character at the mouse cursor??? gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_WIDGET, w, h, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &start, x, y); @@ -699,7 +699,7 @@ printf("*** selected\n"); } /* get text from textbuffer */ val = gtk_text_buffer_get_text (memo->handle, &start, &end, FALSE); - break; + if(strlen(val) != index) break; // if we clicked behind all text, fall through to do default action default: return FALSE; // should not happen } @@ -845,6 +845,16 @@ gboolean GenericPopDown(w, resptype, gdata) return TRUE; } +gboolean PopDownProxy(w, gdata) + GtkWidget *w; + gpointer gdata; +{ + GtkResponseType resp = GTK_RESPONSE_ACCEPT; + int dlg = (intptr_t) gdata; + if(dlg >= 3000) dlg -= 3000, resp = GTK_RESPONSE_REJECT; + return GenericPopDown(gtk_widget_get_toplevel(w), resp, (gpointer)(intptr_t)dlg); +} + int AppendText(Option *opt, char *s) { char *v; @@ -1312,7 +1322,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); top = breakType = 0; expandable = FALSE; } if(!SameRow(&option[i])) { - if(SameRow(&option[i+1])) { + if(SameRow(&option[i+1]) || topLevel && option[i].type == Button && option[i+1].type == EndMark && option[i+1].min & SAME_ROW) { GtkAttachOptions x = GTK_FILL; // make sure hbox is always available when we have more options on same row hbox = gtk_hbox_new (option[i].type == Button && option[i].textValue || option[i].type == Graph, 0); @@ -1656,6 +1666,21 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); } } + if(topLevel && !(option[i].min & NO_OK)) { // buttons requested in top-level window + button = gtk_button_new_with_label (_("OK")); + g_signal_connect (button, "clicked", G_CALLBACK (PopDownProxy), (gpointer)(intptr_t) dlgNr); + if(!(option[i].min & NO_CANCEL)) { + GtkWidget *button2 = gtk_button_new_with_label (_("Cancel")); + g_signal_connect (button2, "clicked", G_CALLBACK (PopDownProxy), (gpointer)(intptr_t) dlgNr + 3000); + if(!hbox) { + hbox = gtk_hbox_new (False, 0); + gtk_table_attach(GTK_TABLE(table), hbox, left, left+r, top+1, top+2, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1); + } + Pack(hbox, table, button, left, left+1, top+1, 0); + Pack(hbox, table, button2, left, left+1, top+1, 0); + } else Pack(hbox, table, button, left, left+1, ++top, 0); + } + gtk_table_resize(GTK_TABLE(table), top+1, r); if(dlgNr == BoardWindow && appData.fixedSize) { // inhibit sizing GtkWidget *h = gtk_hbox_new(FALSE, 0);