X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxboard.c;h=40e41c80ae1837043d7f79bfc1667f5a8aabfb3a;hb=0e604fd62231e9375a446a4891efa1ede735f4d2;hp=1b3d58f138d74c1804ff9e9224d3fc4de7af7a7a;hpb=784a0a8b299157e7bdb55c87ca05ba7c86b6fc95;p=xboard.git diff --git a/gtk/xboard.c b/gtk/xboard.c index 1b3d58f..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) @@ -1152,6 +1217,9 @@ main (int argc, char **argv) BoardToTop(); } + gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() + InitPosition(TRUE); + InitBackEnd2(); if (errorExitStatus == -1) { @@ -1172,8 +1240,6 @@ main (int argc, char **argv) } } - gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() - InitPosition(TRUE); UpdateLogos(TRUE); // XtSetKeyboardFocus(shellWidget, formWidget); #ifdef TODO_GTK @@ -1190,6 +1256,12 @@ gtk_main_iteration(); return 0; } +void +DoEvents () +{ + while(gtk_events_pending()) gtk_main_iteration(); +} + RETSIGTYPE TermSizeSigHandler (int sig) { @@ -1396,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 @@ -1554,11 +1638,13 @@ ReSize (WindowPlacement *wp) int sqx, sqy, w, h, hc, lg = lineGap; gtk_widget_get_allocation(optList[W_WHITE].handle, &a); hc = a.height; // clock height can depend on single / double line clock text! - wp->height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc; + if(clockKludge && hc != clockKludge) wp->height += hc - clockKludge, clockKludge = 0; + wpMain.height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc; if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg; sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg; if(sqy < sqx) sqx = sqy; + if(sqx < 20) return; if(appData.overrideLineGap < 0) { // do second iteration with adjusted lineGap lg = lineGap = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4; sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg; @@ -1566,7 +1652,6 @@ ReSize (WindowPlacement *wp) if(sqy < sqx) sqx = sqy; } if(sqx != squareSize) { -//printf("new sq size %d (%dx%d)\n", sqx, wp->width, wp->height); squareSize = sqx; // adopt new square size CreatePNGPieces(); // make newly scaled pieces InitDrawingSizes(0, 0); // creates grid etc. @@ -1959,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 } } @@ -2139,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])