=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/layout.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- src/usr.bin/tmux/layout.c 2018/03/23 07:44:44 1.35 +++ src/usr.bin/tmux/layout.c 2018/06/08 20:54:22 1.36 @@ -1,4 +1,4 @@ -/* $OpenBSD: layout.c,v 1.35 2018/03/23 07:44:44 nicm Exp $ */ +/* $OpenBSD: layout.c,v 1.36 2018/06/08 20:54:22 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -127,6 +127,42 @@ } } +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(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 @@ 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. */