Allow popup of TC and Common Engine from Tournament dialog
[xboard.git] / gtk / xoptions.c
index 0eb64ff..68eb638 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 Free Software Foundation, Inc.
+ * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 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 OSX
-#  include "gtkmacintegration/gtkosxapplication.h"
+#ifdef __APPLE__
+#  include <gtkmacintegration/gtkosxapplication.h>
 #endif
 
 #include "common.h"
@@ -428,7 +428,7 @@ CreateMenuPopup (Option *opt, int n, int def)
       {
        char *msg = mb[i].string;
        if(!msg) break;
-#ifdef OSX
+#ifdef __APPLE__
        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
@@ -445,11 +445,11 @@ CreateMenuPopup (Option *opt, int n, int def)
            GdkModifierType accelerator_mods;
 
            gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods);
-#ifdef OSX
+#ifdef __APPLE__
            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
-           } 
+           }
 #endif
            gtk_widget_add_accelerator (GTK_WIDGET(entry), "activate",GtkAccelerators,
                                        accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE);
@@ -739,7 +739,8 @@ gboolean GenericPopDown(w, resptype, gdata)
 // I guess BrowserDlg will be abandoned, as GTK has a better browser of its own
     if(shellUp[BrowserDlg] && dlg != BrowserDlg || dialogError) return True; // prevent closing dialog when it has an open file-browse daughter
 #else
-    if(browserUp || dialogError && dlg != FatalDlg) return True; // prevent closing dialog when it has an open file-browse or error-popup daughter
+    if(browserUp || dialogError && dlg != FatalDlg || dlg == MasterDlg && shellUp[TransientDlg])
+       return True; // prevent closing dialog when it has an open file-browse, transient or error-popup daughter
 #endif
     shells[dlg] = w; // make sure we pop down the right one in case of multiple instances
 
@@ -944,7 +945,7 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata)
     gtkfilter     = gtk_file_filter_new();
     gtkfilter_all = gtk_file_filter_new();
 
-    char fileext[10] = "*";
+    char fileext[MSG_SIZ];
 
     /* select file or folder depending on option_type */
     if (currentOption[opt_i].type == PathName)
@@ -965,11 +966,16 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata)
     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),gtkfilter_all);
 
     /* filter for specific filetypes e.g. pgn or fen */
-    if (currentOption[opt_i].textValue != NULL && (strcmp(currentOption[opt_i].textValue, "") != 0) )
+    if (currentOption[opt_i].textValue != NULL)
       {
-        strcat(fileext, currentOption[opt_i].textValue);
-        gtk_file_filter_add_pattern(gtkfilter, fileext);
-        gtk_file_filter_set_name (gtkfilter, currentOption[opt_i].textValue);
+        char *q, *p = currentOption[opt_i].textValue;
+        gtk_file_filter_set_name (gtkfilter, p);
+        while(*p) {
+          snprintf(fileext, MSG_SIZ, "*%s", p);
+          while(*p) if(*p++ == ' ')  break;
+          for(q=fileext; *q; q++) if(*q == ' ') { *q = NULLCHAR; break; }
+          gtk_file_filter_add_pattern(gtkfilter, fileext);
+        }
         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog),gtkfilter);
         /* activate filter */
         gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog),gtkfilter);
@@ -1133,6 +1139,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent
        if(wp[dlgNr]) gtk_window_move(GTK_WINDOW(shells[dlgNr]), wp[dlgNr]->x, wp[dlgNr]->y);
         return 0;
     }
+    if(dlgNr == TransientDlg && parent == BoardWindow && shellUp[MasterDlg]) parent = MasterDlg; // MasterDlg can always take role of main window
 
     dialogOptions[dlgNr] = option; // make available to callback
     // post currentOption globally, so Spin and Combo callbacks can already use it
@@ -1493,7 +1500,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
            break;
          case BarEnd:
            top--;
-#ifndef OSX
+#ifndef __APPLE__
             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
@@ -1506,7 +1513,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
                gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menuBar));
                gtkosx_application_insert_app_menu_item(theApp, GTK_MENU_ITEM(helpMenu[8].handle), 0); // hack
                gtkosx_application_sync_menubar(theApp);
-           } 
+           }
 #endif
            break;
          case BoxEnd: