diff options
author | nicm <nicm> | 2015-10-22 11:23:00 +0000 |
---|---|---|
committer | nicm <nicm> | 2015-10-22 11:23:00 +0000 |
commit | 3ebcf25149d75977ea97e9d4f786e0508d1a0d5e (patch) | |
tree | 8250194fa5ed8b55e90165ab6152cca28700cb36 /cmd-find.c | |
parent | a05c27a7e1c4d43709817d6746a510f16c960b4b (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.c | 33 |
1 files changed, 22 insertions, 11 deletions
@@ -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); } |