diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2010-06-27 00:22:22 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2010-06-27 00:22:22 +0000 |
commit | 26524c99f68959b5a0d1698529f332934061d424 (patch) | |
tree | 2004c96e4d9717882d291fd1bee4488f525c0dd7 /server-fn.c | |
parent | 34464da8d3f762ccca3ebfdc418e93f4c02997f1 (diff) | |
download | rtmux-26524c99f68959b5a0d1698529f332934061d424.tar.gz rtmux-26524c99f68959b5a0d1698529f332934061d424.tar.bz2 rtmux-26524c99f68959b5a0d1698529f332934061d424.zip |
New option, detach-on-destroy, to set what happens to a client when the session
it is attached to is destroyed. If on (the default), it is detached; if off, it
is switched to the most recently active session.
Diffstat (limited to 'server-fn.c')
-rw-r--r-- | server-fn.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/server-fn.c b/server-fn.c index 3a713686..74452fe8 100644 --- a/server-fn.c +++ b/server-fn.c @@ -24,7 +24,8 @@ #include "tmux.h" -void server_callback_identify(int, short, void *); +struct session *server_next_session(struct session *); +void server_callback_identify(int, short, void *); void server_fill_environ(struct session *s, struct environ *env) @@ -358,18 +359,47 @@ server_destroy_session_group(struct session *s) } } +struct session * +server_next_session(struct session *s) +{ + struct session *s_loop, *s_out; + u_int i; + + s_out = NULL; + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + s_loop = ARRAY_ITEM(&sessions, i); + if (s_loop == s) + 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; u_int i; + if (!options_get_number(&s->options, "detach-on-destroy")) + s_new = server_next_session(s); + else + s_new = NULL; + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { c = ARRAY_ITEM(&clients, i); if (c == NULL || c->session != s) continue; - c->session = NULL; - server_write_client(c, MSG_EXIT, NULL, 0); + if (s_new == NULL) { + c->session = NULL; + server_write_client(c, MSG_EXIT, NULL, 0); + } else { + c->session = s_new; + server_redraw_client(c); + } } recalculate_sizes(); } |