X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxboard.c;h=40e41c80ae1837043d7f79bfc1667f5a8aabfb3a;hb=0e604fd62231e9375a446a4891efa1ede735f4d2;hp=d6f47d7ff7a5fe7fa02b29b587cb573b5986926a;hpb=5ac80d2f3c2a7720f3095a8e4145b1780494dfd2;p=xboard.git diff --git a/gtk/xboard.c b/gtk/xboard.c index d6f47d7..40e41c8 100644 --- a/gtk/xboard.c +++ b/gtk/xboard.c @@ -172,6 +172,7 @@ extern char *getenv(); // 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 '-' +# define IMG ".png" // redefine some defaults # undef ICS_LOGON # undef DATADIR @@ -179,10 +180,13 @@ extern char *getenv(); # define ICS_LOGON "Library/Preferences/XboardICS.conf" # define DATADIR dataDir # define SETTINGS_FILE masterSettings +# define SYNC_MENUBAR gtkosx_application_sync_menubar(theApp) char dataDir[MSG_SIZ]; // for expanding ~~ char masterSettings[MSG_SIZ]; #else # define SLASH '/' +# define IMG ".svg" +# define SYNC_MENUBAR #endif #ifdef __EMX__ @@ -401,6 +405,21 @@ ParseFont (char *name, int number) case 2: // COORD_FONT appData.coordFont = strdup(name); break; + case CONSOLE_FONT: + appData.icsFont = strdup(name); + break; + case EDITTAGS_FONT: + appData.tagsFont = strdup(name); + break; + case COMMENT_FONT: + appData.commentFont = strdup(name); + break; + case MOVEHISTORY_FONT: + appData.historyFont = strdup(name); + break; + case GAMELIST_FONT: + appData.gameListFont = strdup(name); + break; default: return; } @@ -410,9 +429,14 @@ ParseFont (char *name, int number) void SetFontDefaults () { // only 2 fonts currently - appData.clockFont = CLOCK_FONT_NAME; - appData.coordFont = COORD_FONT_NAME; - appData.font = DEFAULT_FONT_NAME; + appData.clockFont = strdup(CLOCK_FONT_NAME); + appData.coordFont = strdup(COORD_FONT_NAME); + appData.font = strdup(DEFAULT_FONT_NAME); + appData.icsFont = strdup(CONSOLE_FONT_NAME); + appData.tagsFont = strdup(TAGS_FONT_NAME); + appData.commentFont = strdup(COMMENT_FONT_NAME); + appData.historyFont = strdup(HISTORY_FONT_NAME); + appData.gameListFont = strdup(GAMELIST_FONT_NAME); } void @@ -423,7 +447,7 @@ CreateFonts () void ParseColor (int n, char *name) { // in XBoard, just copy the color-name string - if(colorVariable[n]) *(char**)colorVariable[n] = strdup(name); + if(colorVariable[n] && *name == '#') *(char**)colorVariable[n] = strdup(name); } char * @@ -470,6 +494,21 @@ SaveFontArg (FILE *f, ArgDescriptor *ad) case 2: // COORD_FONT name = appData.coordFont; break; + case CONSOLE_FONT: + name = appData.icsFont; + break; + case EDITTAGS_FONT: + name = appData.tagsFont; + break; + case COMMENT_FONT: + name = appData.commentFont; + break; + case MOVEHISTORY_FONT: + name = appData.historyFont; + break; + case GAMELIST_FONT: + name = appData.gameListFont; + break; default: return; } @@ -623,10 +662,25 @@ InitializeFonts (int clockFontPxlSize, int coordFontPxlSize, int fontPxlSize) appData.font = fontTable[MESSAGE_FONT][squareSize]; if(!fontIsSet[COORD_FONT] && fontValid[COORD_FONT][squareSize]) appData.coordFont = fontTable[COORD_FONT][squareSize]; - - appData.font = InsertPxlSize(appData.font, fontPxlSize); + if(!fontIsSet[CONSOLE_FONT] && fontValid[CONSOLE_FONT][squareSize]) + appData.icsFont = fontTable[CONSOLE_FONT][squareSize]; + if(!fontIsSet[EDITTAGS_FONT] && fontValid[EDITTAGS_FONT][squareSize]) + appData.tagsFont = fontTable[EDITTAGS_FONT][squareSize]; + if(!fontIsSet[COMMENT_FONT] && fontValid[COMMENT_FONT][squareSize]) + appData.commentFont = fontTable[COMMENT_FONT][squareSize]; + if(!fontIsSet[MOVEHISTORY_FONT] && fontValid[MOVEHISTORY_FONT][squareSize]) + appData.historyFont = fontTable[MOVEHISTORY_FONT][squareSize]; + if(!fontIsSet[GAMELIST_FONT] && fontValid[GAMELIST_FONT][squareSize]) + appData.gameListFont = fontTable[GAMELIST_FONT][squareSize]; + + appData.font = InsertPxlSize(appData.font, coordFontPxlSize); appData.clockFont = InsertPxlSize(appData.clockFont, clockFontPxlSize); appData.coordFont = InsertPxlSize(appData.coordFont, coordFontPxlSize); + appData.icsFont = InsertPxlSize(appData.icsFont, coordFontPxlSize); + appData.tagsFont = InsertPxlSize(appData.tagsFont, coordFontPxlSize); + appData.commentFont = InsertPxlSize(appData.commentFont, coordFontPxlSize); + appData.historyFont = InsertPxlSize(appData.historyFont, coordFontPxlSize); + appData.gameListFont = InsertPxlSize(appData.gameListFont, coordFontPxlSize); #ifdef TODO_GTK XrmValue vTo; @@ -756,6 +810,15 @@ SlaveResize (Option *opt) gtk_window_resize(GTK_WINDOW(shells[DummyDlg]), slaveW + opt->max, slaveH + opt->value); } +GdkPixbuf * +LoadIconFile (gchar *svgFilename) +{ + char buf[MSG_SIZ]; + + snprintf(buf, MSG_SIZ, "%s/%s" IMG, svgDir, svgFilename); + return gdk_pixbuf_new_from_file(buf, NULL); +} + #ifdef __APPLE__ static char clickedFile[MSG_SIZ]; static int suppress; @@ -772,6 +835,8 @@ StartNewXBoard(GtkosxApplication *app, gchar *path, gpointer user_data) } return TRUE; } + +GtkosxApplication *theApp; #endif int @@ -802,16 +867,17 @@ main (int argc, char **argv) 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(); + 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); + 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, // 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). @@ -1073,10 +1139,9 @@ main (int argc, char **argv) /* * Create an icon. (Use two icons, to indicate whther it is white's or black's turn.) */ - WhiteIcon = gdk_pixbuf_new_from_file(SVGDIR "/icon_white.svg", NULL); - BlackIcon = gdk_pixbuf_new_from_file(SVGDIR "/icon_black.svg", NULL); - mainwindowIcon = WhiteIcon; - gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon); + WhiteIcon = LoadIconFile("icon_white"); + BlackIcon = LoadIconFile("icon_black"); + SetClockIcon(0); // sets white icon /* @@ -1117,7 +1182,7 @@ main (int argc, char **argv) marginH = h - a.height - hc; // subtract current clock height, so it can be added back dynamically } - CreateAnyPieces(); + CreateAnyPieces(1); CreateGrid(); if(appData.logoSize) @@ -1191,6 +1256,12 @@ gtk_main_iteration(); return 0; } +void +DoEvents () +{ + while(gtk_events_pending()) gtk_main_iteration(); +} + RETSIGTYPE TermSizeSigHandler (int sig) { @@ -1397,11 +1468,23 @@ FindFont (char *pattern, int targetPxlSize) #endif void +MarkMenuItem (char *menuRef, int state) +{ + MenuItem *item = MenuNameToItem(menuRef); + + if(item && item->handle) { + ((GtkCheckMenuItem *) (item->handle))->active = state; + } + SYNC_MENUBAR; +} + +void EnableNamedMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); if(item && item->handle) gtk_widget_set_sensitive(item->handle, state); + SYNC_MENUBAR; } void @@ -1961,7 +2044,11 @@ SetClockIcon (int color) GdkPixbuf *pm = *clockIcons[color]; if (mainwindowIcon != pm) { mainwindowIcon = pm; - gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon); +#ifdef __APPLE__ + gtkosx_application_set_dock_icon_pixbuf(theApp, mainwindowIcon); +#else + gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon); +#endif } } @@ -2141,13 +2228,20 @@ 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 if(appData.directory[n] && appData.directory[n][0]) { - sprintf(buf, "%s/%s.png", appData.logoDir, cps->tidy); + } 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); } } if(logoName[0])