From 0cbccc90ab323158aecb961b93954878693c1c90 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 9 Apr 2019 20:38:43 +0100 Subject: [PATCH] Set the window size as well as the layout size when using the preset layouts and calculate the sizes correctly. --- cmd-select-layout.c | 1 + layout-set.c | 29 +++++++++++++++++++++++++---- layout.c | 4 ++-- resize.c | 2 ++ tty.c | 3 +-- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/cmd-select-layout.c b/cmd-select-layout.c index d8fc1aeb..775d32c5 100644 --- a/cmd-select-layout.c +++ b/cmd-select-layout.c @@ -135,6 +135,7 @@ cmd_select_layout_exec(struct cmd *self, struct cmdq_item *item) changed: free(oldlayout); + recalculate_sizes(); server_redraw_window(w); notify_window("window-layout-changed", w); return (CMD_RETURN_NORMAL); diff --git a/layout-set.c b/layout-set.c index d99453c2..97315964 100644 --- a/layout-set.c +++ b/layout-set.c @@ -119,7 +119,7 @@ layout_set_even(struct window *w, enum layout_type type) { struct window_pane *wp; struct layout_cell *lc, *lcnew; - u_int n; + u_int n, sx, sy; layout_print_cell(w->layout_root, __func__, 1); @@ -131,7 +131,18 @@ layout_set_even(struct window *w, enum layout_type type) /* Free the old root and construct a new. */ layout_free(w); lc = w->layout_root = layout_create_cell(NULL); - layout_set_size(lc, w->sx, w->sy, 0, 0); + if (type == LAYOUT_LEFTRIGHT) { + sx = (n * (PANE_MINIMUM + 1)) - 1; + if (sx < w->sx) + sx = w->sx; + sy = w->sy; + } else { + sy = (n * (PANE_MINIMUM + 1)) - 1; + if (sy < w->sy) + sy = w->sy; + sx = w->sx; + } + layout_set_size(lc, sx, sy, 0, 0); layout_make_node(lc, type); /* Build new leaf cells. */ @@ -152,6 +163,7 @@ layout_set_even(struct window *w, enum layout_type type) layout_print_cell(w->layout_root, __func__, 1); + window_resize(w, lc->sx, lc->sy); notify_window("window-layout-changed", w); server_redraw_window(w); } @@ -288,6 +300,7 @@ layout_set_main_h(struct window *w) layout_print_cell(w->layout_root, __func__, 1); + window_resize(w, lc->sx, lc->sy); notify_window("window-layout-changed", w); server_redraw_window(w); } @@ -412,6 +425,7 @@ layout_set_main_v(struct window *w) layout_print_cell(w->layout_root, __func__, 1); + window_resize(w, lc->sx, lc->sy); notify_window("window-layout-changed", w); server_redraw_window(w); } @@ -421,7 +435,7 @@ layout_set_tiled(struct window *w) { struct window_pane *wp; struct layout_cell *lc, *lcrow, *lcchild; - u_int n, width, height, used; + u_int n, width, height, used, sx, sy; u_int i, j, columns, rows; layout_print_cell(w->layout_root, __func__, 1); @@ -450,7 +464,13 @@ layout_set_tiled(struct window *w) /* Free old tree and create a new root. */ layout_free(w); lc = w->layout_root = layout_create_cell(NULL); - layout_set_size(lc, w->sx, w->sy, 0, 0); + sx = ((width + 1) * columns) - 1; + if (sx < w->sx) + sx = w->sx; + sy = ((height + 1) * rows) - 1; + if (sy < w->sy) + sy = w->sy; + layout_set_size(lc, sx, sy, 0, 0); layout_make_node(lc, LAYOUT_TOPBOTTOM); /* Create a grid of the cells. */ @@ -514,6 +534,7 @@ layout_set_tiled(struct window *w) layout_print_cell(w->layout_root, __func__, 1); + window_resize(w, lc->sx, lc->sy); notify_window("window-layout-changed", w); server_redraw_window(w); } diff --git a/layout.c b/layout.c index 1a43014d..b825ee52 100644 --- a/layout.c +++ b/layout.c @@ -479,7 +479,7 @@ layout_resize(struct window *w, u_int sx, u_int sy) * out proportionately - this should leave the layout fitting the new * window size. */ - xchange = sx - w->sx; + xchange = sx - lc->sx; xlimit = layout_resize_check(w, lc, LAYOUT_LEFTRIGHT); if (xchange < 0 && xchange < -xlimit) xchange = -xlimit; @@ -493,7 +493,7 @@ layout_resize(struct window *w, u_int sx, u_int sy) layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, xchange); /* Adjust vertically in a similar fashion. */ - ychange = sy - w->sy; + ychange = sy - lc->sy; ylimit = layout_resize_check(w, lc, LAYOUT_TOPBOTTOM); if (ychange < 0 && ychange < -ylimit) ychange = -ylimit; diff --git a/resize.c b/resize.c index 868ddac8..caac74ba 100644 --- a/resize.c +++ b/resize.c @@ -51,6 +51,8 @@ resize_window(struct window *w, u_int sx, u_int sy) if (sy < w->layout_root->sy) sy = w->layout_root->sy; window_resize(w, sx, sy); + log_debug("%s: @%u resized to %u,%u; layout %u,%u", __func__, w->id, + sx, sy, w->layout_root->sx, w->layout_root->sy); /* Restore the window zoom state. */ if (zoomed) diff --git a/tty.c b/tty.c index 855f8e6a..9ed2b3a9 100644 --- a/tty.c +++ b/tty.c @@ -907,9 +907,8 @@ tty_is_visible(struct tty *tty, const struct tty_ctx *ctx, u_int px, u_int py, lines = 0; if (xoff + nx <= ctx->ox || xoff >= ctx->ox + ctx->sx || - yoff + ny <= ctx->oy || yoff >= lines + ctx->oy + ctx->sy) { + yoff + ny <= ctx->oy || yoff >= lines + ctx->oy + ctx->sy) return (0); - } return (1); }