Hi all, If I've done my job well, the commit message should be descriptive enough. Let me know if you'd like me to make any tweaks.
Have a good week! Daniel ---- >From 1e5676ea9420359e7de4ee49339a7d089fab7839 Mon Sep 17 00:00:00 2001 From: Daniel Ralston <wubbul...@gmail.com> Date: Tue, 16 Apr 2013 20:09:17 -0700 Subject: [PATCH] Add -T (make session "transient") option to new-session Transient sessions will be killed when no clients are attached to them. * Rationale: When switching to tmux, many people miss screen's ability to have multiple clients attached to a single session, without every client having to share the same view. tmux can approximate this behaviour by grouping clients' sessions using the -t option for new-session. But, each session that the user doesn't want anymore must be explicitly killed when its client is detached, or else the detached sessions will pile up in the background, unused. (One distasteful alternative is to use some sort of byzantine session-managing shell script.) The -T option solves this problem. For example, to mimic screen's behaviour as discussed above, the user might create a "master" session that is always kept in the background. When sessions are grouped with the master session and flagged as transient, they are killed and tidied up properly when their clients detach. This is especially handy for preventing clutter when, for example, the user absent-mindedly closes a client's terminal, killing it with a SIGHUP. Example: $ # Create the master session f necessary: $ tmux new-session -A -s TMUX_MASTER \; detach $ # Create the transient client: $ tmux -T -t TMUX_MASTER --- cmd-new-session.c | 9 +++++++-- server.c | 19 +++++++++++++++++++ tmux.1.in | 7 ++++++- tmux.h | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/cmd-new-session.c b/cmd-new-session.c index 4eebe63..0147933 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -35,8 +35,8 @@ enum cmd_retval cmd_new_session_exec(struct cmd *, struct cmd_q *); const struct cmd_entry cmd_new_session_entry = { "new-session", "new", - "AdDF:n:Ps:t:x:y:", 0, 1, - "[-AdDP] [-F format] [-n window-name] [-s session-name] " + "AdDF:n:Ps:t:Tx:y:", 0, 1, + "[-AdDPT] [-F format] [-n window-name] [-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] [-y height] [command]", CMD_STARTSERVER|CMD_CANTNEST|CMD_SENDENVIRON, NULL, @@ -193,6 +193,11 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq) } environ_free(&env); + /* Flag the session as transient if the -T flag is given */ + if (args_has(args, 'T')) { + s->flags |= SESSION_TRANSIENT; + } + /* Set the initial window name if one given. */ if (cmd != NULL && args_has(args, 'n')) { w = s->curw->window; diff --git a/server.c b/server.c index 4bfa918..7af0673 100644 --- a/server.c +++ b/server.c @@ -210,6 +210,7 @@ server_loop(void) server_client_loop(); key_bindings_clean(); + server_kill_transient(); server_clean_dead(); } } @@ -258,6 +259,24 @@ server_send_shutdown(void) } } +/* Kill all unattached sessions marked as transient. */ +void +server_kill_transient(void) +{ + struct session *s, *next_s; + + s = RB_MIN(sessions, &sessions); + while (s != NULL) { + next_s = RB_NEXT(sessions, &sessions, s); + if ((s->flags & SESSION_UNATTACHED) && + (s->flags & SESSION_TRANSIENT)) { + printf("Whadda faaaa?"); + session_destroy(s); + } + s = next_s; + } +} + /* Free dead, unreferenced clients and sessions. */ void server_clean_dead(void) diff --git a/tmux.1.in b/tmux.1.in index 98bf957..7797093 100644 --- a/tmux.1.in +++ b/tmux.1.in @@ -672,7 +672,7 @@ command. Lock all clients attached to .Ar target-session . .It Xo Ic new-session -.Op Fl AdDP +.Op Fl AdDPT .Op Fl F Ar format .Op Fl n Ar window-name .Op Fl s Ar session-name @@ -740,6 +740,11 @@ are invalid if is used. .Pp The +.Fl T +option makes the session "transient"; when all of its clients are +disconnected, it will be killed instead of detached. +.Pp +The .Fl P option prints information about the new session after it has been created. By default, it uses the format diff --git a/tmux.h b/tmux.h index f0b9edf..714c38f 100644 --- a/tmux.h +++ b/tmux.h @@ -1103,6 +1103,7 @@ struct session { struct options options; #define SESSION_UNATTACHED 0x1 /* not attached to any clients */ +#define SESSION_TRANSIENT 0x2 /* kill session when unattached */ int flags; struct termios *tio; -- 1.8.2.1 ------------------------------------------------------------------------------ Precog is a next-generation analytics platform capable of advanced analytics on semi-structured data. The platform includes APIs for building apps and a phenomenal toolset for data science. Developers can use our toolset for easy data analysis & visualization. Get a free account! http://www2.precog.com/precogplatform/slashdotnewsletter _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users