diff options
-rw-r--r-- | cmd-find.c | 30 | ||||
-rw-r--r-- | cmd-select-pane.c | 1 | ||||
-rw-r--r-- | tmux.h | 1 | ||||
-rw-r--r-- | window.c | 16 |
4 files changed, 30 insertions, 18 deletions
@@ -658,7 +658,7 @@ cmd_find_get_pane(struct cmd_find_state *fs, const char *pane) /* Check for pane ids starting with %. */ if (*pane == '%') { fs->wp = window_pane_find_by_id_str(pane); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); fs->w = fs->wp->window; return (cmd_find_best_session_with_window(fs)); @@ -695,7 +695,7 @@ cmd_find_get_pane_with_session(struct cmd_find_state *fs, const char *pane) /* Check for pane ids starting with %. */ if (*pane == '%') { fs->wp = window_pane_find_by_id_str(pane); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); fs->w = fs->wp->window; return (cmd_find_best_winlink_with_window(fs)); @@ -727,7 +727,9 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane) /* Check for pane ids starting with %. */ if (*pane == '%') { fs->wp = window_pane_find_by_id_str(pane); - if (fs->wp == NULL || fs->wp->window != fs->w) + if (fs->wp == NULL || window_pane_outside(fs->wp)) + return (-1); + if (fs->wp->window != fs->w) return (-1); return (0); } @@ -737,25 +739,27 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane) if (fs->w->last == NULL) return (-1); fs->wp = fs->w->last; + if (fs->wp == NULL || window_pane_outside(fs->wp)) + return (-1); return (0); } else if (strcmp(pane, "{up-of}") == 0) { fs->wp = window_pane_find_up(fs->w->active); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); return (0); } else if (strcmp(pane, "{down-of}") == 0) { fs->wp = window_pane_find_down(fs->w->active); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); return (0); } else if (strcmp(pane, "{left-of}") == 0) { fs->wp = window_pane_find_left(fs->w->active); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); return (0); } else if (strcmp(pane, "{right-of}") == 0) { fs->wp = window_pane_find_right(fs->w->active); - if (fs->wp == NULL) + if (fs->wp == NULL || window_pane_outside(fs->wp)) return (-1); return (0); } @@ -771,7 +775,7 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane) fs->wp = window_pane_next_by_number(fs->w, wp, n); else fs->wp = window_pane_previous_by_number(fs->w, wp, n); - if (fs->wp != NULL) + if (fs->wp != NULL && !window_pane_outside(fs->wp)) return (0); } @@ -779,13 +783,13 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane) idx = strtonum(pane, 0, INT_MAX, &errstr); if (errstr == NULL) { fs->wp = window_pane_at_index(fs->w, idx); - if (fs->wp != NULL) + if (fs->wp != NULL && !window_pane_outside(fs->wp)) return (0); } /* Try as a description. */ fs->wp = window_find_string(fs->w, pane); - if (fs->wp != NULL) + if (fs->wp != NULL && !window_pane_outside(fs->wp)) return (0); return (-1); @@ -837,7 +841,7 @@ cmd_find_valid_state(struct cmd_find_state *fs) if (!window_has_pane(fs->w, fs->wp)) return (0); - return (window_pane_visible(fs->wp)); + return (!window_pane_outside(fs->wp)); } /* Copy a state. */ @@ -945,6 +949,8 @@ cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp) { if (cmd_find_from_window(fs, wp->window) != 0) return (-1); + if (window_pane_outside(wp)) + return (-1); fs->wp = wp; cmd_find_log_state(__func__, fs); @@ -1012,7 +1018,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_find_state *current, switch (type) { case CMD_FIND_PANE: fs->wp = cmd_mouse_pane(m, &fs->s, &fs->wl); - if (fs->wp != NULL) + if (fs->wp != NULL && !window_pane_outside(fs->wp)) fs->w = fs->wl->window; break; case CMD_FIND_WINDOW: diff --git a/cmd-select-pane.c b/cmd-select-pane.c index c0374fa7..6ef83473 100644 --- a/cmd-select-pane.c +++ b/cmd-select-pane.c @@ -63,7 +63,6 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) const char *style; if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) { - if (wl->window->last == NULL) { cmdq_error(item, "no last pane"); return (CMD_RETURN_ERROR); @@ -2126,6 +2126,7 @@ int window_pane_set_mode(struct window_pane *, void window_pane_reset_mode(struct window_pane *); void window_pane_key(struct window_pane *, struct client *, struct session *, key_code, struct mouse_event *); +int window_pane_outside(struct window_pane *); int window_pane_visible(struct window_pane *); char *window_pane_search(struct window_pane *, const char *, u_int *); @@ -1185,17 +1185,23 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s, } int -window_pane_visible(struct window_pane *wp) +window_pane_outside(struct window_pane *wp) { struct window *w = wp->window; - if (wp->layout_cell == NULL) - return (0); if (wp->xoff >= w->sx || wp->yoff >= w->sy) - return (0); + return (1); if (wp->xoff + wp->sx > w->sx || wp->yoff + wp->sy > w->sy) + return (1); + return (0); +} + +int +window_pane_visible(struct window_pane *wp) +{ + if (wp->layout_cell == NULL) return (0); - return (1); + return (!window_pane_outside(wp)); } char * |