summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/layout.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2019-04-17 14:44:34 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2019-04-17 14:44:34 +0000
commit41678b5ca16c623bbe1ac8998e7b5e6a9e41165b (patch)
tree7a1c6e567652c185ca40215f05bc15eb83ff70bb /usr.bin/tmux/layout.c
parent20cef6dfabc330527cd62e7d225d2116294fe81e (diff)
Fix minimum size check on split and size of first cell on spread out
with a pane status line.
Diffstat (limited to 'usr.bin/tmux/layout.c')
-rw-r--r--usr.bin/tmux/layout.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/usr.bin/tmux/layout.c b/usr.bin/tmux/layout.c
index 798ad29389f..c631eff2e2a 100644
--- a/usr.bin/tmux/layout.c
+++ b/usr.bin/tmux/layout.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: layout.c,v 1.41 2019/04/17 14:43:49 nicm Exp $ */
+/* $OpenBSD: layout.c,v 1.42 2019/04/17 14:44:33 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -834,9 +834,9 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size,
int flags)
{
struct layout_cell *lc, *lcparent, *lcnew, *lc1, *lc2;
- u_int sx, sy, xoff, yoff, size1, size2;
+ u_int sx, sy, xoff, yoff, size1, size2, minimum;
u_int new_size, saved_size, resize_first = 0;
- int full_size = (flags & SPAWN_FULLSIZE);
+ int full_size = (flags & SPAWN_FULLSIZE), status;
/*
* If full_size is specified, add a new cell at the top of the window
@@ -846,6 +846,7 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size,
lc = wp->window->layout_root;
else
lc = wp->layout_cell;
+ status = options_get_number(wp->window->options, "pane-border-status");
/* Copy the old cell size. */
sx = lc->sx;
@@ -860,7 +861,10 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size,
return (NULL);
break;
case LAYOUT_TOPBOTTOM:
- if (sy < PANE_MINIMUM * 2 + 1)
+ minimum = PANE_MINIMUM * 2 + 1;
+ if (status != 0)
+ minimum += layout_need_status(lc, status == 1);
+ if (sy < minimum)
return (NULL);
break;
default:
@@ -1012,22 +1016,29 @@ int
layout_spread_cell(struct window *w, struct layout_cell *parent)
{
struct layout_cell *lc;
- u_int number, each, size;
- int change, changed;
+ u_int number, each, size, this;
+ int change, changed, status;
number = 0;
TAILQ_FOREACH (lc, &parent->cells, entry)
number++;
if (number <= 1)
return (0);
+ status = options_get_number(w->options, "pane-border-status");
if (parent->type == LAYOUT_LEFTRIGHT)
size = parent->sx;
- else if (parent->type == LAYOUT_TOPBOTTOM)
+ else if (parent->type == LAYOUT_TOPBOTTOM) {
size = parent->sy;
- else
+ if (status != 0)
+ size -= layout_need_status(parent, status == 1);
+ } else
+ return (0);
+ if (size < number - 1)
return (0);
each = (size - (number - 1)) / number;
+ if (each == 0)
+ return (0);
changed = 0;
TAILQ_FOREACH (lc, &parent->cells, entry) {
@@ -1038,7 +1049,10 @@ layout_spread_cell(struct window *w, struct layout_cell *parent)
change = each - (int)lc->sx;
layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change);
} else if (parent->type == LAYOUT_TOPBOTTOM) {
- change = each - (int)lc->sy;
+ this = each;
+ if (status != 0)
+ this += layout_need_status(lc, status == 1);
+ change = this - (int)lc->sy;
layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change);
}
if (change != 0)