Two new options:

- server option "exit-unattached" makes the server exit when no clients
  are attached, even if sessions are present;

- session option "destroy-unattached" destroys a session once no clients
  are attached to it.

These are useful for preventing tmux remaining in the background where
it is undesirable and when using tmux as a login shell to keep a limit
on new sessions.
This commit is contained in:
Nicholas Marriott 2010-09-26 20:43:30 +00:00
parent 66152010a7
commit 9a7cde0c9b
8 changed files with 38 additions and 4 deletions

View File

@ -75,6 +75,7 @@ const char *set_option_bell_action_list[] = {
const struct set_option_entry set_option_table[] = { const struct set_option_entry set_option_table[] = {
{ "escape-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, { "escape-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "exit-unattached", SET_OPTION_FLAG, 0, 0, NULL },
{ "quiet", SET_OPTION_FLAG, 0, 0, NULL }, { "quiet", SET_OPTION_FLAG, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL } { NULL, 0, 0, 0, NULL }
}; };
@ -87,6 +88,7 @@ const struct set_option_entry set_session_option_table[] = {
{ "default-path", SET_OPTION_STRING, 0, 0, NULL }, { "default-path", SET_OPTION_STRING, 0, 0, NULL },
{ "default-shell", SET_OPTION_STRING, 0, 0, NULL }, { "default-shell", SET_OPTION_STRING, 0, 0, NULL },
{ "default-terminal", SET_OPTION_STRING, 0, 0, NULL }, { "default-terminal", SET_OPTION_STRING, 0, 0, NULL },
{ "destroy-unattached", SET_OPTION_FLAG, 0, 0, NULL },
{ "detach-on-destroy", SET_OPTION_FLAG, 0, 0, NULL }, { "detach-on-destroy", SET_OPTION_FLAG, 0, 0, NULL },
{ "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL }, { "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL },
{ "display-panes-active-colour", SET_OPTION_COLOUR, 0, 0, NULL }, { "display-panes-active-colour", SET_OPTION_COLOUR, 0, 0, NULL },

View File

@ -152,6 +152,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
c->session = s; c->session = s;
recalculate_sizes(); recalculate_sizes();
server_check_unattached();
server_redraw_client(c); server_redraw_client(c);
return (0); return (0);

View File

@ -185,6 +185,7 @@ server_client_lost(struct client *c)
c->flags |= CLIENT_DEAD; c->flags |= CLIENT_DEAD;
recalculate_sizes(); recalculate_sizes();
server_check_unattached();
server_update_socket(); server_update_socket();
} }

View File

@ -404,6 +404,25 @@ server_destroy_session(struct session *s)
recalculate_sizes(); recalculate_sizes();
} }
void
server_check_unattached (void)
{
struct session *s;
u_int i;
/*
* If any sessions are no longer attached and have destroy-unattached
* set, collect them.
*/
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
s = ARRAY_ITEM(&sessions, i);
if (s == NULL || !(s->flags & SESSION_UNATTACHED))
continue;
if (options_get_number (&s->options, "destroy-unattached"))
session_destroy(s);
}
}
void void
server_set_identify(struct client *c) server_set_identify(struct client *c)
{ {

View File

@ -222,15 +222,17 @@ server_loop(void)
} }
} }
/* Check if the server should be shutting down (no more clients or windows). */ /* Check if the server should be shutting down (no more clients or sessions). */
int int
server_should_shutdown(void) server_should_shutdown(void)
{ {
u_int i; u_int i;
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { if (!options_get_number(&global_options, "exit-unattached")) {
if (ARRAY_ITEM(&sessions, i) != NULL) for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
return (0); if (ARRAY_ITEM(&sessions, i) != NULL)
return (0);
}
} }
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
if (ARRAY_ITEM(&clients, i) != NULL) if (ARRAY_ITEM(&clients, i) != NULL)

6
tmux.1
View File

@ -1587,6 +1587,9 @@ Set the time in milliseconds for which
waits after an escape is input to determine if it is part of a function or meta waits after an escape is input to determine if it is part of a function or meta
key sequences. key sequences.
The default is 500 milliseconds. The default is 500 milliseconds.
.It Ic exit-unattached
If enabled, the server will exit when there are no attached clients, rather
than when there are no attached sessions.
.It Ic quiet .It Ic quiet
Enable or disable the display of various informational messages (see also the Enable or disable the display of various informational messages (see also the
.Fl q .Fl q
@ -1659,6 +1662,9 @@ to work correctly, this
be set to be set to
.Ql screen .Ql screen
or a derivative of it. or a derivative of it.
.It Ic destroy-unattached
If enabled and the session is no longer attached to any clients, it is
destroyed.
.It Ic detach-on-destroy .It Ic detach-on-destroy
If on (the default), the client is detached when the session it is attached to If on (the default), the client is detached when the session it is attached to
is destroyed. is destroyed.

2
tmux.c
View File

@ -331,6 +331,7 @@ main(int argc, char **argv)
oo = &global_options; oo = &global_options;
options_set_number(oo, "quiet", quiet); options_set_number(oo, "quiet", quiet);
options_set_number(oo, "escape-time", 500); options_set_number(oo, "escape-time", 500);
options_set_number(oo, "exit-unattached", 0);
options_init(&global_s_options, NULL); options_init(&global_s_options, NULL);
so = &global_s_options; so = &global_s_options;
@ -341,6 +342,7 @@ main(int argc, char **argv)
options_set_string(so, "default-path", "%s", ""); options_set_string(so, "default-path", "%s", "");
options_set_string(so, "default-shell", "%s", getshell()); options_set_string(so, "default-shell", "%s", getshell());
options_set_string(so, "default-terminal", "screen"); options_set_string(so, "default-terminal", "screen");
options_set_number(so, "destroy-unattached", 0);
options_set_number(so, "detach-on-destroy", 1); options_set_number(so, "detach-on-destroy", 1);
options_set_number(so, "display-panes-active-colour", 1); options_set_number(so, "display-panes-active-colour", 1);
options_set_number(so, "display-panes-colour", 4); options_set_number(so, "display-panes-colour", 4);

1
tmux.h
View File

@ -1661,6 +1661,7 @@ void server_unlink_window(struct session *, struct winlink *);
void server_destroy_pane(struct window_pane *); void server_destroy_pane(struct window_pane *);
void server_destroy_session_group(struct session *); void server_destroy_session_group(struct session *);
void server_destroy_session(struct session *); void server_destroy_session(struct session *);
void server_check_unattached (void);
void server_set_identify(struct client *); void server_set_identify(struct client *);
void server_clear_identify(struct client *); void server_clear_identify(struct client *);
void server_update_event(struct client *); void server_update_event(struct client *);