From c6c8f77bc03e48eae5b4c9b8bcbd9477d769a19a Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 10 Jun 2026 14:06:45 +0000 Subject: [PATCH] While grouped sessions are being killed, it can leave session which are not really useful as targets (no active pane or current window) in the tree. Make cmd_find_best_session skip these. GitHub issue 5167. --- cmd-find.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cmd-find.c b/cmd-find.c index 761f133f..88a276b3 100644 --- a/cmd-find.c +++ b/cmd-find.c @@ -148,6 +148,18 @@ cmd_find_session_better(struct session *s, struct session *than, int flags) return (timercmp(&s->activity_time, &than->activity_time, >)); } +/* Can this session be usefully targeted? */ +static int +cmd_find_session_valid(struct session *s) +{ + if (!session_alive(s) || + s->curw == NULL || + s->curw->window == NULL || + s->curw->window->active == NULL) + return (0); + return (1); +} + /* Find best session from a list, or all if list is NULL. */ static struct session * cmd_find_best_session(struct session **slist, u_int ssize, int flags) @@ -160,11 +172,15 @@ cmd_find_best_session(struct session **slist, u_int ssize, int flags) s = NULL; if (slist != NULL) { for (i = 0; i < ssize; i++) { + if (!cmd_find_session_valid(slist[i])) + continue; if (cmd_find_session_better(slist[i], s, flags)) s = slist[i]; } } else { RB_FOREACH(s_loop, sessions, &sessions) { + if (!cmd_find_session_valid(s_loop)) + continue; if (cmd_find_session_better(s_loop, s, flags)) s = s_loop; }