updated copyright for 2016
[xboard.git] / gtk / xboard.c
index b2c080c..c6df31a 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:
@@ -833,19 +834,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 +882,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
 
@@ -1966,7 +1968,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 +1976,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 +2337,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);