diff options
Diffstat (limited to 'usr.bin/tmux/cmd-switch-client.c')
-rw-r--r-- | usr.bin/tmux/cmd-switch-client.c | 46 |
1 files changed, 36 insertions, 10 deletions
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 <nicm@users.sourceforge.net> @@ -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) |