Attempt to make GTK sizing work with tiling WM
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 22 Oct 2014 11:06:25 +0000 (13:06 +0200)
committerArun Persaud <arun@nubati.net>
Wed, 22 Oct 2014 15:18:47 +0000 (08:18 -0700)
The Rezise routine now takes the size of the entire dialog table
(for me always equal to the outer-window size), and checks if the
actual outer window is smaller. If it is, it shrinks the board to fit,
under the assumption that a tiling window manager offers only a limited
'viewport' to our dialog, and we want everything to be visible inside that.

gtk/xboard.c

index 8d8311b..8958e3c 100644 (file)
@@ -1196,8 +1196,8 @@ main (int argc, char **argv)
        gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
        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
+       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
     }
 
     CreateAnyPieces(1);
@@ -1655,19 +1655,29 @@ void
 ReSize (WindowPlacement *wp)
 {
        GtkAllocation a;
-       int sqx, sqy, w, h, hc, lg = lineGap;
+       int sqx, sqy, w, h, lg = lineGap;
        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;
+       gtk_widget_get_allocation(optList[W_DROP+1].handle, &a); // table that should contain everything
+       w = a.width; h = a.height;
+       gtk_widget_get_allocation(shellWidget, &a);
+       if(a.width < w || a.height < h) { // outer window smaller than dialog content?
+           w = a.width - w; h = a.height - h; // subtract matrgins, measured as table minus board dimensions
+           gtk_widget_get_allocation(optList[W_BOARD].handle, &a);
+           w += a.width; h += a.height;
+       } else {
+           gtk_widget_get_allocation(optList[W_BOARD].handle, &a);
+           w = a.width; h = a.height;
+       }
+       sqx = (w - lg) / BOARD_WIDTH - lg;
+       sqy = (h - 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 = (a.width  - lg) / BOARD_WIDTH - lg;
-           sqy = (a.height - lg) / BOARD_HEIGHT - lg;
+           sqx = (w  - lg) / BOARD_WIDTH - lg;
+           sqy = (h - 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