Fix size check for splitw -f and top level pane size for tiled layout,

problems reported by Thomas Sattler.
This commit is contained in:
nicm 2019-04-04 10:25:35 +00:00 committed by Nicholas Marriott
parent 481c3f3f2e
commit 73b54a0e5f
2 changed files with 14 additions and 8 deletions

View File

@ -450,8 +450,7 @@ layout_set_tiled(struct window *w)
/* Free old tree and create a new root. */ /* Free old tree and create a new root. */
layout_free(w); layout_free(w);
lc = w->layout_root = layout_create_cell(NULL); lc = w->layout_root = layout_create_cell(NULL);
layout_set_size(lc, (width + 1) * columns - 1, layout_set_size(lc, w->sx, w->sy, 0, 0);
(height + 1) * rows - 1, 0, 0);
layout_make_node(lc, LAYOUT_TOPBOTTOM); layout_make_node(lc, LAYOUT_TOPBOTTOM);
/* Create a grid of the cells. */ /* Create a grid of the cells. */

View File

@ -722,7 +722,7 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
enum layout_type type, int size) enum layout_type type, int size)
{ {
struct layout_cell *lcchild; struct layout_cell *lcchild;
u_int new_size, available, previous, count, idx; u_int new_size, available, previous, count, idx;
/* Cells with no children must just be bigger than minimum. */ /* Cells with no children must just be bigger than minimum. */
if (lc->type == LAYOUT_WINDOWPANE) if (lc->type == LAYOUT_WINDOWPANE)
@ -736,6 +736,9 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
/* Check new size will work for each child. */ /* Check new size will work for each child. */
if (lc->type == type) { if (lc->type == type) {
if (available < (count * 2) - 1)
return (0);
if (type == LAYOUT_LEFTRIGHT) if (type == LAYOUT_LEFTRIGHT)
previous = lc->sx; previous = lc->sx;
else else
@ -745,13 +748,17 @@ layout_set_size_check(struct window *w, struct layout_cell *lc,
TAILQ_FOREACH(lcchild, &lc->cells, entry) { TAILQ_FOREACH(lcchild, &lc->cells, entry) {
new_size = layout_new_pane_size(w, previous, lcchild, new_size = layout_new_pane_size(w, previous, lcchild,
type, size, count - idx, available); type, size, count - idx, available);
if (new_size > available) if (idx == count - 1) {
return (0); if (new_size > available)
return (0);
available -= (new_size + 1); available -= new_size;
} else {
if (new_size + 1 > available)
return (0);
available -= new_size + 1;
}
if (!layout_set_size_check(w, lcchild, type, new_size)) if (!layout_set_size_check(w, lcchild, type, new_size))
return (0); return (0);
idx++; idx++;
} }
} else { } else {