X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxboard.c;h=df1f18e9f94237c21db0a9d62b2045ee34f9ba87;hb=88a788118a6c2a024d3a3dc42105ca0335f6812f;hp=a7b10ca58b0b7ba4ccb12ae33acd95ae9041a64c;hpb=9a84c7596671bd085afc8d927f9d0a38c2cff13f;p=xboard.git diff --git a/gtk/xboard.c b/gtk/xboard.c index a7b10ca..df1f18e 100644 --- a/gtk/xboard.c +++ b/gtk/xboard.c @@ -444,6 +444,13 @@ SetFontDefaults () } void +ChangeFont (char **font, int fnr, int size, char *def, int pix) +{ + if(!fontValid[fnr][size]) { ASSIGN(fontTable[fnr][size], def); fontIsSet[fnr] = False; } // use default + FREE(*font); *font = InsertPxlSize(fontTable[fnr][size], pix); +} + +void CreateFonts () { // no-op, until we identify the code for this already in XBoard and move it here } @@ -653,7 +660,7 @@ ResizeBoardWindow (int w, int h, int inhibit) 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_window_resize(GTK_WINDOW(shellWidget), w, 10); DoEvents(); gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board again } @@ -669,21 +676,21 @@ InitializeFonts (int clockFontPxlSize, int coordFontPxlSize, int fontPxlSize) { // determine what fonts to use, and create them if(!fontIsSet[CLOCK_FONT] && fontValid[CLOCK_FONT][squareSize]) - appData.clockFont = fontTable[CLOCK_FONT][squareSize]; + appData.clockFont = fontTable[CLOCK_FONT][squareSize], fontIsSet[CLOCK_FONT] = True; if(!fontIsSet[MESSAGE_FONT] && fontValid[MESSAGE_FONT][squareSize]) - appData.font = fontTable[MESSAGE_FONT][squareSize]; + appData.font = fontTable[MESSAGE_FONT][squareSize], fontIsSet[MESSAGE_FONT] = True; if(!fontIsSet[COORD_FONT] && fontValid[COORD_FONT][squareSize]) - appData.coordFont = fontTable[COORD_FONT][squareSize]; + appData.coordFont = fontTable[COORD_FONT][squareSize], fontIsSet[COORD_FONT] = True; if(!fontIsSet[CONSOLE_FONT] && fontValid[CONSOLE_FONT][squareSize]) - appData.icsFont = fontTable[CONSOLE_FONT][squareSize]; + appData.icsFont = fontTable[CONSOLE_FONT][squareSize], fontIsSet[CONSOLE_FONT] = True; if(!fontIsSet[EDITTAGS_FONT] && fontValid[EDITTAGS_FONT][squareSize]) - appData.tagsFont = fontTable[EDITTAGS_FONT][squareSize]; + appData.tagsFont = fontTable[EDITTAGS_FONT][squareSize], fontIsSet[EDITTAGS_FONT] = True; if(!fontIsSet[COMMENT_FONT] && fontValid[COMMENT_FONT][squareSize]) - appData.commentFont = fontTable[COMMENT_FONT][squareSize]; + appData.commentFont = fontTable[COMMENT_FONT][squareSize], fontIsSet[COMMENT_FONT] = True; if(!fontIsSet[MOVEHISTORY_FONT] && fontValid[MOVEHISTORY_FONT][squareSize]) - appData.historyFont = fontTable[MOVEHISTORY_FONT][squareSize]; + appData.historyFont = fontTable[MOVEHISTORY_FONT][squareSize], fontIsSet[MOVEHISTORY_FONT] = True; if(!fontIsSet[GAMELIST_FONT] && fontValid[GAMELIST_FONT][squareSize]) - appData.gameListFont = fontTable[GAMELIST_FONT][squareSize]; + appData.gameListFont = fontTable[GAMELIST_FONT][squareSize], fontIsSet[GAMELIST_FONT] = True; appData.font = InsertPxlSize(appData.font, coordFontPxlSize); appData.clockFont = InsertPxlSize(appData.clockFont, clockFontPxlSize); @@ -1662,8 +1669,9 @@ void ReSize (WindowPlacement *wp) { GtkAllocation a; - int sqx, sqy, w, h, lg = lineGap; + int sqx, sqy, i, w, h, lg = lineGap; static int first = 1; +// DisplayBothClocks(); if(wp->width == wpMain.width && wp->height == wpMain.height && !first) return; // not sized gtk_widget_get_allocation(optList[W_DROP+1].handle, &a); // table that should contain everything w = a.width; h = a.height; @@ -1689,6 +1697,29 @@ ReSize (WindowPlacement *wp) lg = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4; if(sqx == oldSqx + 1 && lg == lineGap + 1) sqx = oldSqx, squareSize = 0; // prevent oscillations, force resize by kludge } + for(h=0; sizeDefaults[h].name && sizeDefaults[h].squareSize*8 > sqx*BOARD_WIDTH; h++) {} + if(initialSquareSize != sizeDefaults[h].squareSize) { // boardSize changed + initialSquareSize = sizeDefaults[h].squareSize; // used for saving font + ChangeFont(&appData.clockFont, CLOCK_FONT, initialSquareSize, CLOCK_FONT_NAME, 2*(sizeDefaults[h].clockFontPxlSize+1)/3); + ChangeFont(&appData.font, MESSAGE_FONT, initialSquareSize, DEFAULT_FONT_NAME, sizeDefaults[h].coordFontPxlSize); + DisplayBothClocks(); + ApplyFont(&mainOptions[W_MESSG], NULL); + for(i=1; i<6; i++) ApplyFont(&mainOptions[W_BUTTON+i], NULL); + } + if(!strchr(appData.boardSize, ',')) { + ASSIGN(appData.boardSize, sizeDefaults[h].name); + } +#ifndef OSXAPP + if(sizeDefaults[h].tinyLayout != tinyLayout) { // alter clipping of menu names to conform to board width + int clip = (tinyLayout = sizeDefaults[h].tinyLayout) + 1; + char text[MSG_SIZ]; + for(h=1; mainOptions[h].type == DropDown; h++) { + strncpy(text, _(mainOptions[h].name), MSG_SIZ); + if(clip != 1) text[clip + (text[clip-1] == '_')] = NULLCHAR; + gtk_menu_item_set_label((GtkMenuItem *) mainOptions[h].handle, text); + } + } +#endif if(sqx != squareSize && !first) { squareSize = sqx; // adopt new square size CreatePNGPieces(); // make newly scaled pieces @@ -1713,8 +1744,10 @@ void DragProc () { static int busy; - if(busy) return; - + if(busy) { // prevent recursive calling, but postpone interrupting call rather than lose it + if(!delayedDragTag) delayedDragTag = g_timeout_add( 200, (GSourceFunc) DragProc, NULL); + return; + } busy = 1; GetActualPlacement(shellWidget, &wpNew); if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved @@ -1754,6 +1787,7 @@ EventProc (GtkWidget *widget, GdkEvent *event, gpointer g) wpNew.y = event->configure.y; wpNew.width = event->configure.width; wpNew.height = event->configure.height; +// SetWidgetLabel(&mainOptions[W_WHITE], ""); SetWidgetLabel(&mainOptions[W_BLACK], ""); DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other return FALSE; } @@ -2057,13 +2091,33 @@ DisplayIcsInteractionTitle (String message) #endif } +void +LockBoardSize (int after) +{ + static char *oldClockFont, *oldMessgFont; + int w, h; + if(oldMessgFont && !strcmp(oldMessgFont, appData.font) && + oldClockFont && !strcmp(oldClockFont, appData.clockFont) && after < 2) return; // only do something when font changed + w = BOARD_WIDTH*(squareSize + lineGap) + lineGap; + h = BOARD_HEIGHT*(squareSize + lineGap) + lineGap; + if(after & 1) { + ASSIGN(oldClockFont, appData.clockFont); + ASSIGN(oldMessgFont, appData.font); + gtk_window_resize(GTK_WINDOW(shellWidget), w, h); + DoEvents(); + gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board + } else { // before + gtk_widget_set_size_request(optList[W_BOARD].handle, w, h); // protect board widget + } +} void DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) { + static int twoLines = -1; GtkWidget *w = (GtkWidget *) opt->handle; GdkColor col; - char *markup; + char *markup, two = (appData.logoSize != 0); char bgcolor[10]; char fgcolor[10]; @@ -2080,12 +2134,14 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) strcpy(fgcolor, appData.lowTimeWarningColor); } + if(! partnerUp && two != twoLines) LockBoardSize(2); // lock board size if clock height changes + gdk_color_parse( bgcolor, &col ); gtk_widget_modify_bg(gtk_widget_get_parent(opt->handle), GTK_STATE_NORMAL, &col); if (appData.clockMode) { markup = g_markup_printf_escaped("%s:%s%s", appData.clockFont, - bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); + bgcolor, fgcolor, color, two ? "\n" : " ", TimeString(timer)); // markup = g_markup_printf_escaped("%s:%s%s", // bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); } else { @@ -2096,6 +2152,8 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) } gtk_label_set_markup(GTK_LABEL(w), markup); g_free(markup); + + if(!partnerUp && two != twoLines) LockBoardSize(3), twoLines = two; } static GdkPixbuf **clockIcons[] = { &WhiteIcon, &BlackIcon }; @@ -2329,15 +2387,15 @@ UpdateLogos (int displ) return; } -void FileNamePopUpWrapper(label, def, filter, proc, pathFlag, openMode, name, fp) - char *label; - char *def; - char *filter; - FileProc proc; - char *openMode; - Boolean pathFlag; - char **name; - FILE **fp; +void FileNamePopUpWrapper( + char *label, + char *def, + char *filter, + FileProc proc, + Boolean pathFlag, + char *openMode, + char **name, + FILE **fp) { GtkWidget *dialog; GtkFileFilter *gtkfilter;