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.
This commit is contained in:
Nicholas Marriott 2010-12-11 18:42:20 +00:00
parent d227a2e661
commit 5fcd6711e4
7 changed files with 64 additions and 22 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-new-session.c,v 1.78 2010-07-02 02:49:19 tcunha Exp $ */ /* $Id: cmd-new-session.c,v 1.79 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -279,9 +279,17 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
if (!detached) { if (!detached) {
if (ctx->cmdclient != NULL) { if (ctx->cmdclient != NULL) {
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); 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; ctx->cmdclient->session = s;
server_redraw_client(ctx->cmdclient); server_redraw_client(ctx->cmdclient);
} else { } else {
if (ctx->curclient->session != NULL) {
session_index(ctx->curclient->session,
&ctx->curclient->last_session);
}
ctx->curclient->session = s; ctx->curclient->session = s;
server_redraw_client(ctx->curclient); server_redraw_client(ctx->curclient);
} }

View File

@ -1,4 +1,4 @@
/* $Id: cmd-switch-client.c,v 1.21 2010-10-09 14:29:32 tcunha Exp $ */ /* $Id: cmd-switch-client.c,v 1.22 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * 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 { struct cmd_switch_client_data {
char *name; char *name;
char *target; char *target;
int flag_last;
int flag_next; int flag_next;
int flag_previous; int flag_previous;
}; };
const struct cmd_entry cmd_switch_client_entry = { const struct cmd_entry cmd_switch_client_entry = {
"switch-client", "switchc", "switch-client", "switchc",
"[-np] [-c target-client] [-t target-session]", "[-lnp] [-c target-client] [-t target-session]",
0, "", 0, "",
cmd_switch_client_init, cmd_switch_client_init,
cmd_switch_client_parse, cmd_switch_client_parse,
@ -59,6 +60,7 @@ cmd_switch_client_init(struct cmd *self, int key)
self->data = data = xmalloc(sizeof *data); self->data = data = xmalloc(sizeof *data);
data->name = NULL; data->name = NULL;
data->target = NULL; data->target = NULL;
data->flag_last = 0;
data->flag_next = 0; data->flag_next = 0;
data->flag_previous = 0; data->flag_previous = 0;
@ -69,6 +71,9 @@ cmd_switch_client_init(struct cmd *self, int key)
case ')': case ')':
data->flag_next = 1; data->flag_next = 1;
break; 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); self->entry->init(self, KEYC_NONE);
data = self->data; data = self->data;
while ((opt = getopt(argc, argv, "c:t:")) != -1) { while ((opt = getopt(argc, argv, "c:lnpt:")) != -1) {
switch (opt) { switch (opt) {
case 'c': case 'c':
if (data->name == NULL) if (data->name == NULL)
data->name = xstrdup(optarg); data->name = xstrdup(optarg);
break; 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': case 't':
if (data->flag_next || data->flag_previous) if (data->flag_next || data->flag_previous)
goto usage; goto usage;
if (data->target == NULL) if (data->target == NULL)
data->target = xstrdup(optarg); data->target = xstrdup(optarg);
break; 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: default:
goto usage; 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) if ((c = cmd_find_client(ctx, data->name)) == NULL)
return (-1); return (-1);
s = NULL;
if (data->flag_next) { if (data->flag_next) {
if ((s = session_next_session(c->session)) == NULL) { if ((s = session_next_session(c->session)) == NULL) {
ctx->error(ctx, "can't find next session"); 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"); ctx->error(ctx, "can't find previous session");
return (-1); 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 } else
s = cmd_find_session(ctx, data->target); s = cmd_find_session(ctx, data->target);
if (s == NULL) if (s == NULL)
return (-1); return (-1);
if (c->session != NULL)
session_index(c->session, &c->last_session);
c->session = s; c->session = s;
recalculate_sizes(); 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); off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL) if (data == NULL)
return (off); return (off);
if (off < len && data->flag_last)
off += xsnprintf(buf + off, len - off, "%s", " -l");
if (off < len && data->flag_next) if (off < len && data->flag_next)
off += xsnprintf(buf + off, len - off, "%s", " -n"); off += xsnprintf(buf + off, len - off, "%s", " -n");
if (off < len && data->flag_previous) if (off < len && data->flag_previous)

View File

@ -1,4 +1,4 @@
/* $Id: key-bindings.c,v 1.96 2010-10-24 01:34:30 tcunha Exp $ */ /* $Id: key-bindings.c,v 1.97 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -128,6 +128,7 @@ key_bindings_init(void)
{ '=', 0, &cmd_choose_buffer_entry }, { '=', 0, &cmd_choose_buffer_entry },
{ '?', 0, &cmd_list_keys_entry }, { '?', 0, &cmd_list_keys_entry },
{ 'D', 0, &cmd_choose_client_entry }, { 'D', 0, &cmd_choose_client_entry },
{ 'L', 0, &cmd_switch_client_entry },
{ '[', 0, &cmd_copy_mode_entry }, { '[', 0, &cmd_copy_mode_entry },
{ '\'', 0, &cmd_command_prompt_entry }, { '\'', 0, &cmd_command_prompt_entry },
{ '\002', /* C-b */ 0, &cmd_send_prefix_entry }, { '\002', /* C-b */ 0, &cmd_send_prefix_entry },

View File

@ -1,4 +1,4 @@
/* $Id: server-client.c,v 1.46 2010-12-11 16:15:02 nicm Exp $ */ /* $Id: server-client.c,v 1.47 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -77,6 +77,7 @@ server_client_create(int fd)
c->title = NULL; c->title = NULL;
c->session = NULL; c->session = NULL;
c->last_session = UINT_MAX;
c->tty.sx = 80; c->tty.sx = 80;
c->tty.sy = 24; c->tty.sy = 24;

View File

@ -1,4 +1,4 @@
/* $Id: server-fn.c,v 1.113 2010-10-09 14:31:50 tcunha Exp $ */ /* $Id: server-fn.c,v 1.114 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -399,6 +399,7 @@ server_destroy_session(struct session *s)
c->session = NULL; c->session = NULL;
c->flags |= CLIENT_EXIT; c->flags |= CLIENT_EXIT;
} else { } else {
c->last_session = UINT_MAX;
c->session = s_new; c->session = s_new;
server_redraw_client(c); server_redraw_client(c);
} }

10
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.276 2010-12-10 21:19:13 nicm Exp $ .\" $Id: tmux.1,v 1.277 2010-12-11 18:42:20 nicm Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -286,6 +286,8 @@ Briefly display pane indexes.
Force redraw of the attached client. Force redraw of the attached client.
.It s .It s
Select a new session for the attached client interactively. Select a new session for the attached client interactively.
.It L
Switch the attached client back to the last session.
.It t .It t
Show the time. Show the time.
.It w .It w
@ -666,7 +668,7 @@ Suspend a client by sending
.Dv SIGTSTP .Dv SIGTSTP
(tty stop). (tty stop).
.It Xo Ic switch-client .It Xo Ic switch-client
.Op Fl np .Op Fl lnp
.Op Fl c Ar target-client .Op Fl c Ar target-client
.Op Fl t Ar target-session .Op Fl t Ar target-session
.Xc .Xc
@ -676,10 +678,12 @@ Switch the current session for client
to to
.Ar target-session . .Ar target-session .
If If
.Fl l,
.Fl n .Fl n
or or
.Fl p .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 .El
.Sh WINDOWS AND PANES .Sh WINDOWS AND PANES
A A

3
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.586 2010-12-11 16:15:02 nicm Exp $ */ /* $Id: tmux.h,v 1.587 2010-12-11 18:42:20 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1153,6 +1153,7 @@ struct client {
struct mode_key_data prompt_mdata; struct mode_key_data prompt_mdata;
struct session *session; struct session *session;
u_int last_session;
int references; int references;
}; };