Skip to content

Commit

Permalink
Add two new values for the destroy-unattached option to destroy sessions
Browse files Browse the repository at this point in the history
only if they are not members of sessions groups, from Mark Huang, GitHub
issue 3806.
  • Loading branch information
nicm committed Feb 13, 2024
1 parent 4bdb855 commit 40b97b1
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 9 deletions.
8 changes: 6 additions & 2 deletions options-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,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_destroy_unattached_list[] = {
"off", "on", "keep-last", "keep-group", NULL
};
static const char *options_table_detach_on_destroy_list[] = {
"off", "on", "no-detached", "previous", "next", NULL
};
Expand Down Expand Up @@ -484,11 +487,12 @@ const struct options_table_entry options_table[] = {
},

{ .name = "destroy-unattached",
.type = OPTIONS_TABLE_FLAG,
.type = OPTIONS_TABLE_CHOICE,
.scope = OPTIONS_TABLE_SESSION,
.choices = options_table_destroy_unattached_list,
.default_num = 0,
.text = "Whether to destroy sessions when they have no attached "
"clients."
"clients, or keep the last session whether in the group."
},

{ .name = "detach-on-destroy",
Expand Down
2 changes: 1 addition & 1 deletion proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ proc_event_cb(__unused int fd, short events, void *arg)
log_debug("peer %p message %d", peer, imsg.hdr.type);

if (peer_check_version(peer, &imsg) != 0) {
int fd = imsg_get_fd(&imsg);
fd = imsg_get_fd(&imsg);
if (fd != -1)
close(fd);
imsg_free(&imsg);
Expand Down
22 changes: 19 additions & 3 deletions server-fn.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,8 @@ server_destroy_session(struct session *s)
void
server_check_unattached(void)
{
struct session *s;
struct session *s;
struct session_group *sg;

/*
* If any sessions are no longer attached and have destroy-unattached
Expand All @@ -463,8 +464,23 @@ server_check_unattached(void)
RB_FOREACH(s, sessions, &sessions) {
if (s->attached != 0)
continue;
if (options_get_number (s->options, "destroy-unattached"))
session_destroy(s, 1, __func__);
switch (options_get_number(s->options, "destroy-unattached")) {
case 0: /* off */
continue;
case 1: /* on */
break;
case 2: /* keep-last */
sg = session_group_contains(s);
if (sg == NULL || session_group_count(sg) <= 1)
continue;
break;
case 3: /* keep-group */
sg = session_group_contains(s);
if (sg != NULL && session_group_count(sg) == 1)
continue;
break;
}
session_destroy(s, 1, __func__);
}
}

Expand Down
16 changes: 13 additions & 3 deletions tmux.1
Original file line number Diff line number Diff line change
Expand Up @@ -4023,10 +4023,20 @@ The value is the width and height separated by an
character.
The default is 80x24.
.It Xo Ic destroy-unattached
.Op Ic on | off
.Op Ic off | on | keep-last | keep-group
.Xc
If enabled and the session is no longer attached to any clients, it is
destroyed.
If
.Ic on ,
destroy the session after the last client has detached.
If
.Ic off
(the default), leave the session orphaned.
If
.Ic keep-last ,
destroy the session only if it is in a group and has other sessions in that group.
If
.Ic keep-group ,
destroy the session unless it is in a group and is the only session in that group.
.It Xo Ic detach-on-destroy
.Op Ic off | on | no-detached | previous | next
.Xc
Expand Down

0 comments on commit 40b97b1

Please sign in to comment.