summaryrefslogtreecommitdiffstats
path: root/cmd-find.c
diff options
context:
space:
mode:
authornicm <nicm>2015-10-22 11:23:00 +0000
committernicm <nicm>2015-10-22 11:23:00 +0000
commit3ebcf25149d75977ea97e9d4f786e0508d1a0d5e (patch)
tree8250194fa5ed8b55e90165ab6152cca28700cb36 /cmd-find.c
parenta05c27a7e1c4d43709817d6746a510f16c960b4b (diff)
If the pane is still on all_window_panes but not actually connected to
window or session (which can happen if it is killed during a command sequence and something else has a reference), fall back to the best effort. Fixes "tmux killw\; detach" for Rudis Muiznieks.
Diffstat (limited to 'cmd-find.c')
-rw-r--r--cmd-find.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/cmd-find.c b/cmd-find.c
index ec883cbd..376d9041 100644
--- a/cmd-find.c
+++ b/cmd-find.c
@@ -255,24 +255,35 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
wp = NULL;
/* Not running in a pane. We know nothing. Find the best session. */
- if (wp == NULL) {
- fs->s = cmd_find_best_session(NULL, 0, fs->flags);
- if (fs->s == NULL)
- return (-1);
- fs->wl = fs->s->curw;
- fs->idx = fs->wl->idx;
- fs->w = fs->wl->window;
- fs->wp = fs->w->active;
- return (0);
- }
+ if (wp == NULL)
+ goto unknown_pane;
/* We now know the window and pane. */
fs->w = wp->window;
fs->wp = wp;
/* Find the best session and winlink. */
- if (cmd_find_best_session_with_window(fs) != 0)
+ if (cmd_find_best_session_with_window(fs) != 0) {
+ if (wp != NULL) {
+ /*
+ * The window may have been destroyed but the pane
+ * still on all_window_panes due to something else
+ * holding a reference.
+ */
+ goto unknown_pane;
+ }
return (-1);
+ }
+ return (0);
+
+unknown_pane:
+ fs->s = cmd_find_best_session(NULL, 0, fs->flags);
+ if (fs->s == NULL)
+ return (-1);
+ fs->wl = fs->s->curw;
+ fs->idx = fs->wl->idx;
+ fs->w = fs->wl->window;
+ fs->wp = fs->w->active;
return (0);
}