summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2014-01-09 14:28:15 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2014-01-09 14:28:15 +0000
commit5f7cafbeab44b6d06da053973bc1329acbb0376f (patch)
treec647aa66d37b7cfe4176c9a8e01e6e4321e25de5 /usr.bin
parentf3bee41d27907d391109d110c78126c5fc66ad5b (diff)
Similar to attach-session, make switch-client -t accept a window and
pane. From Johannes Jakobsson.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-switch-client.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/usr.bin/tmux/cmd-switch-client.c b/usr.bin/tmux/cmd-switch-client.c
index 2a2e82765d4..c5e2385aac0 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.18 2013/10/10 12:00:24 nicm Exp $ */
+/* $OpenBSD: cmd-switch-client.c,v 1.19 2014/01/09 14:28:14 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -59,9 +59,13 @@ cmd_switch_client_key_binding(struct cmd *self, int key)
enum cmd_retval
cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct client *c;
- struct session *s;
+ struct args *args = self->args;
+ struct client *c;
+ struct session *s;
+ struct winlink *wl = NULL;
+ struct window *w = NULL;
+ struct window_pane *wp = NULL;
+ const char *tflag;
if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
return (CMD_RETURN_ERROR);
@@ -76,7 +80,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
}
}
- s = NULL;
+ tflag = args_get(args, 't');
if (args_has(args, 'n')) {
if ((s = session_next_session(c->session)) == NULL) {
cmdq_error(cmdq, "can't find next session");
@@ -94,10 +98,33 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
cmdq_error(cmdq, "can't find last session");
return (CMD_RETURN_ERROR);
}
- } else
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
+ } else {
+ if (tflag == NULL) {
+ if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
+ return (CMD_RETURN_ERROR);
+ } else if (tflag[strcspn(tflag, ":.")] != '\0') {
+ if ((wl = cmd_find_pane(cmdq, tflag, &s, &wp)) == NULL)
+ return (CMD_RETURN_ERROR);
+ } else {
+ if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
+ return (CMD_RETURN_ERROR);
+ w = cmd_lookup_windowid(tflag);
+ if (w == NULL &&
+ (wp = cmd_lookup_paneid(tflag)) != NULL)
+ w = wp->window;
+ if (w != NULL)
+ wl = winlink_find_by_window(&s->windows, w);
+ }
+
+ if (cmdq->client == NULL)
+ return (CMD_RETURN_NORMAL);
+
+ if (wl != NULL) {
+ if (wp != NULL)
+ window_set_active_pane(wp->window, wp);
+ session_set_current(s, wl);
+ }
+ }
if (c->session != NULL)
c->last_session = c->session;