From 4e6b04f2c268ceabdda1599edf859a334505126c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sat, 11 Dec 2010 18:39:26 +0000 Subject: Track the last session for a client and add a flag to switch-client and a key binding (L) to move a client back to its last session. --- usr.bin/tmux/cmd-new-session.c | 10 ++++++++- usr.bin/tmux/cmd-switch-client.c | 46 +++++++++++++++++++++++++++++++--------- usr.bin/tmux/key-bindings.c | 3 ++- usr.bin/tmux/server-client.c | 3 ++- usr.bin/tmux/server-fn.c | 3 ++- usr.bin/tmux/tmux.1 | 12 +++++++---- usr.bin/tmux/tmux.h | 3 ++- 7 files changed, 61 insertions(+), 19 deletions(-) (limited to 'usr.bin/tmux') diff --git a/usr.bin/tmux/cmd-new-session.c b/usr.bin/tmux/cmd-new-session.c index cce9c8d0dec..b578ad74f7d 100644 --- a/usr.bin/tmux/cmd-new-session.c +++ b/usr.bin/tmux/cmd-new-session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-new-session.c,v 1.30 2010/06/27 02:56:59 nicm Exp $ */ +/* $OpenBSD: cmd-new-session.c,v 1.31 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -279,9 +279,17 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx) if (!detached) { if (ctx->cmdclient != NULL) { server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); + if (ctx->cmdclient->session != NULL) { + session_index(ctx->cmdclient->session, + &ctx->cmdclient->last_session); + } ctx->cmdclient->session = s; server_redraw_client(ctx->cmdclient); } else { + if (ctx->curclient->session != NULL) { + session_index(ctx->curclient->session, + &ctx->curclient->last_session); + } ctx->curclient->session = s; server_redraw_client(ctx->curclient); } diff --git a/usr.bin/tmux/cmd-switch-client.c b/usr.bin/tmux/cmd-switch-client.c index 4f9a6d12cb7..51329327a59 100644 --- a/usr.bin/tmux/cmd-switch-client.c +++ b/usr.bin/tmux/cmd-switch-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-switch-client.c,v 1.7 2010/09/26 20:43:30 nicm Exp $ */ +/* $OpenBSD: cmd-switch-client.c,v 1.8 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -36,13 +36,14 @@ size_t cmd_switch_client_print(struct cmd *, char *, size_t); struct cmd_switch_client_data { char *name; char *target; + int flag_last; int flag_next; int flag_previous; }; const struct cmd_entry cmd_switch_client_entry = { "switch-client", "switchc", - "[-np] [-c target-client] [-t target-session]", + "[-lnp] [-c target-client] [-t target-session]", 0, "", cmd_switch_client_init, cmd_switch_client_parse, @@ -59,6 +60,7 @@ cmd_switch_client_init(struct cmd *self, int key) self->data = data = xmalloc(sizeof *data); data->name = NULL; data->target = NULL; + data->flag_last = 0; data->flag_next = 0; data->flag_previous = 0; @@ -69,6 +71,9 @@ cmd_switch_client_init(struct cmd *self, int key) case ')': data->flag_next = 1; break; + case 'L': + data->flag_last = 1; + break; } } @@ -81,28 +86,36 @@ cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause) self->entry->init(self, KEYC_NONE); data = self->data; - while ((opt = getopt(argc, argv, "c:t:")) != -1) { + while ((opt = getopt(argc, argv, "c:lnpt:")) != -1) { switch (opt) { case 'c': if (data->name == NULL) data->name = xstrdup(optarg); break; - case 't': - if (data->flag_next || data->flag_previous) + case 'l': + if (data->flag_next || data->flag_previous || + data->target != NULL) goto usage; - if (data->target == NULL) - data->target = xstrdup(optarg); + data->flag_last = 1; break; case 'n': - if (data->flag_previous || data->target != NULL) + if (data->flag_previous || data->flag_last || + data->target != NULL) goto usage; data->flag_next = 1; break; case 'p': - if (data->flag_next || data->target != NULL) + if (data->flag_next || data->flag_last || + data->target != NULL) goto usage; data->flag_next = 1; break; + case 't': + if (data->flag_next || data->flag_previous) + goto usage; + if (data->target == NULL) + data->target = xstrdup(optarg); + break; default: goto usage; } @@ -134,6 +147,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) if ((c = cmd_find_client(ctx, data->name)) == NULL) return (-1); + s = NULL; if (data->flag_next) { if ((s = session_next_session(c->session)) == NULL) { ctx->error(ctx, "can't find next session"); @@ -144,11 +158,21 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) ctx->error(ctx, "can't find previous session"); return (-1); } + } else if (data->flag_last) { + if (c->last_session != UINT_MAX && + c->last_session < ARRAY_LENGTH(&sessions)) + s = ARRAY_ITEM(&sessions, c->last_session); + if (s == NULL) { + ctx->error(ctx, "can't find last session"); + return (-1); + } } else s = cmd_find_session(ctx, data->target); - if (s == NULL) return (-1); + + if (c->session != NULL) + session_index(c->session, &c->last_session); c->session = s; recalculate_sizes(); @@ -179,6 +203,8 @@ cmd_switch_client_print(struct cmd *self, char *buf, size_t len) off += xsnprintf(buf, len, "%s", self->entry->name); if (data == NULL) return (off); + if (off < len && data->flag_last) + off += xsnprintf(buf + off, len - off, "%s", " -l"); if (off < len && data->flag_next) off += xsnprintf(buf + off, len - off, "%s", " -n"); if (off < len && data->flag_previous) diff --git a/usr.bin/tmux/key-bindings.c b/usr.bin/tmux/key-bindings.c index 65ba02d9ab3..5ee73b7e4ff 100644 --- a/usr.bin/tmux/key-bindings.c +++ b/usr.bin/tmux/key-bindings.c @@ -1,4 +1,4 @@ -/* $OpenBSD: key-bindings.c,v 1.25 2010/10/23 13:04:34 nicm Exp $ */ +/* $OpenBSD: key-bindings.c,v 1.26 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -128,6 +128,7 @@ key_bindings_init(void) { '=', 0, &cmd_choose_buffer_entry }, { '?', 0, &cmd_list_keys_entry }, { 'D', 0, &cmd_choose_client_entry }, + { 'L', 0, &cmd_switch_client_entry }, { '[', 0, &cmd_copy_mode_entry }, { '\'', 0, &cmd_command_prompt_entry }, { '\002', /* C-b */ 0, &cmd_send_prefix_entry }, diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index fc33dfad98e..e8f2b48c167 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.43 2010/12/11 16:05:57 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.44 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -78,6 +78,7 @@ server_client_create(int fd) c->title = NULL; c->session = NULL; + c->last_session = UINT_MAX; c->tty.sx = 80; c->tty.sy = 24; diff --git a/usr.bin/tmux/server-fn.c b/usr.bin/tmux/server-fn.c index 89597fe5934..45c9a762058 100644 --- a/usr.bin/tmux/server-fn.c +++ b/usr.bin/tmux/server-fn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-fn.c,v 1.44 2010/10/09 12:58:00 nicm Exp $ */ +/* $OpenBSD: server-fn.c,v 1.45 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -399,6 +399,7 @@ server_destroy_session(struct session *s) c->session = NULL; c->flags |= CLIENT_EXIT; } else { + c->last_session = UINT_MAX; c->session = s_new; server_redraw_client(c); } diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 01a37f4ffff..2cf9ff13c45 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.193 2010/12/10 21:01:38 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.194 2010/12/11 18:39:25 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 10 2010 $ +.Dd $Mdocdate: December 11 2010 $ .Dt TMUX 1 .Os .Sh NAME @@ -282,6 +282,8 @@ Briefly display pane indexes. Force redraw of the attached client. .It s Select a new session for the attached client interactively. +.It L +Switch the attached client back to the last session. .It t Show the time. .It w @@ -662,7 +664,7 @@ Suspend a client by sending .Dv SIGTSTP (tty stop). .It Xo Ic switch-client -.Op Fl np +.Op Fl lnp .Op Fl c Ar target-client .Op Fl t Ar target-session .Xc @@ -672,10 +674,12 @@ Switch the current session for client to .Ar target-session . If +.Fl l, .Fl n or .Fl p -is used, the client is moved to the next or previous session respectively. +is used, the client is moved to the last, next or previous session +respectively. .El .Sh WINDOWS AND PANES A diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index d116dbefe86..6ccdea89d1b 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.249 2010/12/11 16:05:57 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.250 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1155,6 +1155,7 @@ struct client { struct mode_key_data prompt_mdata; struct session *session; + u_int last_session; int references; }; -- cgit v1.2.3