The branch, hooks has been updated
       via  7cf1251d8c7baccf27050caaefdc88b6b60e4147 (commit)
       via  cc6a0dfd3015e1d731e0422f1b25086ee0f43ffb (commit)
       via  e64e250660d7c0f68193da70861a4032ddba621a (commit)
      from  3016550b43d4bd77483f5f197e53a9323ec9fb66 (commit)

- Log -----------------------------------------------------------------
commit 7cf1251d8c7baccf27050caaefdc88b6b60e4147
Author: Nicholas Marriott <nicholas.marri...@gmail.com>
Commit: Nicholas Marriott <nicholas.marri...@gmail.com>

    Remove old flags for now, will add new one by one.
---
 cmd-attach-session.c   |    4 +---
 cmd-break-pane.c       |    6 ++----
 cmd-capture-pane.c     |    4 ++--
 cmd-choose-buffer.c    |    6 +++---
 cmd-choose-client.c    |    6 +++---
 cmd-choose-tree.c      |   13 +++++--------
 cmd-clear-history.c    |    7 ++++---
 cmd-clock-mode.c       |    7 ++++---
 cmd-command-prompt.c   |    4 ++--
 cmd-confirm-before.c   |    4 ++--
 cmd-copy-mode.c        |    5 +++--
 cmd-detach-client.c    |   10 ++++++----
 cmd-display-message.c  |   21 +++++++++++++--------
 cmd-display-panes.c    |    7 ++++---
 cmd-find-window.c      |    6 +++---
 cmd-has-session.c      |    8 +++++---
 cmd-if-shell.c         |   20 ++++++++++----------
 cmd-join-pane.c        |   13 ++++++-------
 cmd-kill-pane.c        |    6 +++---
 cmd-kill-session.c     |    4 ++--
 cmd-kill-window.c      |    8 ++++----
 cmd-list-clients.c     |   11 +++++++----
 cmd-list-keys.c        |    3 +--
 cmd-list-panes.c       |    8 ++++----
 cmd-list-windows.c     |    5 +++--
 cmd-lock-server.c      |   13 ++++++++-----
 cmd-move-window.c      |   13 ++++++-------
 cmd-new-session.c      |   11 ++++++-----
 cmd-new-window.c       |   13 +++++++------
 cmd-paste-buffer.c     |    7 +++----
 cmd-pipe-pane.c        |    5 ++---
 cmd-refresh-client.c   |    4 ++--
 cmd-rename-session.c   |    4 ++--
 cmd-rename-window.c    |    5 +++--
 cmd-resize-pane.c      |    5 ++---
 cmd-respawn-pane.c     |    6 ++----
 cmd-respawn-window.c   |    5 ++---
 cmd-rotate-window.c    |    5 +++--
 cmd-run-shell.c        |   14 +++++++++-----
 cmd-select-layout.c    |    8 ++++----
 cmd-select-pane.c      |   11 +++++------
 cmd-select-window.c    |   16 +++++++++-------
 cmd-send-keys.c        |    8 +++-----
 cmd-set-environment.c  |    4 ++--
 cmd-show-environment.c |    5 ++---
 cmd-show-messages.c    |    6 +++---
 cmd-show-options.c     |   10 ++++++----
 cmd-split-window.c     |   10 +++-------
 cmd-swap-pane.c        |    6 +++---
 cmd-swap-window.c      |   13 ++++++++-----
 cmd-switch-client.c    |    5 +----
 51 files changed, 208 insertions(+), 200 deletions(-)

diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 9335bdc..160f2a8 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -36,7 +36,7 @@ const struct cmd_entry cmd_attach_session_entry = {
        "attach-session", "attach",
        "c:drt:", 0, 0,
        "[-dr] [-c working-directory] " CMD_TARGET_SESSION_USAGE,
-       CMD_CANTNEST|CMD_STARTSERVER|CMD_PREPARESESSION,
+       CMD_CANTNEST|CMD_STARTSERVER,
        cmd_attach_session_exec
 };
 
@@ -76,8 +76,6 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int 
dflag, int rflag,
                if (w != NULL)
                        wl = winlink_find_by_window(&s->windows, w);
        }
-       if ((s = cmdq->state.s) == NULL)
-               return (CMD_RETURN_ERROR);
 
        if (cmdq->client == NULL)
                return (CMD_RETURN_NORMAL);
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index db59869..0025167 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -34,7 +34,7 @@ const struct cmd_entry cmd_break_pane_entry = {
        "break-pane", "breakp",
        "dPF:t:", 0, 0,
        "[-dP] [-F format] " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_break_pane_exec
 };
 
@@ -54,10 +54,8 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        const char              *template;
        char                    *cp;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
-       wp = cmdq->state.wp;
-       s = cmdq->state.s;
 
        if (window_count_panes(wl->window) == 1) {
                cmdq_error(cmdq, "can't break with only one pane");
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index dade852..ce60b4c 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_capture_pane_entry = {
        "ab:CeE:JpPqS:t:", 0, 0,
        "[-aCeJpPq] " CMD_BUFFER_USAGE " [-E end-line] [-S start-line]"
        CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_capture_pane_exec
 };
 
@@ -178,7 +178,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        const char              *bufname;
        size_t                   len;
 
-       if ((wp = cmdq->state.wp) == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
                return (CMD_RETURN_ERROR);
 
        len = 0;
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index 86d82d7..19f5fba 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -36,7 +36,7 @@ const struct cmd_entry cmd_choose_buffer_entry = {
        "choose-buffer", NULL,
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_choose_buffer_exec
 };
 
@@ -53,7 +53,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
        u_int                            idx;
        int                              utf8flag;
 
-       if ((c = cmdq->state.c) == NULL) {
+       if ((c = cmd_current_client(cmdq)) == NULL) {
                cmdq_error(cmdq, "no client available");
                return (CMD_RETURN_ERROR);
        }
@@ -61,7 +61,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
        if ((template = args_get(args, 'F')) == NULL)
                template = CHOOSE_BUFFER_TEMPLATE;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
        utf8flag = options_get_number(&wl->window->options, "utf8");
 
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index 5f3368d..5a1892f 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_choose_client_entry = {
        "choose-client", NULL,
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_choose_client_exec
 };
 
@@ -61,12 +61,12 @@ cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
        char                            *action;
        u_int                            i, idx, cur;
 
-       if ((c = cmdq->state.c) == NULL) {
+       if ((c = cmd_current_client(cmdq)) == NULL) {
                cmdq_error(cmdq, "no client available");
                return (CMD_RETURN_ERROR);
        }
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index 9de3cc2..823d042 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_choose_tree_entry = {
        "S:W:swub:c:t:", 0, 1,
        "[-suw] [-b session-template] [-c window template] [-S format] " \
        "[-W format] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_choose_tree_exec
 };
 
@@ -56,7 +56,7 @@ const struct cmd_entry cmd_choose_session_entry = {
        "choose-session", NULL,
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_choose_tree_exec
 };
 
@@ -64,7 +64,7 @@ const struct cmd_entry cmd_choose_window_entry = {
        "choose-window", NULL,
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE "[-F format] [template]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_choose_tree_exec
 };
 
@@ -87,15 +87,12 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
        ses_template = win_template = NULL;
        ses_action = win_action = NULL;
 
-       if ((c = cmdq->state.c) == NULL) {
+       if ((c = cmd_current_client(cmdq)) == NULL) {
                cmdq_error(cmdq, "no client available");
                return (CMD_RETURN_ERROR);
        }
 
-       if ((s = cmdq->state.c->session) == NULL)
-               return (CMD_RETURN_ERROR);
-
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
diff --git a/cmd-clear-history.c b/cmd-clear-history.c
index 0a9b3bb..e134288 100644
--- a/cmd-clear-history.c
+++ b/cmd-clear-history.c
@@ -30,17 +30,18 @@ const struct cmd_entry cmd_clear_history_entry = {
        "clear-history", "clearhist",
        "t:", 0, 0,
        CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_clear_history_exec
 };
 
 enum cmd_retval
-cmd_clear_history_exec(unused struct cmd *self, struct cmd_q *cmdq)
+cmd_clear_history_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
        struct window_pane      *wp;
        struct grid             *gd;
 
-       if ((wp = cmdq->state.wp) == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
                return (CMD_RETURN_ERROR);
        gd = wp->base.grid;
 
diff --git a/cmd-clock-mode.c b/cmd-clock-mode.c
index 95e1a61..8083581 100644
--- a/cmd-clock-mode.c
+++ b/cmd-clock-mode.c
@@ -30,16 +30,17 @@ const struct cmd_entry cmd_clock_mode_entry = {
        "clock-mode", NULL,
        "t:", 0, 0,
        CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_clock_mode_exec
 };
 
 enum cmd_retval
-cmd_clock_mode_exec(unused struct cmd *self, struct cmd_q *cmdq)
+cmd_clock_mode_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
        struct window_pane      *wp;
 
-       if ((wp = cmdq->state.wp) == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
                return (CMD_RETURN_ERROR);
 
        window_pane_set_mode(wp, &window_clock_mode);
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index 8173e60..22b1d84 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_command_prompt_entry = {
        "command-prompt", NULL,
        "I:p:t:", 0, 1,
        "[-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " [template]",
-       CMD_PREPARECLIENT,
+       0,
        cmd_command_prompt_exec
 };
 
@@ -62,7 +62,7 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
        char                            *prompt, *ptr, *input = NULL;
        size_t                           n;
 
-       if ((c = cmdq->state.c) == NULL)
+       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (c->prompt_string != NULL)
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index beb91f3..0bf5844 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -37,7 +37,7 @@ const struct cmd_entry cmd_confirm_before_entry = {
        "confirm-before", "confirm",
        "p:t:", 1, 1,
        "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command",
-       CMD_PREPARECLIENT,
+       0,
        cmd_confirm_before_exec
 };
 
@@ -55,7 +55,7 @@ cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
        char                            *cmd, *copy, *new_prompt, *ptr;
        const char                      *prompt;
 
-       if ((c = cmdq->state.c) == NULL)
+       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if ((prompt = args_get(args, 'p')) != NULL)
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index 0f8f47a..8933529 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -30,16 +30,17 @@ const struct cmd_entry cmd_copy_mode_entry = {
        "copy-mode", NULL,
        "t:u", 0, 0,
        "[-u] " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_copy_mode_exec
 };
 
 enum cmd_retval
 cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
        struct window_pane      *wp;
 
-       if ((wp = cmdq->state.wp) == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (wp->mode != &window_copy_mode) {
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index 68e3a07..600554a 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_detach_client_entry = {
        "detach-client", "detach",
        "as:t:P", 0, 0,
        "[-P] [-a] [-s target-session] " CMD_TARGET_CLIENT_USAGE,
-       CMD_READONLY|CMD_PREPARECLIENT|CMD_PREPARESESSION,
+       CMD_READONLY,
        cmd_detach_client_exec
 };
 
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_suspend_client_entry = {
        "suspend-client", "suspendc",
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
-       CMD_PREPARECLIENT,
+       0,
        cmd_detach_client_exec
 };
 
@@ -68,7 +68,8 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
                msgtype = MSG_DETACH;
 
        if (args_has(args, 's')) {
-               if ((s = cmd_find_session(cmdq, args_get(args, 's'), 0)) == 
NULL)
+               s = cmd_find_session(cmdq, args_get(args, 's'), 0);
+               if (s == NULL)
                        return (CMD_RETURN_ERROR);
 
                for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
@@ -79,7 +80,8 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
                            strlen(c->session->name) + 1);
                }
        } else {
-               if ((c = cmdq->state.c) == NULL)
+               c = cmd_find_client(cmdq, args_get(args, 't'), 0);
+               if (c == NULL)
                        return (CMD_RETURN_ERROR);
 
                if (args_has(args, 'a')) {
diff --git a/cmd-display-message.c b/cmd-display-message.c
index 260a4e5..f3547b0 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_display_message_entry = {
        "c:pt:F:", 0, 1,
        "[-p] [-c target-client] [-F format] " CMD_TARGET_PANE_USAGE
        " [message]",
-       CMD_PREPAREWINDOW|CMD_PREPARECLIENT,
+       0,
        cmd_display_message_exec
 };
 
@@ -58,12 +58,15 @@ cmd_display_message_exec(struct cmd *self, struct cmd_q 
*cmdq)
        time_t                   t;
        size_t                   len;
 
-       if ((wl = cmdq->state.wl) == NULL)
-               return (CMD_RETURN_ERROR);
-
-       c = cmd_current_client(cmdq);
-       wp = cmdq->state.wp;
-       s = cmdq->state.s;
+       if (args_has(args, 't')) {
+               wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
+               if (wl == NULL)
+                       return (CMD_RETURN_ERROR);
+       } else {
+               wl = cmd_find_pane(cmdq, NULL, &s, &wp);
+               if (wl == NULL)
+                       return (CMD_RETURN_ERROR);
+       }
 
        if (args_has(args, 'F') && args->argc != 0) {
                cmdq_error(cmdq, "only one of -F or argument must be given");
@@ -71,9 +74,11 @@ cmd_display_message_exec(struct cmd *self, struct cmd_q 
*cmdq)
        }
 
        if (args_has(args, 'c')) {
-               if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
+               c = cmd_find_client(cmdq, args_get(args, 'c'), 0);
+               if (c == NULL)
                        return (CMD_RETURN_ERROR);
        } else {
+               c = cmd_current_client(cmdq);
                if (c == NULL && !args_has(self->args, 'p')) {
                        cmdq_error(cmdq, "no client available");
                        return (CMD_RETURN_ERROR);
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index ae11429..9ce8971 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -30,16 +30,17 @@ const struct cmd_entry cmd_display_panes_entry = {
        "display-panes", "displayp",
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
-       CMD_PREPARECLIENT,
+       0,
        cmd_display_panes_exec
 };
 
 enum cmd_retval
-cmd_display_panes_exec(unused struct cmd *self, struct cmd_q *cmdq)
+cmd_display_panes_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args     *args = self->args;
        struct client   *c;
 
-       if ((c = cmdq->state.c) == NULL)
+       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        server_set_identify(c);
diff --git a/cmd-find-window.c b/cmd-find-window.c
index e1ad542..88e4879 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -51,7 +51,7 @@ const struct cmd_entry cmd_find_window_entry = {
        "find-window", "findw",
        "F:CNt:T", 1, 4,
        "[-CNT] [-F format] " CMD_TARGET_WINDOW_USAGE " match-string",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_find_window_exec
 };
 
@@ -143,13 +143,13 @@ cmd_find_window_exec(struct cmd *self, struct cmd_q *cmdq)
        const char                      *template;
        u_int                            i, match_flags;
 
-       if ((c = cmdq->state.c) == NULL) {
+       if ((c = cmd_current_client(cmdq)) == NULL) {
                cmdq_error(cmdq, "no client available");
                return (CMD_RETURN_ERROR);
        }
        s = c->session;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if ((template = args_get(args, 'F')) == NULL)
diff --git a/cmd-has-session.c b/cmd-has-session.c
index 65485ea..a873b20 100644
--- a/cmd-has-session.c
+++ b/cmd-has-session.c
@@ -30,14 +30,16 @@ const struct cmd_entry cmd_has_session_entry = {
        "has-session", "has",
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_has_session_exec
 };
 
 enum cmd_retval
-cmd_has_session_exec(unused struct cmd *self, struct cmd_q *cmdq)
+cmd_has_session_exec(struct cmd *self, struct cmd_q *cmdq)
 {
-       if (cmdq->state.s == NULL)
+       struct args     *args = self->args;
+
+       if (cmd_find_session(cmdq, args_get(args, 't'), 0) == NULL)
                return (CMD_RETURN_ERROR);
 
        return (CMD_RETURN_NORMAL);
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index 3411128..1543291 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_if_shell_entry = {
        "if-shell", "if",
        "bFt:", 2, 3,
        "[-bF] " CMD_TARGET_PANE_USAGE " shell-command command [command]",
-       CMD_PREPAREPANE,
+       0,
        cmd_if_shell_exec
 };
 
@@ -64,15 +64,15 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
        struct window_pane              *wp = NULL;
        struct format_tree              *ft;
 
-       wl = cmdq->state.wl;
-       s = cmdq->state.s;
-       wp = cmdq->state.wp;
-       c = cmd_find_client(cmdq, NULL, 1);
-
-       if (!args_has(args, 't') && c != NULL && c->session != NULL) {
-               s = c->session;
-               wl = s->curw;
-               wp = wl->window->active;
+       if (args_has(args, 't'))
+               wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
+       else {
+               c = cmd_find_client(cmdq, NULL, 1);
+               if (c != NULL && c->session != NULL) {
+                       s = c->session;
+                       wl = s->curw;
+                       wp = wl->window->active;
+               }
        }
 
        ft = format_create();
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index 4d29d63..5603541 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -36,7 +36,7 @@ const struct cmd_entry cmd_join_pane_entry = {
        "join-pane", "joinp",
        "bdhvp:l:s:t:", 0, 0,
        "[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
-       CMD_PREPAREPANE|CMD_PREPAREPANE2,
+       0,
        cmd_join_pane_exec
 };
 
@@ -44,7 +44,7 @@ const struct cmd_entry cmd_move_pane_entry = {
        "move-pane", "movep",
        "bdhvp:l:s:t:", 0, 0,
        "[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
-       CMD_PREPAREPANE|CMD_PREPAREPANE2,
+       0,
        cmd_join_pane_exec
 };
 
@@ -67,17 +67,16 @@ join_pane(struct cmd *self, struct cmd_q *cmdq, int 
not_same_window)
        enum layout_type         type;
        struct layout_cell      *lc;
 
-       if ((dst_wl = cmdq->state.wl) == NULL)
+       dst_wl = cmd_find_pane(cmdq, args_get(args, 't'), &dst_s, &dst_wp);
+       if (dst_wl == NULL)
                return (CMD_RETURN_ERROR);
-       dst_s =  cmdq->state.s;
-       dst_wp = cmdq->state.wp;
        dst_w = dst_wl->window;
        dst_idx = dst_wl->idx;
        server_unzoom_window(dst_w);
 
-       if ((src_wl = cmdq->state.wl2) == NULL)
+       src_wl = cmd_find_pane(cmdq, args_get(args, 's'), NULL, &src_wp);
+       if (src_wl == NULL)
                return (CMD_RETURN_ERROR);
-       src_wp = cmdq->state.wp2;
        src_w = src_wl->window;
        server_unzoom_window(src_w);
 
diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index 8962b59..f4735fd 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -32,19 +32,19 @@ const struct cmd_entry cmd_kill_pane_entry = {
        "kill-pane", "killp",
        "at:", 0, 0,
        "[-a] " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_kill_pane_exec
 };
 
 enum cmd_retval
 cmd_kill_pane_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
        struct winlink          *wl;
        struct window_pane      *loopwp, *tmpwp, *wp;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
-       wp = cmdq->state.wp;
        server_unzoom_window(wl->window);
 
        if (window_count_panes(wl->window) == 1) {
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index 4b6bcb6..d7e2a21 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_kill_session_entry = {
        "kill-session", NULL,
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
-       CMD_PREPARESESSION,
+       0,
        cmd_kill_session_exec
 };
 
@@ -43,7 +43,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmd_q *cmdq)
        struct args     *args = self->args;
        struct session  *s, *s2, *s3;
 
-       if ((s = cmdq->state.s) == NULL)
+       if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (args_has(args, 'a')) {
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 4876638..d402acc 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_kill_window_entry = {
        "kill-window", "killw",
        "at:", 0, 0,
        "[-a] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_kill_window_exec
 };
 
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_unlink_window_entry = {
        "unlink-window", "unlinkw",
        "kt:", 0, 0,
        "[-k] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_kill_window_exec
 };
 
@@ -52,10 +52,9 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
        struct session_group    *sg;
        u_int                    references;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
                return (CMD_RETURN_ERROR);
        w = wl->window;
-       s = cmdq->state.s;
 
        if (self->entry == &cmd_unlink_window_entry) {
                sg = session_group_find(s);
@@ -67,6 +66,7 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
                        cmdq_error(cmdq, "window only linked to one session");
                        return (CMD_RETURN_ERROR);
                }
+               server_unlink_window(s, wl);
        } else {
                if (args_has(args, 'a')) {
                        RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 39ff759..292be72 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_list_clients_entry = {
        "list-clients", "lsc",
        "F:t:", 0, 0,
        "[-F format] " CMD_TARGET_SESSION_USAGE,
-       CMD_READONLY|CMD_PREPARESESSION,
+       CMD_READONLY,
        cmd_list_clients_exec
 };
 
@@ -54,9 +54,12 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
        u_int                    i;
        char                    *line;
 
-       s = cmdq->state.s;
-       if (args_has(args, 't') && s == NULL)
-               return (CMD_RETURN_ERROR);
+       if (args_has(args, 't')) {
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+               if (s == NULL)
+                       return (CMD_RETURN_ERROR);
+       } else
+               s = NULL;
 
        if ((template = args_get(args, 'F')) == NULL)
                template = LIST_CLIENTS_TEMPLATE;
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index c8ef414..0733ee2 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -44,8 +44,7 @@ const struct cmd_entry cmd_list_commands_entry = {
        "", 0, 0,
        "",
        0,
-       cmd_list_keys_exec,
-       NULL
+       cmd_list_keys_exec
 };
 
 enum cmd_retval
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 8bb0488..7f62177 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_list_panes_entry = {
        "list-panes", "lsp",
        "asF:t:", 0, 0,
        "[-as] [-F format] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPARESESSION|CMD_PREPARESESSION2|CMD_PREPAREWINDOW,
+       0,
        cmd_list_panes_exec
 };
 
@@ -50,16 +50,16 @@ cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
        struct session  *s;
        struct winlink  *wl;
 
-       s = cmdq->state.s;
-
        if (args_has(args, 'a'))
                cmd_list_panes_server(self, cmdq);
        else if (args_has(args, 's')) {
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
                if (s == NULL)
                        return (CMD_RETURN_ERROR);
                cmd_list_panes_session(self, s, cmdq, 1);
        } else {
-               if ((wl = cmdq->state.wl) == NULL)
+               wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
+               if (wl == NULL)
                        return (CMD_RETURN_ERROR);
                cmd_list_panes_window(self, s, wl, cmdq, 0);
        }
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index b4ebb45..5f73e8d 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -49,7 +49,7 @@ const struct cmd_entry cmd_list_windows_entry = {
        "list-windows", "lsw",
        "F:at:", 0, 0,
        "[-a] [-F format] " CMD_TARGET_SESSION_USAGE,
-       CMD_PREPARESESSION,
+       0,
        cmd_list_windows_exec
 };
 
@@ -62,7 +62,8 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_q *cmdq)
        if (args_has(args, 'a'))
                cmd_list_windows_server(self, cmdq);
        else {
-               if ((s = cmdq->state.s) == NULL)
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+               if (s == NULL)
                        return (CMD_RETURN_ERROR);
                cmd_list_windows_session(self, s, cmdq, 0);
        }
diff --git a/cmd-lock-server.c b/cmd-lock-server.c
index beaaad8..de76475 100644
--- a/cmd-lock-server.c
+++ b/cmd-lock-server.c
@@ -38,32 +38,35 @@ const struct cmd_entry cmd_lock_session_entry = {
        "lock-session", "locks",
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
-       CMD_PREPARESESSION,
-       cmd_lock_server_exec,
+       0,
+       cmd_lock_server_exec
 };
 
 const struct cmd_entry cmd_lock_client_entry = {
        "lock-client", "lockc",
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
-       CMD_PREPARECLIENT,
+       0,
        cmd_lock_server_exec
 };
 
 enum cmd_retval
 cmd_lock_server_exec(struct cmd *self, unused struct cmd_q *cmdq)
 {
+       struct args     *args = self->args;
        struct client   *c;
        struct session  *s;
 
        if (self->entry == &cmd_lock_server_entry)
                server_lock();
        else if (self->entry == &cmd_lock_session_entry) {
-               if ((s = cmdq->state.s) == NULL)
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+               if (s == NULL)
                        return (CMD_RETURN_ERROR);
                server_lock_session(s);
        } else {
-               if ((c = cmdq->state.c) == NULL)
+               c = cmd_find_client(cmdq, args_get(args, 't'), 0);
+               if (c == NULL)
                        return (CMD_RETURN_ERROR);
                server_lock_client(c);
        }
diff --git a/cmd-move-window.c b/cmd-move-window.c
index 4b7b53e..3064cd6 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_move_window_entry = {
        "move-window", "movew",
        "dkrs:t:", 0, 0,
        "[-dkr] " CMD_SRCDST_WINDOW_USAGE,
-       CMD_PREPARESESSION|CMD_PREPARESESSION2|CMD_PREPAREWINDOW,
+       0,
        cmd_move_window_exec
 };
 
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_link_window_entry = {
        "link-window", "linkw",
        "dks:t:", 0, 0,
        "[-dk] " CMD_SRCDST_WINDOW_USAGE,
-       CMD_PREPARESESSION|CMD_PREPAREWINDOW,
+       0,
        cmd_move_window_exec
 };
 
@@ -54,7 +54,8 @@ cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
        int              idx, kflag, dflag;
 
        if (args_has(args, 'r')) {
-               if ((s = cmdq->state.s) == NULL)
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+               if (s == NULL)
                        return (CMD_RETURN_ERROR);
 
                session_renumber_windows(s);
@@ -62,12 +63,10 @@ cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
 
                return (CMD_RETURN_NORMAL);
        }
-       src = cmdq->state.s;
-       dst = cmdq->state.s2;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 's'), &src)) == NULL)
                return (CMD_RETURN_ERROR);
-       if ((idx = cmdq->state.idx) == -2)
+       if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &dst)) == -2)
                return (CMD_RETURN_ERROR);
 
        kflag = args_has(self->args, 'k');
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 13fce54..e244f88 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_new_session_entry = {
        "[-AdDP] [-c start-directory] [-F format] [-n window-name] "
        "[-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] "
        "[-y height] [command]",
-       CMD_STARTSERVER|CMD_CANTNEST|CMD_PREPARESESSION,
+       CMD_STARTSERVER|CMD_CANTNEST,
        cmd_new_session_exec
 };
 
@@ -49,7 +49,7 @@ const struct cmd_entry cmd_has_session_entry = {
        "has-session", "has",
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
-       CMD_PREPARESESSION,
+       0,
        cmd_new_session_exec
 };
 
@@ -99,11 +99,12 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
        }
 
        target = args_get(args, 't');
-       groupwith = NULL;
        if (target != NULL) {
-               if ((groupwith = cmdq->state.s) == NULL)
+               groupwith = cmd_find_session(cmdq, target, 0);
+               if (groupwith == NULL)
                        return (CMD_RETURN_ERROR);
-       }
+       } else
+               groupwith = NULL;
 
        /* Set -d if no client. */
        detached = args_has(args, 'd');
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 5f66aa0..7f14b21 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -32,14 +32,14 @@
 
 #define NEW_WINDOW_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
 
-enum cmd_retval         cmd_new_window_exec(struct cmd *, struct cmd_q *);
+enum cmd_retval        cmd_new_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_new_window_entry = {
        "new-window", "neww",
        "ac:dF:kn:Pt:", 0, -1,
        "[-adkP] [-c start-directory] [-F format] [-n window-name] "
        CMD_TARGET_WINDOW_USAGE " [command]",
-       CMD_PREPAREWINDOW|CMD_PREPAREIDX,
+       0,
        cmd_new_window_exec
 };
 
@@ -47,17 +47,17 @@ enum cmd_retval
 cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
        struct args             *args = self->args;
-       struct session          *s = cmdq->state.s;
-       struct winlink          *wl = cmdq->state.wl;
+       struct session          *s;
+       struct winlink          *wl;
        struct client           *c;
        const char              *cmd, *path, *template;
        char                   **argv, *cause, *cp;
-       int                      argc, last, detached, cwd, fd = -1;
-       int                      idx = cmdq->state.idx;
+       int                      argc, idx, last, detached, cwd, fd = -1;
        struct format_tree      *ft;
        struct environ_entry    *envent;
 
        if (args_has(args, 'a')) {
+               wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
                if (wl == NULL)
                        return (CMD_RETURN_ERROR);
                idx = wl->idx + 1;
@@ -79,6 +79,7 @@ cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
                        server_unlink_window(s, wl);
                }
        } else {
+               idx = cmd_find_index(cmdq, args_get(args, 't'), &s);
                if (idx == -2)
                        return (CMD_RETURN_ERROR);
        }
diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
index e76acd0..5d91aef 100644
--- a/cmd-paste-buffer.c
+++ b/cmd-paste-buffer.c
@@ -36,7 +36,7 @@ const struct cmd_entry cmd_paste_buffer_entry = {
        "paste-buffer", "pasteb",
        "db:prs:t:", 0, 0,
        "[-dpr] [-s separator] " CMD_BUFFER_USAGE " " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_paste_buffer_exec
 };
 
@@ -45,18 +45,17 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
 {
        struct args             *args = self->args;
        struct window_pane      *wp;
+       struct session          *s;
        struct paste_buffer     *pb;
        const char              *sepstr, *bufname;
 
-       if (cmdq->state.wl == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
                return (CMD_RETURN_ERROR);
 
        bufname = NULL;
        if (args_has(args, 'b'))
                bufname = args_get(args, 'b');
 
-       wp = cmdq->state.wp;
-
        if (bufname == NULL)
                pb = paste_get_top();
        else {
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index 952ceff..4ab1824 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_pipe_pane_entry = {
        "pipe-pane", "pipep",
        "ot:", 0, 1,
        "[-o] " CMD_TARGET_PANE_USAGE " [command]",
-       CMD_PREPAREPANE,
+       0,
        cmd_pipe_pane_exec
 };
 
@@ -52,9 +52,8 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        char                    *command;
        int                      old_fd, pipe_fd[2], null_fd;
 
-       if (cmdq->state.wl == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
                return (CMD_RETURN_ERROR);
-       wp = cmdq->state.wp;
        c = cmd_find_client(cmdq, NULL, 1);
 
        /* Destroy the old pipe. */
diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c
index 258e781..f693872 100644
--- a/cmd-refresh-client.c
+++ b/cmd-refresh-client.c
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_refresh_client_entry = {
        "refresh-client", "refresh",
        "C:St:", 0, 0,
        "[-S] [-C size] " CMD_TARGET_CLIENT_USAGE,
-       CMD_PREPARECLIENT,
+       0,
        cmd_refresh_client_exec
 };
 
@@ -42,7 +42,7 @@ cmd_refresh_client_exec(struct cmd *self, struct cmd_q *cmdq)
        const char      *size;
        u_int            w, h;
 
-       if ((c = cmdq->state.c) == NULL)
+       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        if (args_has(args, 'C')) {
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index 9ce6919..481154c 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_rename_session_entry = {
        "rename-session", "rename",
        "t:", 1, 1,
        CMD_TARGET_SESSION_USAGE " new-name",
-       CMD_PREPARESESSION,
+       0,
        cmd_rename_session_exec
 };
 
@@ -53,7 +53,7 @@ cmd_rename_session_exec(struct cmd *self, struct cmd_q *cmdq)
                return (CMD_RETURN_ERROR);
        }
 
-       if ((s = cmdq->state.s) == NULL)
+       if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        RB_REMOVE(sessions, &sessions, s);
diff --git a/cmd-rename-window.c b/cmd-rename-window.c
index 821592c..2f677a4 100644
--- a/cmd-rename-window.c
+++ b/cmd-rename-window.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_rename_window_entry = {
        "rename-window", "renamew",
        "t:", 1, 1,
        CMD_TARGET_WINDOW_USAGE " new-name",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_rename_window_exec
 };
 
@@ -40,9 +40,10 @@ enum cmd_retval
 cmd_rename_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
        struct args     *args = self->args;
+       struct session  *s;
        struct winlink  *wl;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
                return (CMD_RETURN_ERROR);
 
        window_set_name(wl->window, args->argv[0]);
diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c
index 5301a57..42f0f39 100644
--- a/cmd-resize-pane.c
+++ b/cmd-resize-pane.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_resize_pane_entry = {
        "resize-pane", "resizep",
        "DLRt:Ux:y:Z", 0, 1,
        "[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " 
[adjustment]",
-       CMD_PREPAREPANE,
+       0,
        cmd_resize_pane_exec
 };
 
@@ -48,10 +48,9 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        u_int                    adjust;
        int                      x, y;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
        w = wl->window;
-       wp = cmdq->state.wp;
 
        if (args_has(args, 'Z')) {
                if (w->flags & WINDOW_ZOOMED)
diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c
index e192772..4703153 100644
--- a/cmd-respawn-pane.c
+++ b/cmd-respawn-pane.c
@@ -34,7 +34,7 @@ const struct cmd_entry cmd_respawn_pane_entry = {
        "respawn-pane", "respawnp",
        "kt:", 0, -1,
        "[-k] " CMD_TARGET_PANE_USAGE " [command]",
-       CMD_PREPAREPANE,
+       0,
        cmd_respawn_pane_exec
 };
 
@@ -52,11 +52,9 @@ cmd_respawn_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        u_int                    idx;
        struct environ_entry    *envent;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
        w = wl->window;
-       s = cmdq->state.s;
-       wp = cmdq->state.wp;
 
        if (!args_has(self->args, 'k') && wp->fd != -1) {
                if (window_pane_index(wp, &idx) != 0)
diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c
index 2fb68a0..06102ed 100644
--- a/cmd-respawn-window.c
+++ b/cmd-respawn-window.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_respawn_window_entry = {
        "respawn-window", "respawnw",
        "kt:", 0, -1,
        "[-k] " CMD_TARGET_WINDOW_USAGE " [command]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_respawn_window_exec
 };
 
@@ -50,10 +50,9 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_q *cmdq)
        char                    *cause;
        struct environ_entry    *envent;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
                return (CMD_RETURN_ERROR);
        w = wl->window;
-       s = cmdq->state.s;
 
        if (!args_has(self->args, 'k')) {
                TAILQ_FOREACH(wp, &w->panes, entry) {
diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
index 69b20d2..859ff04 100644
--- a/cmd-rotate-window.c
+++ b/cmd-rotate-window.c
@@ -30,20 +30,21 @@ const struct cmd_entry cmd_rotate_window_entry = {
        "rotate-window", "rotatew",
        "Dt:U", 0, 0,
        "[-DU] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_rotate_window_exec
 };
 
 enum cmd_retval
 cmd_rotate_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
        struct winlink          *wl;
        struct window           *w;
        struct window_pane      *wp, *wp2;
        struct layout_cell      *lc;
        u_int                    sx, sy, xoff, yoff;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
        w = wl->window;
 
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index af4a701..b47c282 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_run_shell_entry = {
        "run-shell", "run",
        "bt:", 1, 1,
        "[-b] " CMD_TARGET_PANE_USAGE " shell-command",
-       CMD_PREPAREPANE|CMD_PREPARESESSION,
+       0,
        cmd_run_shell_exec
 };
 
@@ -75,17 +75,21 @@ cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
        struct args                     *args = self->args;
        struct cmd_run_shell_data       *cdata;
        char                            *shellcmd;
+       struct client                   *c;
        struct session                  *s = NULL;
        struct winlink                  *wl = NULL;
        struct window_pane              *wp = NULL;
        struct format_tree              *ft;
 
        if (args_has(args, 't'))
-               wl = cmdq->state.wl;
+               wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
        else {
-               s = cmdq->state.s;
-               wl = cmdq->state.wl;
-               wp = cmdq->state.wp;
+               c = cmd_find_client(cmdq, NULL, 1);
+               if (c != NULL && c->session != NULL) {
+                       s = c->session;
+                       wl = s->curw;
+                       wp = wl->window->active;
+               }
        }
 
        ft = format_create();
diff --git a/cmd-select-layout.c b/cmd-select-layout.c
index 2859e0b..77137b7 100644
--- a/cmd-select-layout.c
+++ b/cmd-select-layout.c
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_select_layout_entry = {
        "select-layout", "selectl",
        "npt:", 0, 1,
        "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_layout_exec
 };
 
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_next_layout_entry = {
        "next-layout", "nextl",
        "t:", 0, 0,
        CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_layout_exec
 };
 
@@ -46,7 +46,7 @@ const struct cmd_entry cmd_previous_layout_entry = {
        "previous-layout", "prevl",
        "t:", 0, 0,
        CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_layout_exec
 };
 
@@ -58,7 +58,7 @@ cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
        const char      *layoutname;
        int              next, previous, layout;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
        server_unzoom_window(wl->window);
 
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 6e55330..5810eea 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_select_pane_entry = {
        "select-pane", "selectp",
        "DdeLlRt:U", 0, 0,
        "[-DdeLlRU] " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_select_pane_exec
 };
 
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_last_pane_entry = {
        "last-pane", "lastp",
        "det:", 0, 0,
        "[-de] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_select_pane_exec
 };
 
@@ -50,7 +50,8 @@ cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        struct window_pane      *wp;
 
        if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
-               if ((wl = cmdq->state.wl) == NULL)
+               wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
+               if (wl == NULL)
                        return (CMD_RETURN_ERROR);
 
                if (wl->window->last == NULL) {
@@ -72,11 +73,9 @@ cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
                return (CMD_RETURN_NORMAL);
        }
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
 
-       wp = cmdq->state.wp;
-
        server_unzoom_window(wp->window);
        if (!window_pane_visible(wp)) {
                cmdq_error(cmdq, "pane not visible");
diff --git a/cmd-select-window.c b/cmd-select-window.c
index d5e8846..f530f1f 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_select_window_entry = {
        "select-window", "selectw",
        "lnpTt:", 0, 0,
        "[-lnpT] " CMD_TARGET_WINDOW_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_window_exec
 };
 
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_next_window_entry = {
        "next-window", "next",
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_window_exec
 };
 
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_previous_window_entry = {
        "previous-window", "prev",
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_window_exec
 };
 
@@ -56,13 +56,14 @@ const struct cmd_entry cmd_last_window_entry = {
        "last-window", "last",
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
-       CMD_PREPAREWINDOW,
+       0,
        cmd_select_window_exec
 };
 
 enum cmd_retval
 cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args     *args = self->args;
        struct winlink  *wl;
        struct session  *s;
        int              next, previous, last, activity;
@@ -78,7 +79,8 @@ cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
                last = 1;
 
        if (next || previous || last) {
-               if ((s = cmdq->state.s) == NULL)
+               s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+               if (s == NULL)
                        return (CMD_RETURN_ERROR);
 
                activity = args_has(self->args, 'a');
@@ -101,9 +103,9 @@ cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
 
                server_redraw_session(s);
        } else {
-               if ((wl = cmdq->state.wl) == NULL)
+               wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
+               if (wl == NULL)
                        return (CMD_RETURN_ERROR);
-               s = cmdq->state.s;
 
                /*
                 * If -T and select-window is invoked on same window as
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index a3c9654..7a4d97d 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_send_keys_entry = {
        "send-keys", "send",
        "lRt:", 0, -1,
        "[-lR] " CMD_TARGET_PANE_USAGE " key ...",
-       CMD_PREPAREPANE,
+       0,
        cmd_send_keys_exec
 };
 
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_send_prefix_entry = {
        "send-prefix", NULL,
        "2t:", 0, 0,
        "[-2] " CMD_TARGET_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_send_keys_exec
 };
 
@@ -55,10 +55,8 @@ cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
        const u_char            *str;
        int                      i, key;
 
-       if (cmdq->state.wl == NULL)
+       if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
                return (CMD_RETURN_ERROR);
-       s = cmdq->state.s;
-       wp = cmdq->state.wp;
 
        if (self->entry == &cmd_send_prefix_entry) {
                if (args_has(args, '2'))
diff --git a/cmd-set-environment.c b/cmd-set-environment.c
index 1be1666..83e63b4 100644
--- a/cmd-set-environment.c
+++ b/cmd-set-environment.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_set_environment_entry = {
        "set-environment", "setenv",
        "grt:u", 1, 2,
        "[-gru] " CMD_TARGET_SESSION_USAGE " name [value]",
-       CMD_PREPARESESSION,
+       0,
        cmd_set_environment_exec
 };
 
@@ -63,7 +63,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
        if (args_has(self->args, 'g'))
                env = &global_environ;
        else {
-               if ((s = cmdq->state.s) == NULL)
+               if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == 
NULL)
                        return (CMD_RETURN_ERROR);
                env = &s->environ;
        }
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index dafd724..7737752 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -28,13 +28,12 @@
  */
 
 enum cmd_retval         cmd_show_environment_exec(struct cmd *, struct cmd_q 
*);
-void            cmd_show_environment_prepare(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_show_environment_entry = {
        "show-environment", "showenv",
        "gt:", 0, 1,
        "[-g] " CMD_TARGET_SESSION_USAGE " [name]",
-       CMD_PREPARESESSION,
+       0,
        cmd_show_environment_exec
 };
 
@@ -49,7 +48,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q 
*cmdq)
        if (args_has(self->args, 'g'))
                env = &global_environ;
        else {
-               if ((s = cmdq->state.s) == NULL)
+               if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == 
NULL)
                        return (CMD_RETURN_ERROR);
                env = &s->environ;
        }
diff --git a/cmd-show-messages.c b/cmd-show-messages.c
index 90f32f3..308668f 100644
--- a/cmd-show-messages.c
+++ b/cmd-show-messages.c
@@ -34,7 +34,7 @@ const struct cmd_entry cmd_show_messages_entry = {
        "show-messages", "showmsgs",
        "IJTt:", 0, 0,
        "[-IJT] " CMD_TARGET_CLIENT_USAGE,
-       CMD_PREPARECLIENT,
+       0,
        cmd_show_messages_exec
 };
 
@@ -123,7 +123,7 @@ cmd_show_messages_jobs(struct cmd_q *cmdq)
 }
 
 enum cmd_retval
-cmd_show_messages_exec(unused struct cmd *self, struct cmd_q *cmdq)
+cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
 {
        struct args             *args = self->args;
        struct client           *c;
@@ -152,7 +152,7 @@ cmd_show_messages_exec(unused struct cmd *self, struct 
cmd_q *cmdq)
        if (done)
                return (CMD_RETURN_NORMAL);
 
-       if ((c = cmdq->state.c) == NULL)
+       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
                return (CMD_RETURN_ERROR);
 
        for (i = 0; i < ARRAY_LENGTH(&c->message_log); i++) {
diff --git a/cmd-show-options.c b/cmd-show-options.c
index c87ab51..a5011e7 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_show_options_entry = {
        "show-options", "show",
        "gqst:vw", 0, 1,
        "[-gqsvw] [-t target-session|target-window] [option]",
-       CMD_PREPARESESSION|CMD_PREPAREWINDOW,
+       0,
        cmd_show_options_exec
 };
 
@@ -46,7 +46,7 @@ const struct cmd_entry cmd_show_window_options_entry = {
        "show-window-options", "showw",
        "gvt:", 0, 1,
        "[-gv] " CMD_TARGET_WINDOW_USAGE " [option]",
-       CMD_PREPARESESSION|CMD_PREPAREWINDOW,
+       0,
        cmd_show_options_exec
 };
 
@@ -69,7 +69,8 @@ cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
                if (args_has(self->args, 'g'))
                        oo = &global_w_options;
                else {
-                       if ((wl = cmdq->state.wl) == NULL)
+                       wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
+                       if (wl == NULL)
                                return (CMD_RETURN_ERROR);
                        oo = &wl->window->options;
                }
@@ -78,7 +79,8 @@ cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
                if (args_has(self->args, 'g'))
                        oo = &global_s_options;
                else {
-                       if ((s = cmdq->state.s) == NULL)
+                       s = cmd_find_session(cmdq, args_get(args, 't'), 0);
+                       if (s == NULL)
                                return (CMD_RETURN_ERROR);
                        oo = &s->options;
                }
diff --git a/cmd-split-window.c b/cmd-split-window.c
index f2465e0..6b90125 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -39,7 +39,7 @@ const struct cmd_entry cmd_split_window_entry = {
        "bc:dF:l:hp:Pt:v", 0, -1,
        "[-bdhvP] [-c start-directory] [-F format] [-p percentage|-l size] "
        CMD_TARGET_PANE_USAGE " [command]",
-       CMD_PREPAREPANE,
+       0,
        cmd_split_window_exec
 };
 
@@ -62,13 +62,9 @@ cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
        struct format_tree      *ft;
        struct environ_entry    *envent;
 
-       if ((wl = cmdq->state.wl) == NULL)
+       if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
                return (CMD_RETURN_ERROR);
-       else {
-               w = wl->window;
-               s = cmdq->state.s;
-               wp = cmdq->state.wp;
-       }
+       w = wl->window;
        server_unzoom_window(w);
 
        environ_init(&env);
diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
index 75c610b..918a2e4 100644
--- a/cmd-swap-pane.c
+++ b/cmd-swap-pane.c
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_swap_pane_entry = {
        "swap-pane", "swapp",
        "dDs:t:U", 0, 0,
        "[-dDU] " CMD_SRCDST_PANE_USAGE,
-       CMD_PREPAREPANE,
+       0,
        cmd_swap_pane_exec
 };
 
@@ -46,10 +46,10 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
        struct layout_cell      *src_lc, *dst_lc;
        u_int                    sx, sy, xoff, yoff;
 
-       if ((dst_wl = cmdq->state.wl) == NULL)
+       dst_wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &dst_wp);
+       if (dst_wl == NULL)
                return (CMD_RETURN_ERROR);
        dst_w = dst_wl->window;
-       dst_wp = cmdq->state.wp;
        server_unzoom_window(dst_w);
 
        if (!args_has(args, 's')) {
diff --git a/cmd-swap-window.c b/cmd-swap-window.c
index 52f1dde..655b910 100644
--- a/cmd-swap-window.c
+++ b/cmd-swap-window.c
@@ -32,23 +32,26 @@ const struct cmd_entry cmd_swap_window_entry = {
        "swap-window", "swapw",
        "ds:t:", 0, 0,
        "[-d] " CMD_SRCDST_WINDOW_USAGE,
-       CMD_PREPAREWINDOW|CMD_PREPARESESSION2
+       0,
+       cmd_swap_window_exec
 };
 
 enum cmd_retval
 cmd_swap_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
+       struct args             *args = self->args;
+       const char              *target_src, *target_dst;
        struct session          *src, *dst;
        struct session_group    *sg_src, *sg_dst;
        struct winlink          *wl_src, *wl_dst;
        struct window           *w;
 
-       if ((wl_src = cmdq->state.wl) == NULL)
+       target_src = args_get(args, 's');
+       if ((wl_src = cmd_find_window(cmdq, target_src, &src)) == NULL)
                return (CMD_RETURN_ERROR);
-       src = cmdq->state.s;
-       if ((wl_dst = cmdq->state.wl2) == NULL)
+       target_dst = args_get(args, 't');
+       if ((wl_dst = cmd_find_window(cmdq, target_dst, &dst)) == NULL)
                return (CMD_RETURN_ERROR);
-       dst = cmdq->state.s2;
 
        sg_src = session_group_find(src);
        sg_dst = session_group_find(dst);
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index de3721c..439f593 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_switch_client_entry = {
        "switch-client", "switchc",
        "lc:npt:r", 0, 0,
        "[-lnpr] [-c target-client] [-t target-session]",
-       CMD_READONLY|CMD_PREPARESESSION,
+       CMD_READONLY,
        cmd_switch_client_exec
 };
 
@@ -104,9 +104,6 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
                }
        }
 
-       if ((s = cmdq->state.s) == NULL)
-               return (CMD_RETURN_ERROR);
-
        if (c->session != NULL)
                c->last_session = c->session;
        c->session = s;


commit cc6a0dfd3015e1d731e0422f1b25086ee0f43ffb
Author: Nicholas Marriott <nicholas.marri...@gmail.com>
Commit: Nicholas Marriott <nicholas.marri...@gmail.com>

    Convert set-hook and show-hooks to new flags.
---
 cmd-set-hook.c   |   10 ++++------
 cmd-show-hooks.c |    4 ++--
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/cmd-set-hook.c b/cmd-set-hook.c
index 26072f8..86e6835 100644
--- a/cmd-set-hook.c
+++ b/cmd-set-hook.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_set_hook_entry = {
        "set-hook", NULL,
        "gt:u", 1, 2,
        "[-gu]" CMD_TARGET_SESSION_USAGE " hook-name [command]",
-       CMD_PREPARESESSION,
+       CMD_PREP_SESSION_T,
        cmd_set_hook_exec
 };
 
@@ -48,11 +48,9 @@ cmd_set_hook_exec(struct cmd *self, struct cmd_q *cmdq)
        char            *cause;
        const char      *name, *cmd;
 
-       s = cmdq->state.s;
-       if (s == NULL || args_has(args, 'g'))
-               hooks = &global_hooks;
-       else
-               hooks = &s->hooks;
+       if ((s = cmdq->state.tflag.s) == NULL)
+               return (CMD_RETURN_ERROR);
+       hooks = args_has(args, 'g') ? &global_hooks : &s->hooks;
 
        name = args->argv[0];
        if (*name == '\0') {
diff --git a/cmd-show-hooks.c b/cmd-show-hooks.c
index f06dabf..85b6556 100644
--- a/cmd-show-hooks.c
+++ b/cmd-show-hooks.c
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_show_hooks_entry = {
        "show-hooks", NULL,
        "gt:", 0, 1,
        "[-g] " CMD_TARGET_SESSION_USAGE,
-       CMD_PREPARESESSION,
+       CMD_PREP_SESSION_T,
        cmd_show_hooks_exec
 };
 
@@ -47,7 +47,7 @@ cmd_show_hooks_exec(struct cmd *self, struct cmd_q *cmdq)
        char             tmp[BUFSIZ];
        size_t           used;
 
-       if ((s = cmdq->state.s) == NULL)
+       if ((s = cmdq->state.tflag.s) == NULL)
                return (CMD_RETURN_ERROR);
        hooks = args_has(args, 'g') ? &global_hooks : &s->hooks;
 


commit e64e250660d7c0f68193da70861a4032ddba621a
Author: Nicholas Marriott <nicholas.marri...@gmail.com>
Commit: Nicholas Marriott <nicholas.marri...@gmail.com>

    Use separate structs for -t and -s in the state, rename flags, and allow 
only
    one flag for each of -t or -s.
---
 cmd-queue.c |   30 +++++++++++++---------
 cmd.c       |   80 +++++++++++++++++++++++++++++++++++++++++-----------------
 tmux.h      |   49 +++++++++++++++++++++--------------
 3 files changed, 103 insertions(+), 56 deletions(-)

diff --git a/cmd-queue.c b/cmd-queue.c
index 70f0bd2..b7daf44 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -33,20 +33,24 @@ void        cmdq_run_hook(struct hooks *, const char *, 
struct cmd *,
 void
 cmdq_set_state(struct cmd_q *cmdq)
 {
-       memset(&cmdq->state, 0, sizeof cmdq->state);
+       struct cmd_state        *state = &cmdq->state;
 
-       cmdq->state.c = cmdq->client;
-       cmdq->state.s = cmdq->client != NULL ? cmdq->client->session : NULL;
-       cmdq->state.s2 = NULL;
-       cmdq->state.w = NULL;
-       cmdq->state.wl = NULL;
-       cmdq->state.wp = NULL;
-       cmdq->state.tflag = NULL;
-       cmdq->state.idx = -1;
+       state->c = cmdq->client;
+
+       state->tflag.s = NULL;
+       state->tflag.wl = NULL;
+       state->tflag.wp = NULL;
+       state->tflag.idx = -1;
+       state->tflag.prior = args_get(cmdq->cmd->args, 't');
+
+       state->sflag.s = NULL;
+       state->sflag.wl = NULL;
+       state->sflag.wp = NULL;
+       state->sflag.idx = -1;
+       state->sflag.prior = args_get(cmdq->cmd->args, 's');
 
        cmd_prepare(cmdq->cmd, cmdq);
 
-       cmdq->state.prior_tflag = args_get(cmdq->cmd->args, 't');
 }
 
 /* Create new command queue. */
@@ -226,8 +230,10 @@ cmdq_continue(struct cmd_q *cmdq)
                         * command has any.
                         */
                        cmdq_set_state(cmdq);
-                       if (cmdq->state.s != NULL)
-                               hooks = &cmdq->state.s->hooks;
+                       if (cmdq->state.tflag.s != NULL)
+                               hooks = &cmdq->state.tflag.s->hooks;
+                       else if (cmdq->state.sflag.s != NULL)
+                               hooks = &cmdq->state.sflag.s->hooks;
                        else
                                hooks = &global_hooks;
 
diff --git a/cmd.c b/cmd.c
index bbee673..aa0b6ca 100644
--- a/cmd.c
+++ b/cmd.c
@@ -317,37 +317,69 @@ usage:
 void
 cmd_prepare(struct cmd *cmd, struct cmd_q *cmdq)
 {
-       struct args             *args = cmd->args;
-       const char              *tflag = args_get(args, 't');
-       const char              *sflag = args_get(args, 's');
        struct cmd_state        *state = &cmdq->state;
+       struct args             *args = cmd->args;
+       const char              *tflag;
+       const char              *sflag;
 
        /* FIXME:  Handle this!  What should happen during cfg_load? */
        if (cfg_finished == 0)
                return;
 
-       /*
-        * Prepare the context for the command.  It might be the case that a
-        * hooked command is being called.  If this command doesn't have a
-        * tflag, use the same one as the command being hooked.
-        */
-       if (tflag == NULL && cmdq->state.prior_tflag != NULL)
-               tflag = state->prior_tflag;
-
-       if (cmd->entry->flags & CMD_PREPARESESSION)
-               state->s = cmd_find_session(cmdq, tflag, 0);
-       if (cmd->entry->flags & CMD_PREPARESESSION2)
-               state->s2 = cmd_find_session(cmdq, sflag, 0);
-       if (cmd->entry->flags & CMD_PREPAREWINDOW)
-               state->wl = cmd_find_window(cmdq, tflag, NULL);
-       if (cmd->entry->flags & CMD_PREPAREPANE)
-               state->wl = cmd_find_pane(cmdq, tflag, &state->s, &state->wp);
-       if (cmd->entry->flags & CMD_PREPAREPANE2)
-               state->wl2 = cmd_find_pane(cmdq, sflag, &state->s, &state->wp);
-       if (cmd->entry->flags & CMD_PREPARECLIENT)
+       tflag = args_get(args, 't');
+       if (tflag == NULL)
+               tflag = state->tflag.prior;
+       switch (cmd->entry->flags & CMD_PREP_ALL_T) {
+       case 0:
+               break;
+       case CMD_PREP_SESSION_T:
+               state->tflag.s = cmd_find_session(cmdq, tflag, 0);
+               break;
+       case CMD_PREP_WINDOW_T:
+               state->tflag.wl = cmd_find_window(cmdq, tflag, &state->tflag.s);
+               break;
+       case CMD_PREP_PANE_T:
+               state->tflag.wl = cmd_find_pane(cmdq, tflag, &state->tflag.s,
+                   &state->tflag.wp);
+               break;
+       case CMD_PREP_CLIENT_T:
                state->c = cmd_find_client(cmdq, tflag, 0);
-       if (cmd->entry->flags & CMD_PREPAREIDX)
-               state->idx = cmd_find_index(cmdq, tflag, &state->s);
+               break;
+       case CMD_PREP_INDEX_T:
+               state->tflag.idx = cmd_find_index(cmdq, tflag, &state->tflag.s);
+               break;
+       default:
+               log_fatalx("too many -t flags for %s", cmd->entry->name);
+       }
+
+       sflag = args_get(args, 't');
+       if (sflag == NULL)
+               sflag = state->sflag.prior;
+       switch (cmd->entry->flags & CMD_PREP_ALL_S) {
+       case 0:
+               break;
+       case CMD_PREP_SESSION_S:
+               state->sflag.s = cmd_find_session(cmdq, sflag, 0);
+               break;
+       case CMD_PREP_WINDOW_S:
+               state->sflag.wl = cmd_find_window(cmdq, sflag, &state->sflag.s);
+               break;
+       case CMD_PREP_PANE_S:
+               state->sflag.wl = cmd_find_pane(cmdq, sflag, &state->sflag.s,
+                   &state->sflag.wp);
+               break;
+       case CMD_PREP_INDEX_S:
+               state->sflag.idx = cmd_find_index(cmdq, sflag, &state->sflag.s);
+               break;
+       default:
+               log_fatalx("too many -s flags for %s", cmd->entry->name);
+       }
+
+       if (cmd->entry->flags & CMD_PREP_CLIENT_C) {
+               if (cmd->entry->flags & CMD_PREP_CLIENT_T)
+                       log_fatalx("both -t and -c for %s", cmd->entry->name);
+               state->c = cmd_find_client(cmdq, args_get(args, 'c'), 0);
+       }
 }
 
 size_t
diff --git a/tmux.h b/tmux.h
index 3b34753..372fede 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1362,23 +1362,25 @@ struct args {
 
 /* Context for a command about to be executed. */
 struct cmd_state {
-       struct client           *c;
+       struct client                   *c;
 
-       struct session          *s;
-       struct session          *s2;
+       struct {
+               struct session          *s;
+               struct winlink          *wl;
+               struct window_pane      *wp;
+               int                      idx;
 
-       struct winlink          *wl;
-       struct winlink          *wl2;
-
-       struct window           *w;
-
-       struct window_pane      *wp;
-       struct window_pane      *wp2;
+               const char              *prior;
+       } tflag;
 
-       int                      idx;
+       struct {
+               struct session          *s;
+               struct winlink          *wl;
+               struct window_pane      *wp;
+               int                      idx;
 
-       const char              *tflag;
-       const char              *prior_tflag;
+               const char              *prior;
+       } sflag;
 };
 
 /* Command and list of commands. */
@@ -1450,17 +1452,24 @@ struct cmd_entry {
 #define CMD_STARTSERVER 0x1
 #define CMD_CANTNEST 0x2
 #define CMD_READONLY 0x4
-#define CMD_PREPARESESSION 0x8
-#define CMD_PREPARESESSION2 0x10
-#define CMD_PREPAREWINDOW 0x20
-#define CMD_PREPAREPANE 0x40
-#define CMD_PREPAREPANE2 0x80
-#define CMD_PREPARECLIENT 0x100
-#define CMD_PREPAREIDX 0x200
+#define CMD_PREP_SESSION_T 0x8
+#define CMD_PREP_SESSION_S 0x10
+#define CMD_PREP_WINDOW_T 0x20
+#define CMD_PREP_WINDOW_S 0x40
+#define CMD_PREP_PANE_T 0x80
+#define CMD_PREP_PANE_S 0x100
+#define CMD_PREP_CLIENT_T 0x200
+#define CMD_PREP_CLIENT_C 0x400
+#define CMD_PREP_INDEX_T 0x800
+#define CMD_PREP_INDEX_S 0x1000
        int              flags;
 
        enum cmd_retval  (*exec)(struct cmd *, struct cmd_q *);
 };
+#define CMD_PREP_ALL_T (CMD_PREP_SESSION_T|CMD_PREP_WINDOW_T|CMD_PREP_PANE_T| \
+    CMD_PREP_CLIENT_T|CMD_PREP_INDEX_T)
+#define CMD_PREP_ALL_S (CMD_PREP_SESSION_S|CMD_PREP_WINDOW_S|CMD_PREP_PANE_S| \
+    CMD_PREP_INDEX_S)
 
 /* Key binding. */
 struct key_binding {


-----------------------------------------------------------------------

Summary of changes:
 cmd-attach-session.c   |    4 +--
 cmd-break-pane.c       |    6 +--
 cmd-capture-pane.c     |    4 +-
 cmd-choose-buffer.c    |    6 ++--
 cmd-choose-client.c    |    6 ++--
 cmd-choose-tree.c      |   13 +++-----
 cmd-clear-history.c    |    7 ++--
 cmd-clock-mode.c       |    7 ++--
 cmd-command-prompt.c   |    4 +-
 cmd-confirm-before.c   |    4 +-
 cmd-copy-mode.c        |    5 ++-
 cmd-detach-client.c    |   10 +++--
 cmd-display-message.c  |   21 ++++++++-----
 cmd-display-panes.c    |    7 ++--
 cmd-find-window.c      |    6 ++--
 cmd-has-session.c      |    8 +++--
 cmd-if-shell.c         |   20 ++++++------
 cmd-join-pane.c        |   13 +++----
 cmd-kill-pane.c        |    6 ++--
 cmd-kill-session.c     |    4 +-
 cmd-kill-window.c      |    8 ++--
 cmd-list-clients.c     |   11 ++++--
 cmd-list-keys.c        |    3 +-
 cmd-list-panes.c       |    8 ++--
 cmd-list-windows.c     |    5 ++-
 cmd-lock-server.c      |   13 +++++---
 cmd-move-window.c      |   13 +++----
 cmd-new-session.c      |   11 +++---
 cmd-new-window.c       |   13 ++++---
 cmd-paste-buffer.c     |    7 ++--
 cmd-pipe-pane.c        |    5 +--
 cmd-queue.c            |   30 +++++++++++-------
 cmd-refresh-client.c   |    4 +-
 cmd-rename-session.c   |    4 +-
 cmd-rename-window.c    |    5 ++-
 cmd-resize-pane.c      |    5 +--
 cmd-respawn-pane.c     |    6 +--
 cmd-respawn-window.c   |    5 +--
 cmd-rotate-window.c    |    5 ++-
 cmd-run-shell.c        |   14 +++++---
 cmd-select-layout.c    |    8 ++--
 cmd-select-pane.c      |   11 +++---
 cmd-select-window.c    |   16 +++++----
 cmd-send-keys.c        |    8 ++---
 cmd-set-environment.c  |    4 +-
 cmd-set-hook.c         |   10 ++---
 cmd-show-environment.c |    5 +--
 cmd-show-hooks.c       |    4 +-
 cmd-show-messages.c    |    6 ++--
 cmd-show-options.c     |   10 +++--
 cmd-split-window.c     |   10 ++----
 cmd-swap-pane.c        |    6 ++--
 cmd-swap-window.c      |   13 +++++---
 cmd-switch-client.c    |    5 +--
 cmd.c                  |   80 +++++++++++++++++++++++++++++++++--------------
 tmux.h                 |   49 +++++++++++++++++------------
 56 files changed, 317 insertions(+), 264 deletions(-)


hooks/post-receive
-- 
tmux

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
tmux-cvs mailing list
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to