diff options
author | 2017-11-15 19:59:27 +0000 | |
---|---|---|
committer | 2017-11-15 19:59:27 +0000 | |
commit | 967ee5b96581c2f28b071ef7dfdff094fb79f4f1 (patch) | |
tree | 56bb00a1c8b523f3265d39f318c981da14969610 /usr.bin/tmux/layout.c | |
parent | Completely rewrite the reflow code to correctly handle double width (diff) | |
download | wireguard-openbsd-967ee5b96581c2f28b071ef7dfdff094fb79f4f1.tar.xz wireguard-openbsd-967ee5b96581c2f28b071ef7dfdff094fb79f4f1.zip |
Add a common function for spreading out cells and use it for the two
even layouts and to add a -E flag to select-layout to spread out cells
evenly without changing parent cells.
Diffstat (limited to 'usr.bin/tmux/layout.c')
-rw-r--r-- | usr.bin/tmux/layout.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/usr.bin/tmux/layout.c b/usr.bin/tmux/layout.c index f5e4c4c6cf9..7f83af70ccc 100644 --- a/usr.bin/tmux/layout.c +++ b/usr.bin/tmux/layout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: layout.c,v 1.32 2017/03/11 15:16:35 nicm Exp $ */ +/* $OpenBSD: layout.c,v 1.33 2017/11/15 19:59:27 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -983,3 +983,61 @@ layout_close_pane(struct window_pane *wp) } notify_window("window-layout-changed", w); } + +int +layout_spread_cell(struct window *w, struct layout_cell *parent) +{ + struct layout_cell *lc; + u_int number, each, size; + int change, changed; + + number = 0; + TAILQ_FOREACH (lc, &parent->cells, entry) + number++; + if (number <= 1) + return (0); + + if (parent->type == LAYOUT_LEFTRIGHT) + size = parent->sx; + else if (parent->type == LAYOUT_TOPBOTTOM) + size = parent->sy; + else + return (0); + each = (size - (number - 1)) / number; + + changed = 0; + TAILQ_FOREACH (lc, &parent->cells, entry) { + if (TAILQ_NEXT(lc, entry) == NULL) + each = size - (each * (number - 1)); + change = 0; + if (parent->type == LAYOUT_LEFTRIGHT) { + change = each - (int)lc->sx; + layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change); + } else if (parent->type == LAYOUT_TOPBOTTOM) { + change = each - (int)lc->sy; + layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change); + } + if (change != 0) + changed = 1; + } + return (changed); +} + +void +layout_spread_out(struct window_pane *wp) +{ + struct layout_cell *parent; + struct window *w = wp->window; + + parent = wp->layout_cell->parent; + if (parent == NULL) + return; + + do { + if (layout_spread_cell(w, parent)) { + layout_fix_offsets(parent); + layout_fix_panes(w, w->sx, w->sy); + break; + } + } while ((parent = parent->parent) != NULL); +} |