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.
This commit is contained in:
nicm 2015-10-22 11:23:00 +00:00
parent a05c27a7e1
commit 3ebcf25149

View File

@ -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);
}