Similar to attach-session, make switch-client -t accept a window and
authornicm <nicm@openbsd.org>
Thu, 9 Jan 2014 14:28:14 +0000 (14:28 +0000)
committernicm <nicm@openbsd.org>
Thu, 9 Jan 2014 14:28:14 +0000 (14:28 +0000)
pane. From Johannes Jakobsson.

usr.bin/tmux/cmd-switch-client.c

index 2a2e827..c5e2385 100644 (file)
@@ -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;