Allow engine to force popup of its settings dialog
[xboard.git] / gtk / xoptions.c
index 5c35c8e..3df99a7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * xoptions.c -- Move list window, part of X front end for XBoard
  *
- * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
  * ------------------------------------------------------------------------
  *
  * GNU XBoard is free software: you can redistribute it and/or modify
@@ -51,8 +51,8 @@ extern char *getenv();
 #include <cairo/cairo-xlib.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
-#ifdef __APPLE__
-#  include <gtkmacintegration/gtkosxapplication.h>
+#ifdef OSXAPP
+#  include <gtkmacintegration-gtk2/gtkosxapplication.h>
 #endif
 
 #include "common.h"
@@ -244,6 +244,12 @@ SetWidgetLabel (Option *opt, char *buf)
 }
 
 void
+SetComboChoice (Option *opt, int n)
+{
+    gtk_combo_box_set_active(opt->handle, n);
+}
+
+void
 SetDialogTitle (DialogClass dlg, char *title)
 {
     gtk_window_set_title(GTK_WINDOW(shells[dlg]), title);
@@ -425,7 +431,7 @@ CreateMenuPopup (Option *opt, int n, int def)
       {
        char *msg = mb[i].string;
        if(!msg) break;
-#ifdef __APPLE__
+#ifdef OSXAPP
        if(!strcmp(msg, "Quit ")) continue;             // Quit item will appear automatically in App menu
        if(!strcmp(msg, "About XBoard")) msg = "About"; // 'XBoard' will be appended automatically when moved to App menu 1st item
 #endif
@@ -443,7 +449,7 @@ CreateMenuPopup (Option *opt, int n, int def)
            GdkModifierType accelerator_mods;
 
            gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods);
-#ifdef __APPLE__
+#ifdef OSXAPP
            if(accelerator_mods & GDK_CONTROL_MASK) {  // in OSX use Meta where Linux uses Ctrl
                accelerator_mods &= ~GDK_CONTROL_MASK; // clear Ctrl flag
                accelerator_mods |= GDK_META_MASK;     // set Meta flag
@@ -502,6 +508,8 @@ TypeInProc (GtkWidget *widget, GdkEventKey *event, gpointer gdata)
     shiftState = event->state & GDK_SHIFT_MASK;
     controlState = event->state & GDK_CONTROL_MASK;
     switch(event->keyval) {
+      case 'e':       return (controlState && IcsHist( 5, opt, dlg));
+      case 'h':       return (controlState && IcsHist( 8, opt, dlg));
       case 'n':       return (controlState && IcsHist(14, opt, dlg));
       case 'o':       return (controlState && IcsHist(15, opt, dlg));
       case GDK_Tab:   IcsHist(10, opt, dlg); break;
@@ -528,11 +536,11 @@ HighlightText (Option *opt, int from, int to, Boolean highlight)
     if(!(opt->min & INIT)) {
        opt->min |= INIT; // each memo its own init flag!
        gtk_text_buffer_create_tag(opt->handle, "highlight", "background", "yellow", NULL);
-       gtk_text_buffer_create_tag(opt->handle, "normal", "background", "white", NULL);
     }
     gtk_text_buffer_get_iter_at_offset(opt->handle, &start, from);
     gtk_text_buffer_get_iter_at_offset(opt->handle, &end, to);
-    gtk_text_buffer_apply_tag_by_name(opt->handle, highlight ? "highlight" : "normal", &start, &end);
+    if(highlight) gtk_text_buffer_apply_tag_by_name(opt->handle, "highlight", &start, &end);
+    else gtk_text_buffer_remove_tag_by_name(opt->handle, "highlight", &start, &end);
 }
 
 static char **names;
@@ -1016,7 +1024,9 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata)
     gtkfilter     = gtk_file_filter_new();
     gtkfilter_all = gtk_file_filter_new();
 
-    char fileext[MSG_SIZ];
+    char fileext[MSG_SIZ], *filter = currentOption[opt_i].textValue;
+
+    StartDir(filter, NULL); // change to start directory for this file type
 
     /* select file or folder depending on option_type */
     if (currentOption[opt_i].type == PathName)
@@ -1060,9 +1070,10 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata)
         filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
         entry = currentOption[opt_i].handle;
         gtk_entry_set_text (GTK_ENTRY (entry), filename);
+       StartDir(filter, filename); // back to original, and remember this one
         g_free (filename);
-
       }
+    else StartDir(filter, ""); // change back to original directory
     gtk_widget_destroy (dialog);
     dialog = NULL;
 }
@@ -1430,7 +1441,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
                g_signal_connect(label, "button-press-event", G_CALLBACK(MemoEvent), (gpointer) &option[i]);
                gtk_widget_set_sensitive(label, TRUE);
            }
-            Pack(hbox, table, label, left, left+2, top, 0);
+            Pack(hbox, table, label, left, left+r, top, 0);
            break;
           case SaveButton:
           case Button:
@@ -1529,7 +1540,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
            break;
          case Graph:
            option[i].handle = (void*) (graph = gtk_drawing_area_new());
-//            gtk_widget_set_size_request(graph, option[i].max, option[i].value);
+            gtk_widget_set_size_request(graph, option[i].max, option[i].value);
            if(0){ GtkAllocation a;
                a.x = 0; a.y = 0; a.width = option[i].max, a.height = option[i].value;
                gtk_widget_set_allocation(graph, &a);
@@ -1562,13 +1573,17 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
          case DropDown:
            top--;
            msg = _(option[i].name); // write name on the menu button
-#ifndef __APPLE__
-           if(tinyLayout) { strcpy(def, msg); def[tinyLayout] = NULLCHAR; msg = def; } // clip menu text to keep menu bar small
+#ifndef OSXAPP
+           if(tinyLayout) { // clip menu text to keep menu bar small
+               int clip = tinyLayout + 1;
+               strcpy(def, msg + (msg[clip-1] == '_'));
+               def[clip] = NULLCHAR; msg = def;
+           }
 #endif
 //         XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name));  j++;
 //         XtSetArg(args[j], XtNlabel, msg);  j++;
            option[i].handle = (void*)
-               (menuButton = gtk_menu_item_new_with_label(msg));
+               (menuButton = gtk_menu_item_new_with_mnemonic(msg));
            gtk_widget_show(menuButton);
            option[i].textValue = (char*) (menu = CreateMenuPopup(option + i, i + 256*dlgNr, -1));
            gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuButton), menu);
@@ -1590,7 +1605,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
            break;
          case BarEnd:
            top--;
-#ifndef __APPLE__
+#ifndef OSXAPP
             gtk_table_attach(GTK_TABLE(table), menuBar, left, left+r, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1);
 
            if(option[i].target) ((ButtonCallback*)option[i].target)(boxStart); // callback that can make sizing decisions
@@ -1627,6 +1642,11 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
     }
 
     gtk_table_resize(GTK_TABLE(table), top+1, r);
+    if(dlgNr == BoardWindow && appData.fixedSize) { // inhibit sizing
+       GtkWidget *h = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (h), table, TRUE, FALSE, 2);
+       table = h;
+    }
     if(pane)
        gtk_box_pack_start (GTK_BOX (pane), table, expandable, TRUE, 0);
     else
@@ -1666,6 +1686,9 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
        gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height);
     }
 
+    for(i=0; option[i].type != EndMark; i++) if(option[i].type == Graph)
+       gtk_widget_set_size_request(option[i].handle, -1, -1); // remove size requests after realization, so user can shrink
+
     return 1; // tells caller he must do initialization (e.g. add specific event handlers)
 }