Adapt clock and message font after board-window sizing
[xboard.git] / gtk / xboard.c
index 03f2f9a..f9163b8 100644 (file)
@@ -653,7 +653,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
 }
@@ -1662,8 +1662,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 +1690,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
+           if(!fontValid[CLOCK_FONT][initialSquareSize]) fontTable[CLOCK_FONT][initialSquareSize] = CLOCK_FONT_NAME;
+           appData.clockFont = InsertPxlSize(fontTable[CLOCK_FONT][initialSquareSize], 2*(sizeDefaults[h].clockFontPxlSize+1)/3);
+           if(!fontValid[MESSAGE_FONT][initialSquareSize]) fontTable[MESSAGE_FONT][initialSquareSize] = DEFAULT_FONT_NAME;
+           appData.font = InsertPxlSize(fontTable[MESSAGE_FONT][initialSquareSize], 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);
+       }
+       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;
+               gtk_menu_item_set_label((GtkMenuItem *) mainOptions[h].handle, text);
+           }
+       }
        if(sqx != squareSize && !first) {
            squareSize = sqx; // adopt new square size
            CreatePNGPieces(); // make newly scaled pieces
@@ -1713,8 +1737,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 +1780,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;
 }