/*
* 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
#include <cairo/cairo-xlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#ifdef __APPLE__
+# include <gtkmacintegration/gtkosxapplication.h>
+#endif
#include "common.h"
#include "backend.h"
{
char *msg = mb[i].string;
if(!msg) break;
+#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
if(strcmp(msg, "----")) { //
if(!(opt->min & NO_GETTEXT)) msg = _(msg);
if(mb[i].handle) {
GdkModifierType accelerator_mods;
gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods);
+#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);
- };
- gtk_widget_show(entry);
+ }
} else entry = gtk_separator_menu_item_new();
+ gtk_widget_show(entry);
gtk_menu_append(GTK_MENU (menu), entry);
//CreateMenuItem(menu, opt->min & NO_GETTEXT ? msg : _(msg), (XtCallbackProc) ComboSelect, (n<<16)+i);
mb[i].handle = (void*) entry; // save item ID, for enabling / checkmarking
// 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
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)
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);
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
break;
case BarEnd:
top--;
+#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
+#else
+ top--; // in OSX menu bar is not put in window, so also don't count it
+ { // in stead, offer it to OSX, and move About item to top of App menu
+ GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
+ extern MenuItem helpMenu[]; // oh, well... Adding items in help menu breaks this anyway
+ gtk_widget_hide (menuBar);
+ 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:
// XtManageChildren(&form, 1);