summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2021-02-01 08:01:14 +0000
committernicm <nicm>2021-02-01 08:01:14 +0000
commit509221520c87510016f5c90aeea0d4dcc4b74a98 (patch)
treea006a5c8f78a2f0c725f9c11335fed1a21e8fb54
parent255802d8d7357bf985bf2e4221eac8ab64b348ea (diff)
Add a no-detached choice to detach-on-destroy which detaches only if
there are no other detached sessions to switch to, from Sencer Selcuk in GitHub issue 2553.
-rw-r--r--options-table.c6
-rw-r--r--server-fn.c25
-rw-r--r--tmux.16
3 files changed, 31 insertions, 6 deletions
diff --git a/options-table.c b/options-table.c
index 74a59134..9fc69db5 100644
--- a/options-table.c
+++ b/options-table.c
@@ -72,6 +72,9 @@ static const char *options_table_window_size_list[] = {
static const char *options_table_remain_on_exit_list[] = {
"off", "on", "failed", NULL
};
+static const char *options_table_detach_on_destroy_list[] = {
+ "off", "on", "no-detached", NULL
+};
/* Status line format. */
#define OPTIONS_TABLE_STATUS_FORMAT1 \
@@ -405,8 +408,9 @@ const struct options_table_entry options_table[] = {
},
{ .name = "detach-on-destroy",
- .type = OPTIONS_TABLE_FLAG,
+ .type = OPTIONS_TABLE_CHOICE,
.scope = OPTIONS_TABLE_SESSION,
+ .choices = options_table_detach_on_destroy_list,
.default_num = 1,
.text = "Whether to detach when a session is destroyed, or switch "
"the client to another session if any exist."
diff --git a/server-fn.c b/server-fn.c
index d0e06c0f..4358fa5c 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -401,9 +401,8 @@ server_destroy_session_group(struct session *s)
static struct session *
server_next_session(struct session *s)
{
- struct session *s_loop, *s_out;
+ struct session *s_loop, *s_out = NULL;
- s_out = NULL;
RB_FOREACH(s_loop, sessions, &sessions) {
if (s_loop == s)
continue;
@@ -414,17 +413,35 @@ server_next_session(struct session *s)
return (s_out);
}
+static struct session *
+server_next_detached_session(struct session *s)
+{
+ struct session *s_loop, *s_out = NULL;
+
+ RB_FOREACH(s_loop, sessions, &sessions) {
+ if (s_loop == s || s_loop->attached)
+ continue;
+ if (s_out == NULL ||
+ timercmp(&s_loop->activity_time, &s_out->activity_time, <))
+ s_out = s_loop;
+ }
+ return (s_out);
+}
+
void
server_destroy_session(struct session *s)
{
struct client *c;
struct session *s_new;
+ int detach_on_destroy;
- if (!options_get_number(s->options, "detach-on-destroy"))
+ detach_on_destroy = options_get_number(s->options, "detach-on-destroy");
+ if (detach_on_destroy == 0)
s_new = server_next_session(s);
+ else if (detach_on_destroy == 2)
+ s_new = server_next_detached_session(s);
else
s_new = NULL;
-
TAILQ_FOREACH(c, &clients, entry) {
if (c->session != s)
continue;
diff --git a/tmux.1 b/tmux.1
index 247f0fb6..12d555e5 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3575,12 +3575,16 @@ The default is 80x24.
If enabled and the session is no longer attached to any clients, it is
destroyed.
.It Xo Ic detach-on-destroy
-.Op Ic on | off
+.Op Ic off | on | no-detached
.Xc
If on (the default), the client is detached when the session it is attached to
is destroyed.
If off, the client is switched to the most recently active of the remaining
sessions.
+If
+.Ic no-detached ,
+the client is detached only if there are no detached sessions; if detached
+sessions exist, the client is switched to the most recently active.
.It Ic display-panes-active-colour Ar colour
Set the colour used by the
.Ic display-panes