diff options
author | Thomas Adam <thomas@xteddy.org> | 2018-06-08 23:02:25 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2018-06-08 23:02:25 +0100 |
commit | 4581240cedd70be3b1dc9dd8620d22c112ce38b0 (patch) | |
tree | 054069ec32f53a007d136bd5a32646408ac2f5b4 /layout.c | |
parent | 713e0ddef3ad593b990bd0e71f5fcbe177212a5e (diff) | |
parent | f6bad7efd76109de122bb3b670d0e18f86ec38bb (diff) | |
download | rtmux-4581240cedd70be3b1dc9dd8620d22c112ce38b0.tar.gz rtmux-4581240cedd70be3b1dc9dd8620d22c112ce38b0.tar.bz2 rtmux-4581240cedd70be3b1dc9dd8620d22c112ce38b0.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'layout.c')
-rw-r--r-- | layout.c | 87 |
1 files changed, 65 insertions, 22 deletions
@@ -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. */ |