From 66b5477cc1909e57489f854939a524ce2cd0f479 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 10 Oct 2016 17:28:30 +0000 Subject: [PATCH] Do not allow the opposite pane to resize when dragging with the mouse because it is not possible to keep the mouse on the border when the minimum size is reached. --- cmd-resize-pane.c | 12 ++++++------ layout.c | 20 +++++++++++--------- tmux.h | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c index 7ec65f10..fa52ab14 100644 --- a/cmd-resize-pane.c +++ b/cmd-resize-pane.c @@ -111,13 +111,13 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq) } if (args_has(self->args, 'L')) - layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust); + layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust, 1); else if (args_has(self->args, 'R')) - layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust); + layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust, 1); else if (args_has(self->args, 'U')) - layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust); + layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust, 1); else if (args_has(self->args, 'D')) - layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust); + layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust, 1); server_redraw_window(wl->window); return (CMD_RETURN_NORMAL); @@ -155,12 +155,12 @@ cmd_resize_pane_mouse_update(struct client *c, struct mouse_event *m) if (wp->xoff + wp->sx == m->lx && wp->yoff <= 1 + ly && wp->yoff + wp->sy >= ly) { - layout_resize_pane(wp, LAYOUT_LEFTRIGHT, m->x - m->lx); + layout_resize_pane(wp, LAYOUT_LEFTRIGHT, m->x - m->lx, 0); found = 1; } if (wp->yoff + wp->sy == ly && wp->xoff <= 1 + m->lx && wp->xoff + wp->sx >= m->lx) { - layout_resize_pane(wp, LAYOUT_TOPBOTTOM, y - ly); + layout_resize_pane(wp, LAYOUT_TOPBOTTOM, y - ly, 0); found = 1; } } diff --git a/layout.c b/layout.c index dffa08bd..490dbf0b 100644 --- a/layout.c +++ b/layout.c @@ -36,7 +36,7 @@ static u_int layout_resize_check(struct window *, struct layout_cell *, enum layout_type); static int layout_resize_pane_grow(struct window *, struct layout_cell *, - enum layout_type, int); + enum layout_type, int, int); static int layout_resize_pane_shrink(struct window *, struct layout_cell *, enum layout_type, int); static int layout_need_status(struct layout_cell *, int); @@ -532,12 +532,13 @@ layout_resize_pane_to(struct window_pane *wp, enum layout_type type, change = new_size - size; /* Resize the pane. */ - layout_resize_pane(wp, type, change); + layout_resize_pane(wp, type, change, 1); } /* Resize a single pane within the layout. */ void -layout_resize_pane(struct window_pane *wp, enum layout_type type, int change) +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; @@ -562,7 +563,8 @@ layout_resize_pane(struct window_pane *wp, enum layout_type type, int change) needed = change; while (needed != 0) { if (change > 0) { - size = layout_resize_pane_grow(w, lc, type, needed); + size = layout_resize_pane_grow(w, lc, type, needed, + opposite); needed -= size; } else { size = layout_resize_pane_shrink(w, lc, type, needed); @@ -582,10 +584,10 @@ layout_resize_pane(struct window_pane *wp, enum layout_type type, int change) /* Helper function to grow pane. */ static int layout_resize_pane_grow(struct window *w, struct layout_cell *lc, - enum layout_type type, int needed) + enum layout_type type, int needed, int opposite) { struct layout_cell *lcadd, *lcremove; - u_int size; + u_int size = 0; /* Growing. Always add to the current cell. */ lcadd = lc; @@ -600,7 +602,7 @@ layout_resize_pane_grow(struct window *w, struct layout_cell *lc, } /* If none found, look towards the head. */ - if (lcremove == NULL) { + if (opposite && lcremove == NULL) { lcremove = TAILQ_PREV(lc, layout_cells, entry); while (lcremove != NULL) { size = layout_resize_check(w, lcremove, type); @@ -608,9 +610,9 @@ layout_resize_pane_grow(struct window *w, struct layout_cell *lc, break; lcremove = TAILQ_PREV(lcremove, layout_cells, entry); } - if (lcremove == NULL) - return (0); } + if (lcremove == NULL) + return (0); /* Change the cells. */ if (size > (u_int) needed) diff --git a/tmux.h b/tmux.h index 1789ec2c..21802854 100644 --- a/tmux.h +++ b/tmux.h @@ -2217,7 +2217,7 @@ void layout_init(struct window *, struct window_pane *); void layout_free(struct window *); void layout_resize(struct window *, u_int, u_int); void layout_resize_pane(struct window_pane *, enum layout_type, - int); + int, int); void layout_resize_pane_to(struct window_pane *, enum layout_type, u_int); void layout_assign_pane(struct layout_cell *, struct window_pane *);