diff options
author | nicm <nicm> | 2016-11-16 00:24:03 +0000 |
---|---|---|
committer | nicm <nicm> | 2016-11-16 00:24:03 +0000 |
commit | e88b74350fba9e35307f35a8645b23e3cde9200a (patch) | |
tree | 7e97f502b883765b11e70ef6425d95371fa2046c /cmd-find.c | |
parent | c34a79b152e1d27ed87417e6a940358990ab9e79 (diff) |
The target validity check used window_pane_visible but that may be false
if the pane is zoomed, so instead add a new function to just check if
the pane is actually on screen (most commands still want to accept panes
invisible by zoom). Also reject panes outside the window for various
special targets. Problem reported by Sean Haugh.
Diffstat (limited to 'cmd-find.c')
-rw-r--r-- | cmd-find.c | 30 |
1 files changed, 18 insertions, 12 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: |