summaryrefslogtreecommitdiffstats
path: root/layout.c
diff options
context:
space:
mode:
authornicm <nicm>2017-11-15 19:59:27 +0000
committernicm <nicm>2017-11-15 19:59:27 +0000
commit3b649d2fcdc8a15c69efbce69ae9e559481d36cb (patch)
treeb8b2e0d03ace30d066b836c53f37aa9eef02a9b5 /layout.c
parent533a5719c5edf53f0d7021d4340af230cc43ac8a (diff)
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 'layout.c')
-rw-r--r--layout.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/layout.c b/layout.c
index 5c2224bb..2c6fe2b2 100644
--- a/layout.c
+++ b/layout.c
@@ -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);
+}