summaryrefslogtreecommitdiffstats
path: root/server-fn.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2010-06-27 00:22:22 +0000
committerNicholas Marriott <nicm@openbsd.org>2010-06-27 00:22:22 +0000
commit26524c99f68959b5a0d1698529f332934061d424 (patch)
tree2004c96e4d9717882d291fd1bee4488f525c0dd7 /server-fn.c
parent34464da8d3f762ccca3ebfdc418e93f4c02997f1 (diff)
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.c36
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();
}