Base new square size on board widget allocation GTK
[xboard.git] / gtk / xboard.c
index 88550f7..8d8311b 100644 (file)
@@ -650,9 +650,12 @@ ResizeBoardWindow (int w, int h, int inhibit)
     gtk_widget_get_allocation(shellWidget, &a);
     marginW = a.width - bw;
     gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
-    w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
-    h += marginH + a.height + 1;
+    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);
+    DoEvents();
+    gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board again
 }
 
 int
@@ -1194,7 +1197,7 @@ main (int argc, char **argv)
        clockKludge = hc = a.height;
        gtk_widget_get_allocation(boardWidget, &a);
 //     marginW =  w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board
-       marginH =  h - a.height - hc; // subtract current clock height, so it can be added back dynamically
+//     marginH =  h - a.height - hc; // subtract current clock height, so it can be added back dynamically
     }
 
     CreateAnyPieces(1);
@@ -1653,25 +1656,23 @@ ReSize (WindowPlacement *wp)
 {
        GtkAllocation a;
        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!
-        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;
+       static int first = 1;
+       gtk_widget_get_allocation(optList[W_BOARD].handle, &a);
+       if(wp->width == wpMain.width && wp->height == wpMain.height && !first) return; // not sized
+       sqx = (a.width - lg) / BOARD_WIDTH - lg;
+       sqy = (a.height - lg) / BOARD_HEIGHT - lg;
        if(sqy < sqx) sqx = sqy;
         if(sqx < 20) return;
        if(appData.overrideLineGap < 0) { // do second iteration with adjusted lineGap
            int oldSqx = sqx;
            lg = lineGap = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4;
-           sqx = (wp->width  - lg - marginW) / BOARD_WIDTH - lg;
-           sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg;
+           sqx = (a.width  - lg) / BOARD_WIDTH - lg;
+           sqy = (a.height - lg) / BOARD_HEIGHT - lg;
            if(sqy < sqx) sqx = sqy;
            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
        }
-       if(sqx != squareSize) {
+       if(sqx != squareSize && !first) {
            squareSize = sqx; // adopt new square size
            CreatePNGPieces(); // make newly scaled pieces
            InitDrawingSizes(0, 0); // creates grid etc.
@@ -1680,6 +1681,7 @@ ReSize (WindowPlacement *wp)
        h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap;
        if(optList[W_BOARD].max   > w) optList[W_BOARD].max = w;
        if(optList[W_BOARD].value > h) optList[W_BOARD].value = h;
+       first = 0;
 }
 
 static guint delayedDragTag = 0;
@@ -1691,7 +1693,7 @@ DragProc ()
        if(busy) return;
 
        busy = 1;
-//     GetActualPlacement(shellWidget, &wpNew);
+       GetActualPlacement(shellWidget, &wpNew);
        if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved
           wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized
            busy = 0; return; // false alarm