Let GTK dialogs open with actual-size Graph widgets
[xboard.git] / gtk / xboard.c
index 68d8757..f02762e 100644 (file)
@@ -167,7 +167,7 @@ extern char *getenv();
 #include "gettext.h"
 #include "draw.h"
 
-#ifdef __APPLE__
+#ifdef OSXAPP
 #  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).
@@ -226,6 +226,7 @@ void DisplayMove P((int moveNumber));
 void update_ics_width P(());
 int CopyMemoProc P(());
 static gboolean EventProc P((GtkWidget *widget, GdkEvent *event, gpointer g));
+static int FindLogo P((char *place, char *name, char *buf));
 
 #ifdef TODO_GTK
 #if ENABLE_NLS
@@ -649,9 +650,11 @@ ResizeBoardWindow (int w, int h, int inhibit)
     gtk_widget_get_allocation(shellWidget, &a);
     marginW = a.width - bw;
     gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
+    gtk_widget_set_size_request(optList[W_BOARD].handle, w, h);   // protect board widget
     w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
     h += marginH + a.height + 1;
     gtk_window_resize(GTK_WINDOW(shellWidget), w, h);
+    gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board again
 }
 
 int
@@ -827,7 +830,7 @@ LoadIconFile (gchar *svgFilename)
     return gdk_pixbuf_new_from_file(buf, NULL);
 }
 
-#ifdef __APPLE__
+#ifdef OSXAPP
 static char clickedFile[MSG_SIZ];
 static int suppress;
 
@@ -873,7 +876,7 @@ main (int argc, char **argv)
 
     /* set up GTK */
     gtk_init (&argc, &argv);
-#ifdef __APPLE__
+#ifdef OSXAPP
     {   // prepare to catch OX OpenFile signal, which will tell us the clicked file
        char *path = gtkosx_application_get_bundle_path();
 #ifdef ENABLE_NLS
@@ -881,9 +884,9 @@ main (int argc, char **argv)
        snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
 #endif
        theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
-       strncpy(dataDir, path, MSG_SIZ);
        snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
-       snprintf(svgDir, MSG_SIZ, "%s/Contents/Resources/share/xboard/themes/default", 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);
        // we must call application ready before we can get the signal,
@@ -1111,6 +1114,7 @@ main (int argc, char **argv)
        layoutName = "normalLayout";
     }
 
+    if(appData.logoSize) appData.logoSize = boardWidth/4-3;
     wpMain.width = -1; // prevent popup sizes window
     optList = BoardPopUp(squareSize, lineGap, (void*)
 #ifdef TODO_GTK
@@ -1200,8 +1204,10 @@ main (int argc, char **argv)
 
     if(appData.logoSize)
     {   // locate and read user logo
-       char buf[MSG_SIZ];
-       snprintf(buf, MSG_SIZ, "%s/%s.png", appData.logoDir, UserName());
+       char buf[MSG_SIZ], name[MSG_SIZ];
+       snprintf(name, MSG_SIZ, "/home/%s", UserName());
+       if(!FindLogo(name, ".logo", buf))
+           FindLogo(appData.logoDir, name + 6, buf);
        ASSIGN(userLogo, buf);
     }
 
@@ -1947,7 +1953,7 @@ TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 void
 ManProc ()
 {   // called from menu
-#ifdef __APPLE__
+#ifdef OSXAPP
     char buf[MSG_SIZ];
     snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
     system(buf);
@@ -2060,7 +2066,7 @@ SetClockIcon (int color)
     GdkPixbuf *pm = *clockIcons[color];
     if (mainwindowIcon != pm) {
         mainwindowIcon = pm;
-#ifdef __APPLE__
+#ifdef OSXAPP
         gtkosx_application_set_dock_icon_pixbuf(theApp, mainwindowIcon);
 #else
         gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon);
@@ -2240,24 +2246,33 @@ FrameDelay (int time)
 
 #endif
 
+static int
+FindLogo (char *place, char *name, char *buf)
+{   // check if file exists in given place
+    FILE *f;
+    if(!place) return 0;
+    snprintf(buf, MSG_SIZ, "%s/%s.png", place, name);
+    if(*place && strcmp(place, ".") && (f = fopen(buf, "r")) ) {
+       fclose(f);
+       return 1;
+    }
+    return 0;
+}
+
 static void
 LoadLogo (ChessProgramState *cps, int n, Boolean ics)
 {
     char buf[MSG_SIZ], *logoName = buf;
-    FILE *f;
     if(appData.logo[n][0]) {
        logoName = appData.logo[n];
     } else if(appData.autoLogo) {
        if(ics) { // [HGM] logo: in ICS mode second can be used for ICS
            sprintf(buf, "%s/%s.png", appData.logoDir, appData.icsHost);
-       } else { // engine; look in engine-dir (if any) first
-           snprintf(buf, MSG_SIZ, "%s/logo.png", appData.directory[n]);
-           if(appData.directory[n] && appData.directory[n][0]
-              && strcmp(appData.directory[n], ".") && (f = fopen(buf, "r")) )
-               fclose(f);
-           else // no engine dir or no logo.png in it: look in logo dir
-           if(appData.logoDir && appData.logoDir[0])
-               sprintf(buf, "%s/%s.png", appData.logoDir, cps->tidy);
+       } else { // engine; cascade
+           if(!FindLogo(appData.logoDir, cps->tidy, buf) &&   // first try user log folder
+              !FindLogo(appData.directory[n], "logo", buf) && // then engine directory
+              !FindLogo("/usr/local/share/games/plugins/logos", cps->tidy, buf) ) // then system folders
+               FindLogo("/usr/share/games/plugins/logos", cps->tidy, buf);
        }
     }
     if(logoName[0])