From: H.G.Muller Date: Wed, 22 Oct 2014 11:06:25 +0000 (+0200) Subject: Attempt to make GTK sizing work with tiling WM X-Git-Url: http://winboard.nl/cgi-bin?p=xboard.git;a=commitdiff_plain;h=34ee88fbe6aaf114f5a0212c4c94c532d3ae1925 Attempt to make GTK sizing work with tiling WM 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. --- diff --git a/gtk/xboard.c b/gtk/xboard.c index 8d8311b..8958e3c 100644 --- a/gtk/xboard.c +++ b/gtk/xboard.c @@ -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