Reset fontIsSet when sizing causes change to default font
[xboard.git] / gtk / xboard.c
index eb7457d..df1f18e 100644 (file)
@@ -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
 }
@@ -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,7 +1669,7 @@ 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
@@ -1691,19 +1698,28 @@ ReSize (WindowPlacement *wp)
            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);
-           initialSquareSize = sizeDefaults[h].squareSize; // used for saving font
        }
+#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);
-               text[clip + (text[clip-1] == '_')] = NULLCHAR;
+               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
@@ -2081,10 +2097,10 @@ LockBoardSize (int after)
     static char *oldClockFont, *oldMessgFont;
     int w, h;
     if(oldMessgFont && !strcmp(oldMessgFont, appData.font) &&
-       oldClockFont && !strcmp(oldClockFont, appData.clockFont) ) return; // only do something when font changed
+       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) {
+    if(after & 1) {
        ASSIGN(oldClockFont, appData.clockFont);
        ASSIGN(oldMessgFont, appData.font);
        gtk_window_resize(GTK_WINDOW(shellWidget), w, h);
@@ -2098,9 +2114,10 @@ LockBoardSize (int after)
 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];
 
@@ -2117,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("<span font=\"%s\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>", appData.clockFont,
-                                        bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
+                                        bgcolor, fgcolor, color, two ? "\n" : " ", TimeString(timer));
 //        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>",
 //                                      bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
     } else {
@@ -2133,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 };