Merge branch 'v4.8.x'
[xboard.git] / gtk / xboard.c
index 3588c9d..de5da12 100644 (file)
@@ -5,7 +5,8 @@
  * Massachusetts.
  *
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free
+ * Software Foundation, Inc.
  *
  * The following terms apply to Digital Equipment Corporation's copyright
  * interest in XBoard:
@@ -62,7 +63,6 @@
 #include <pwd.h>
 #include <math.h>
 #include <cairo/cairo.h>
-#include <cairo/cairo-xlib.h>
 #include <gtk/gtk.h>
 
 #if !OMIT_SOCKETS
@@ -212,11 +212,13 @@ RETSIGTYPE CmailSigHandler P((int sig));
 RETSIGTYPE IntSigHandler P((int sig));
 RETSIGTYPE TermSizeSigHandler P((int sig));
 char *InsertPxlSize P((char *pattern, int targetPxlSize));
+#ifdef TODO_GTK
 #if ENABLE_NLS
 XFontSet CreateFontSet P((char *base_fnt_lst));
 #else
 char *FindFont P((char *pattern, int targetPxlSize));
 #endif
+#endif
 void DelayedDrag P((void));
 void ICSInputBoxPopUp P((void));
 void MoveTypeInProc P((GdkEventKey *eventkey));
@@ -833,19 +835,21 @@ LoadIconFile (gchar *svgFilename)
 
 #ifdef OSXAPP
 static char clickedFile[MSG_SIZ];
-static int suppress;
+TimeMark started;
 
 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;
+    TimeMark now;
+    GetTimeMark(&now);
+    if(1000*now.sec + now.ms - 1000*started.sec - started.ms < 1000) { // received during first second
+        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;
 }
 
 GtkosxApplication *theApp;
@@ -879,33 +883,32 @@ main (int argc, char **argv)
     gtk_init (&argc, &argv);
 #ifdef OSXAPP
     {   // prepare to catch OX OpenFile signal, which will tell us the clicked file
-       char *path = gtkosx_application_get_bundle_path();
+        char *path = gtkosx_application_get_bundle_path();
 #ifdef ENABLE_NLS
-       char *res_path = gtkosx_application_get_resource_path();
-       snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
+        char *res_path = gtkosx_application_get_resource_path();
+        snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
 #endif
-       theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
-       snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
-       snprintf(dataDir, MSG_SIZ, "%s/Contents/Resources/share/xboard", path);
-       snprintf(svgDir, MSG_SIZ, "%s/themes/default", dataDir);
-       suppress = (argc == 1 || argc > 1 && argv[1][00] != '-'); // OSX sends signal even if name was already argv[1]!
-       g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL);
-       g_signal_connect(theApp, "NSApplicationWillTerminate", G_CALLBACK(ExitEvent), 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);
-       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"
-           }
-       }
+        GetTimeMark(&started); // remember start time
+        theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
+        snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
+        snprintf(dataDir, MSG_SIZ, "%s/Contents/Resources/share/xboard", path);
+        snprintf(svgDir, MSG_SIZ, "%s/themes/default", dataDir);
+        g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL);
+        g_signal_connect(theApp, "NSApplicationWillTerminate", G_CALLBACK(ExitEvent), 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);
+        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
+            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
 
@@ -1020,8 +1023,6 @@ main (int argc, char **argv)
                    programName, appData.boardSize);
            exit(2);
        }
-       if(BOARD_WIDTH > 8)
-           squareSize = (squareSize*8 + BOARD_WIDTH/2)/BOARD_WIDTH; // scale height
        if (i < 7) {
            /* Find some defaults; use the nearest known size */
            SizeDefaults *szd, *nearest;
@@ -1073,6 +1074,10 @@ main (int argc, char **argv)
        tinyLayout = szd->tinyLayout;
        // [HGM] font: use defaults from settings file if available and not overruled
     }
+    if(BOARD_WIDTH != 8) {
+       squareSize = (squareSize*8 + BOARD_WIDTH/2)/BOARD_WIDTH; // keep width the same
+       lineGap = (squareSize < 37 ? 1 : squareSize < 59 ? 2 : squareSize < 116 ? 3 : 4);
+    }
 
     defaultLineGap = lineGap;
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap;
@@ -1773,7 +1778,7 @@ void
 ModeHighlight ()
 {
     static int oldPausing = FALSE;
-    static GameMode oldmode = (GameMode) -1;
+    static GameMode oldMode = (GameMode) -1;
     char *wname;
     if (!boardWidget) return;
 
@@ -1791,7 +1796,7 @@ ModeHighlight ()
        }
     }
 
-    wname = ModeToWidgetName(oldmode);
+    wname = ModeToWidgetName(oldMode);
     if (wname != NULL) {
        MarkMenuItem(wname, False);
     }
@@ -1799,8 +1804,9 @@ ModeHighlight ()
     if (wname != NULL) {
        MarkMenuItem(wname, True);
     }
-    oldmode = gameMode;
+    if(oldMode == TwoMachinesPlay) EnableNamedMenuItem("Mode.MachineMatch", True);
     MarkMenuItem("Mode.MachineMatch", matchMode && matchGame < appData.matchGames);
+    oldMode = gameMode;
 
     /* Maybe all the enables should be handled here, not just this one */
     EnableNamedMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile);
@@ -1930,7 +1936,7 @@ void MoveTypeInProc(eventkey)
 
     buf[0]=eventkey->keyval;
     buf[1]='\0';
-    if (eventkey->keyval > 32 && eventkey->keyval < 256)
+    if (eventkey->keyval > 32 && eventkey->keyval < 256 || *buf == 27)
        ConsoleAutoPopUp (buf);
 }
 
@@ -1966,7 +1972,7 @@ ManProc ()
 {   // called from menu
 #ifdef OSXAPP
     char buf[MSG_SIZ];
-    snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
+    snprintf(buf, MSG_SIZ, "osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script \"man %s/../man/man6/xboard.6\"' -e 'end tell'", dataDir);
     system(buf);
 #else
     system("xterm -e man xboard &");
@@ -1974,6 +1980,20 @@ ManProc ()
 }
 
 void
+InfoProc ()
+{
+    char buf[MSG_SIZ];
+#ifdef OSXAPP
+    snprintf(buf, MSG_SIZ, "osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script \"info -d %s/../info -f xboard.info\"' -e 'end tell'", dataDir);
+#else
+        snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
+                 INFODIR, INFOFILE);
+#endif
+    system(buf);
+}
+
+
+void
 SetWindowTitle (char *text, char *title, char *icon)
 {
 #ifdef TODO_GTK
@@ -2321,6 +2341,12 @@ void FileNamePopUpWrapper(label, def, filter, proc, pathFlag, openMode, name, fp
 
   StartDir(filter, NULL); // change to start directory for this file type
 
+  if(def && *def && def[strlen(def)-1] == '/') {
+    getcwd(curDir, MSG_SIZ);
+    chdir(def);
+  }
+
+
   /* make a copy of the filter string, so that strtok can work with it*/
   cp = strdup(filter);