summaryrefslogtreecommitdiffstats
path: root/layout.c
diff options
context:
space:
mode:
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. */