* Massachusetts.
*
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
*
* The following terms apply to Digital Equipment Corporation's copyright
* interest in XBoard:
#include "gettext.h"
#include "draw.h"
+#ifdef __APPLE__
+# include <gtkmacintegration/gtkosxapplication.h>
+ // prevent pathname of positional file argument provided by OS X being be mistaken for option name
+ // (price is that we won't recognize Windows option format anymore).
+# define SLASH '-'
+ // redefine some defaults
+# undef ICS_LOGON
+# undef DATADIR
+# undef SETTINGS_FILE
+# define ICS_LOGON "Library/Preferences/XboardICS.conf"
+# define DATADIR dataDir
+# define SETTINGS_FILE masterSettings
+ char dataDir[MSG_SIZ]; // for expanding ~~
+ char masterSettings[MSG_SIZ];
+#else
+# define SLASH '/'
+#endif
#ifdef __EMX__
#ifndef HAVE_USLEEP
}
void
+GetPlacement (DialogClass dlg, WindowPlacement *wp)
+{ // wrapper to shield back-end from widget type
+ if(shellUp[dlg]) GetActualPlacement(shells[dlg], wp);
+}
+
+void
GetWindowCoords ()
{ // wrapper to shield use of window handles from back-end (make addressible by number?)
// In XBoard this will have to wait until awareness of window parameters is implemented
if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList);
if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment);
if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags);
+ GetPlacement(ChatDlg, &wpConsole); if(appData.icsActive) wpConsole.visible = shellUp[ChatDlg];
}
void
case ArgTwo:
case ArgNone:
case ArgCommSettings:
+ default:
break;
}
return p;
gtk_window_resize(GTK_WINDOW(shells[DummyDlg]), slaveW + opt->max, slaveH + opt->value);
}
+#ifdef __APPLE__
+static char clickedFile[MSG_SIZ];
+static int suppress;
+
+static gboolean
+StartNewXBoard(GtkosxApplication *app, gchar *path, gpointer user_data)
+{ // handler of OSX OpenFile signal, which sends us the filename of clicked file or first argument
+ if(suppress) { // we just started XBoard without arguments
+ strncpy(clickedFile, path, MSG_SIZ); // remember file name, but otherwise ignore
+ } else { // we are running something presumably useful
+ char buf[MSG_SIZ];
+ snprintf(buf, MSG_SIZ, "open -n -a \"xboard\" --args \"%s\"", path);
+ system(buf); // start new instance on this file
+ }
+ return TRUE;
+}
+#endif
+
int
main (int argc, char **argv)
{
int i, clockFontPxlSize, coordFontPxlSize, fontPxlSize;
- int boardWidth, boardHeight, w, h;
+ int boardWidth, w, h; //, boardHeight;
char *p;
int forceMono = False;
/* set up GTK */
gtk_init (&argc, &argv);
+#ifdef __APPLE__
+ { // prepare to catch OX OpenFile signal, which will tell us the clicked file
+ GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
+ char *path = gtkosx_application_get_bundle_path();
+ strncpy(dataDir, path, MSG_SIZ);
+ snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
+ g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL);
+ // we must call application ready before we can get the signal,
+ // and supply a (dummy) menu bar before that, to avoid problems with dual apples in it
+ gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(gtk_menu_bar_new()));
+ gtkosx_application_ready(theApp);
+ suppress = (argc == 1 || argc > 1 && argv[1][00] != '-'); // OSX sends signal even if name was already argv[1]!
+ if(argc == 1) { // called without args: OSX open-file signal might follow
+ static char *fakeArgv[3] = {NULL, clickedFile, NULL};
+ usleep(10000); // wait 10 msec (and hope this is long enough).
+ while(gtk_events_pending())
+ gtk_main_iteration(); // process all events that came in upto now
+ suppress = 0; // future open-file signals should start new instance
+ if(clickedFile[0]) { // we were sent an open-file signal with filename!
+ fakeArgv[0] = argv[0];
+ argc = 2; argv = fakeArgv; // fake that we were called as "xboard filename"
+ }
+ }
+ }
+#endif
+
+ if(argc > 1 && !strcmp(argv[1], "--show-config")) { // [HGM] install: called to print config info
+ typedef struct {char *name, *value; } Config;
+ static Config configList[] = {
+ { "Datadir", DATADIR },
+ { "Sysconfdir", SYSCONFDIR },
+ { NULL }
+ };
+ int i;
+
+ for(i=0; configList[i].name; i++) {
+ if(argc > 2 && strcmp(argv[2], configList[i].name)) continue;
+ if(argc > 2) printf("%s", configList[i].value);
+ else printf("%-12s: %s\n", configList[i].name, configList[i].value);
+ }
+ exit(0);
+ }
/* set up keyboard accelerators group */
GtkAccelerators = gtk_accel_group_new();
{ // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string.
static char buf[MSG_SIZ];
+ snprintf(buf, MSG_SIZ, appData.sysOpen, DATADIR);
+ ASSIGN(appData.sysOpen, buf); // expand %s in -openCommand to DATADIR (usefull for OS X configuring)
EscapeExpand(buf, appData.firstInitString);
appData.firstInitString = strdup(buf);
EscapeExpand(buf, appData.secondInitString);
/* [HR] height treated separately (hacked) */
boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
- boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+// boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
/*
* Determine what fonts to use.
EngineOutputPopUp();
}
+ if( wpConsole.visible && appData.icsActive ) {
+ ChatProc();
+ BoardToTop();
+ }
+
InitBackEnd2();
if (errorExitStatus == -1) {
{
MenuItem *item = MenuNameToItem(menuRef);
- if(item) gtk_widget_set_sensitive(item->handle, state);
+ if(item && item->handle) gtk_widget_set_sensitive(item->handle, state);
}
void
if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory);
if(shellUp[EvalGraphDlg]) CoDrag(shells[EvalGraphDlg], &wpEvalGraph);
if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList);
+ if(shellUp[ChatDlg]) CoDrag(shells[ChatDlg], &wpConsole);
}
wpMain = wpNew;
DrawPosition(True, NULL);
{
char buf[10];
- // ingnore if ctrl or alt is pressed
- if (eventkey->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) {
+ // ingnore if ctrl, alt, or meta is pressed
+ if (eventkey->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_META_MASK)) {
return;
}
buf[0]=eventkey->keyval;
buf[1]='\0';
if (eventkey->keyval > 32 && eventkey->keyval < 256)
- BoxAutoPopUp (buf);
+ ConsoleAutoPopUp (buf);
}
#ifdef TODO_GTK
ForwardEvent();
TempBackwardActive = False;
}
-
-void
-ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{ // called as key binding
- char buf[MSG_SIZ];
- String name;
- if (nprms && *nprms > 0)
- name = prms[0];
- else
- name = "xboard";
- snprintf(buf, sizeof(buf), "xterm -e man %s &", name);
- system(buf);
-}
#endif
void
ManProc ()
{ // called from menu
-#ifdef TODO_GTK
- ManInner(NULL, NULL, NULL, NULL);
+#ifdef __APPLE__
+ char buf[MSG_SIZ];
+ snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
+ system(buf);
+#else
+ system("xterm -e man xboard &");
#endif
}
char *cp;
/* make a copy of the filter string, so that strtok can work with it*/
- cp = strndup(filter,strlen(filter));
+ cp = strdup(filter);
/* add filters for file extensions */
gtkfilter = gtk_file_filter_new();