/*
* 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
// to give drawing routines opportunity to use it before first expose event
// (which are only processed when main gets to the event loop, so after all init!)
// so only change when size is no longer good
+ cairo_t *cr;
if(graph->choice) cairo_surface_destroy((cairo_surface_t *) graph->choice);
graph->choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+ // paint white, to prevent weirdness when people maximize window and drag pieces over space next to board
+ cr = cairo_create ((cairo_surface_t *) graph->choice);
+ cairo_rectangle (cr, 0, 0, w, h);
+ cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
+ cairo_fill(cr);
+ cairo_destroy (cr);
break;
}
w = eevent->area.width;
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(option[i].textValue) {
gdk_color_parse( option[i].textValue, &color );
gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color );
- gtk_widget_set_sensitive(button, appData.noChessProgram || option[i].value < 0
- || strstr(first.variants, VariantName(option[i].value)));
+ gtk_widget_set_sensitive(button, option[i].value >= 0 && (appData.noChessProgram
+ || strstr(first.variants, VariantName(option[i].value))));
}
Pack(hbox, table, button, left, left+1, top, 0);
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);