Add context menu to ICS console XB-GTK
[xboard.git] / gtk / xboard.c
index 334f92a..7abd7ce 100644 (file)
@@ -174,12 +174,13 @@ extern char *getenv();
 #  define SLASH '-'
    // redefine some defaults
 #  undef ICS_LOGON
-#  undef SYSCONFDIR
 #  undef DATADIR
+#  undef SETTINGS_FILE
 #  define ICS_LOGON "Library/Preferences/XboardICS.conf"
-#  define SYSCONFDIR "../etc"
 #  define DATADIR dataDir
-   char *dataDir; // for expanding ~~
+#  define SETTINGS_FILE masterSettings
+   char dataDir[MSG_SIZ]; // for expanding ~~
+   char masterSettings[MSG_SIZ];
 #else
 #  define SLASH '/'
 #endif
@@ -522,6 +523,12 @@ GetActualPlacement (GtkWidget *shell, WindowPlacement *wp)
 }
 
 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
@@ -532,6 +539,7 @@ GetWindowCoords ()
   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
@@ -751,7 +759,7 @@ 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;
 
@@ -776,7 +784,9 @@ main (int argc, char **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);
-       dataDir = gtkosx_application_get_bundle_path();
+       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
@@ -797,6 +807,23 @@ main (int argc, char **argv)
     }
 #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();
 
@@ -828,6 +855,8 @@ main (int argc, char **argv)
 
     { // [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);
@@ -945,7 +974,7 @@ main (int argc, char **argv)
 
     /* [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.
@@ -1099,6 +1128,11 @@ main (int argc, char **argv)
       EngineOutputPopUp();
     }
 
+    if( wpConsole.visible && appData.icsActive ) {
+      ChatProc();
+      BoardToTop();
+    }
+
     InitBackEnd2();
 
     if (errorExitStatus == -1) {
@@ -1337,7 +1371,7 @@ EnableNamedMenuItem (char *menuRef, int state)
 {
     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
@@ -1538,6 +1572,7 @@ DragProc ()
            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);
@@ -1787,7 +1822,9 @@ void
 ManProc ()
 {   // called from menu
 #ifdef __APPLE__
-    system("%s ./man.command", appData.sysOpen);
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
+    system(buf);
 #else
     system("xterm -e man xboard &");
 #endif