summaryrefslogtreecommitdiffstats
path: root/layout.c
diff options
context:
space:
mode:
authornicm <nicm>2018-06-08 20:54:22 +0000
committernicm <nicm>2018-06-08 20:54:22 +0000
commitf6bad7efd76109de122bb3b670d0e18f86ec38bb (patch)
tree94e176701edc28c07975a8cfbe22b2221867ac66 /layout.c
parentff45b2d343fea6b0c477ed2cb5bbe2d30922ea3e (diff)
Instead of working out which pane to resize with the mouse by walking
the panes list, look through the layout cells for the nearest border and resize that cell. From Dan Aloni in GitHub issue 1374.
Diffstat (limited to 'layout.c')
-rw-r--r--layout.c87
1 files changed, 65 insertions, 22 deletions
diff --git a/layout.c b/layout.c
index bab95868..e1112ffa 100644
--- a/layout.c
+++ b/layout.c
@@ -127,6 +127,42 @@ layout_print_cell(struct layout_cell *lc, const char *hdr, u_int n)
}
}
+struct layout_cell *
+layout_search_by_border(struct layout_cell *lc, u_int x, u_int y)
+{
+ struct layout_cell *lcchild, *last = NULL;
+
+ TAILQ_FOREACH(lcchild, &lc->cells, entry) {
+ if (x >= lcchild->xoff && x < lcchild->xoff + lcchild->sx &&
+ y >= lcchild->yoff && y < lcchild->yoff + lcchild->sy) {
+ /* Inside the cell - recurse. */
+ return (layout_search_by_border(lcchild, x, y));
+ }
+
+ if (last == NULL) {
+ last = lcchild;
+ continue;
+ }
+
+ switch (lc->type) {
+ case LAYOUT_LEFTRIGHT:
+ if (x < lcchild->xoff && x >= last->xoff + last->sx)
+ return (last);
+ break;
+ case LAYOUT_TOPBOTTOM:
+ if (y < lcchild->yoff && y >= last->yoff + last->sy)
+ return (last);
+ break;
+ case LAYOUT_WINDOWPANE:
+ break;
+ }
+
+ last = lcchild;
+ }
+
+ return (NULL);
+}
+
void
layout_set_size(struct layout_cell *lc, u_int sx, u_int sy, u_int xoff,
u_int yoff)
@@ -550,14 +586,40 @@ layout_resize_pane_to(struct window_pane *wp, enum layout_type type,
layout_resize_pane(wp, type, change, 1);
}
+void
+layout_resize_layout(struct window *w, struct layout_cell *lc,
+ enum layout_type type, int change, int opposite)
+{
+ int needed, size;
+
+ /* Grow or shrink the cell. */
+ needed = change;
+ while (needed != 0) {
+ if (change > 0) {
+ size = layout_resize_pane_grow(w, lc, type, needed,
+ opposite);
+ needed -= size;
+ } else {
+ size = layout_resize_pane_shrink(w, lc, type, needed);
+ needed += size;
+ }
+
+ if (size == 0) /* no more change possible */
+ break;
+ }
+
+ /* Fix cell offsets. */
+ layout_fix_offsets(w->layout_root);
+ layout_fix_panes(w, w->sx, w->sy);
+ notify_window("window-layout-changed", w);
+}
+
/* Resize a single pane within the layout. */
void
layout_resize_pane(struct window_pane *wp, enum layout_type type, int change,
int opposite)
{
- struct window *w = wp->window;
struct layout_cell *lc, *lcparent;
- int needed, size;
lc = wp->layout_cell;
@@ -574,26 +636,7 @@ layout_resize_pane(struct window_pane *wp, enum layout_type type, int change,
if (lc == TAILQ_LAST(&lcparent->cells, layout_cells))
lc = TAILQ_PREV(lc, layout_cells, entry);
- /* Grow or shrink the cell. */
- needed = change;
- while (needed != 0) {
- if (change > 0) {
- size = layout_resize_pane_grow(w, lc, type, needed,
- opposite);
- needed -= size;
- } else {
- size = layout_resize_pane_shrink(w, lc, type, needed);
- needed += size;
- }
-
- if (size == 0) /* no more change possible */
- break;
- }
-
- /* Fix cell offsets. */
- layout_fix_offsets(wp->window->layout_root);
- layout_fix_panes(wp->window, wp->window->sx, wp->window->sy);
- notify_window("window-layout-changed", wp->window);
+ layout_resize_layout(wp->window, lc, type, change, opposite);
}
/* Helper function to grow pane. */