=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-switch-client.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/tmux/cmd-switch-client.c 2010/09/26 20:43:30 1.7 --- src/usr.bin/tmux/cmd-switch-client.c 2010/12/11 18:39:25 1.8 *************** *** 1,4 **** ! /* $OpenBSD: cmd-switch-client.c,v 1.7 2010/09/26 20:43:30 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-switch-client.c,v 1.8 2010/12/11 18:39:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 36,48 **** struct cmd_switch_client_data { char *name; char *target; int flag_next; int flag_previous; }; const struct cmd_entry cmd_switch_client_entry = { "switch-client", "switchc", ! "[-np] [-c target-client] [-t target-session]", 0, "", cmd_switch_client_init, cmd_switch_client_parse, --- 36,49 ---- 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", ! "[-lnp] [-c target-client] [-t target-session]", 0, "", cmd_switch_client_init, cmd_switch_client_parse, *************** *** 59,64 **** --- 60,66 ---- 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,74 **** --- 71,79 ---- case ')': data->flag_next = 1; break; + case 'L': + data->flag_last = 1; + break; } } *************** *** 81,108 **** self->entry->init(self, KEYC_NONE); data = self->data; ! while ((opt = getopt(argc, argv, "c:t:")) != -1) { switch (opt) { case 'c': if (data->name == NULL) data->name = xstrdup(optarg); break; ! case 't': ! if (data->flag_next || data->flag_previous) goto usage; ! if (data->target == NULL) ! data->target = xstrdup(optarg); break; case 'n': ! if (data->flag_previous || data->target != NULL) goto usage; data->flag_next = 1; break; case 'p': ! if (data->flag_next || data->target != NULL) goto usage; data->flag_next = 1; break; default: goto usage; } --- 86,121 ---- self->entry->init(self, KEYC_NONE); data = self->data; ! while ((opt = getopt(argc, argv, "c:lnpt:")) != -1) { switch (opt) { case 'c': if (data->name == NULL) data->name = xstrdup(optarg); break; ! case 'l': ! if (data->flag_next || data->flag_previous || ! data->target != NULL) goto usage; ! data->flag_last = 1; break; case 'n': ! if (data->flag_previous || data->flag_last || ! data->target != NULL) goto usage; data->flag_next = 1; break; case 'p': ! 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,139 **** --- 147,153 ---- 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,154 **** ctx->error(ctx, "can't find previous session"); return (-1); } } else s = cmd_find_session(ctx, data->target); - if (s == NULL) return (-1); c->session = s; recalculate_sizes(); --- 158,178 ---- 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,184 **** --- 203,210 ---- 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)