mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add two new values for the destroy-unattached option to destroy sessions
only if they are not members of sessions groups, from Mark Huang, GitHub issue 3806.
This commit is contained in:
		@@ -85,6 +85,9 @@ static const char *options_table_window_size_list[] = {
 | 
				
			|||||||
static const char *options_table_remain_on_exit_list[] = {
 | 
					static const char *options_table_remain_on_exit_list[] = {
 | 
				
			||||||
	"off", "on", "failed", NULL
 | 
						"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[] = {
 | 
					static const char *options_table_detach_on_destroy_list[] = {
 | 
				
			||||||
	"off", "on", "no-detached", "previous", "next", NULL
 | 
						"off", "on", "no-detached", "previous", "next", NULL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -484,11 +487,12 @@ const struct options_table_entry options_table[] = {
 | 
				
			|||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{ .name = "destroy-unattached",
 | 
						{ .name = "destroy-unattached",
 | 
				
			||||||
	  .type = OPTIONS_TABLE_FLAG,
 | 
						  .type = OPTIONS_TABLE_CHOICE,
 | 
				
			||||||
	  .scope = OPTIONS_TABLE_SESSION,
 | 
						  .scope = OPTIONS_TABLE_SESSION,
 | 
				
			||||||
 | 
						  .choices = options_table_destroy_unattached_list,
 | 
				
			||||||
	  .default_num = 0,
 | 
						  .default_num = 0,
 | 
				
			||||||
	  .text = "Whether to destroy sessions when they have no attached "
 | 
						  .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",
 | 
						{ .name = "detach-on-destroy",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								proc.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								proc.c
									
									
									
									
									
								
							@@ -92,7 +92,7 @@ proc_event_cb(__unused int fd, short events, void *arg)
 | 
				
			|||||||
			log_debug("peer %p message %d", peer, imsg.hdr.type);
 | 
								log_debug("peer %p message %d", peer, imsg.hdr.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (peer_check_version(peer, &imsg) != 0) {
 | 
								if (peer_check_version(peer, &imsg) != 0) {
 | 
				
			||||||
				int fd = imsg_get_fd(&imsg);
 | 
									fd = imsg_get_fd(&imsg);
 | 
				
			||||||
				if (fd != -1)
 | 
									if (fd != -1)
 | 
				
			||||||
					close(fd);
 | 
										close(fd);
 | 
				
			||||||
				imsg_free(&imsg);
 | 
									imsg_free(&imsg);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								server-fn.c
									
									
									
									
									
								
							@@ -454,7 +454,8 @@ server_destroy_session(struct session *s)
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
server_check_unattached(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
 | 
						 * If any sessions are no longer attached and have destroy-unattached
 | 
				
			||||||
@@ -463,8 +464,23 @@ server_check_unattached(void)
 | 
				
			|||||||
	RB_FOREACH(s, sessions, &sessions) {
 | 
						RB_FOREACH(s, sessions, &sessions) {
 | 
				
			||||||
		if (s->attached != 0)
 | 
							if (s->attached != 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (options_get_number (s->options, "destroy-unattached"))
 | 
							switch (options_get_number(s->options, "destroy-unattached")) {
 | 
				
			||||||
			session_destroy(s, 1, __func__);
 | 
							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__);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tmux.1
									
									
									
									
									
								
							@@ -4023,10 +4023,20 @@ The value is the width and height separated by an
 | 
				
			|||||||
character.
 | 
					character.
 | 
				
			||||||
The default is 80x24.
 | 
					The default is 80x24.
 | 
				
			||||||
.It Xo Ic destroy-unattached
 | 
					.It Xo Ic destroy-unattached
 | 
				
			||||||
.Op Ic on | off
 | 
					.Op Ic off | on | keep-last | keep-group
 | 
				
			||||||
.Xc
 | 
					.Xc
 | 
				
			||||||
If enabled and the session is no longer attached to any clients, it is
 | 
					If
 | 
				
			||||||
destroyed.
 | 
					.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
 | 
					.It Xo Ic detach-on-destroy
 | 
				
			||||||
.Op Ic off | on | no-detached | previous | next
 | 
					.Op Ic off | on | no-detached | previous | next
 | 
				
			||||||
.Xc
 | 
					.Xc
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user