From 2c0f826c360fc5a8f0e125759b596eb28441ba65 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 22 Apr 2017 08:56:24 +0000 Subject: Mouse bindings and hooks set up an initial current state when running a command. This is used for the session, window and pane for all commands in the command sequence if there is no -t or -s. However, using it for all commands in the command sequence means that if the active pane or current session is changed, subsequent commands still use the previous state. So make commands which explicitly change the current state (such as neww and selectp) update it themselves for later commands. Commands which may invalidate the state (like killp) are already OK because an invalid state will be ignored. Also fill in the current state for all key bindings rather than just the mouse, so that any omissions are easier to spot. --- cmd-attach-session.c | 5 +++++ cmd-break-pane.c | 5 ++++- cmd-find-window.c | 5 ++++- cmd-join-pane.c | 2 ++ cmd-new-session.c | 4 +++- cmd-new-window.c | 2 ++ cmd-select-pane.c | 4 +++- cmd-select-window.c | 15 ++++++++++----- cmd-split-window.c | 2 ++ cmd-switch-client.c | 1 + server-client.c | 16 +++++----------- 11 files changed, 41 insertions(+), 20 deletions(-) diff --git a/cmd-attach-session.c b/cmd-attach-session.c index 684fc3f1..22d9320d 100644 --- a/cmd-attach-session.c +++ b/cmd-attach-session.c @@ -50,6 +50,7 @@ enum cmd_retval cmd_attach_session(struct cmdq_item *item, int dflag, int rflag, const char *cflag, int Eflag) { + struct cmd_find_state *current = &item->shared->current; struct session *s = item->state.tflag.s; struct client *c = item->client, *c_loop; struct winlink *wl = item->state.tflag.wl; @@ -73,6 +74,10 @@ cmd_attach_session(struct cmdq_item *item, int dflag, int rflag, if (wp != NULL) window_set_active_pane(wp->window, wp); session_set_current(s, wl); + if (wp != NULL) + cmd_find_from_winlink_pane(current, wl, wp); + else + cmd_find_from_winlink(current, wl); } if (cflag != NULL) { diff --git a/cmd-break-pane.c b/cmd-break-pane.c index 3c564a0c..a2648418 100644 --- a/cmd-break-pane.c +++ b/cmd-break-pane.c @@ -48,6 +48,7 @@ static enum cmd_retval cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct cmd_find_state *current = &item->shared->current; struct client *c = item->state.c; struct winlink *wl = item->state.sflag.wl; struct session *src_s = item->state.sflag.s; @@ -93,8 +94,10 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item) if (idx == -1) idx = -1 - options_get_number(dst_s->options, "base-index"); wl = session_attach(dst_s, w, idx, &cause); /* can't fail */ - if (!args_has(self->args, 'd')) + if (!args_has(self->args, 'd')) { session_select(dst_s, wl->idx); + cmd_find_from_session(current, dst_s); + } server_redraw_session(src_s); if (src_s != dst_s) diff --git a/cmd-find-window.c b/cmd-find-window.c index 129f6afe..0392688a 100644 --- a/cmd-find-window.c +++ b/cmd-find-window.c @@ -142,6 +142,7 @@ static enum cmd_retval cmd_find_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct cmd_find_state *current = &item->shared->current; struct client *c = item->state.c; struct window_choose_data *cdata; struct session *s = item->state.tflag.s; @@ -177,8 +178,10 @@ cmd_find_window_exec(struct cmd *self, struct cmdq_item *item) } if (TAILQ_NEXT(TAILQ_FIRST(&find_list), entry) == NULL) { - if (session_select(s, TAILQ_FIRST(&find_list)->wl->idx) == 0) + if (session_select(s, TAILQ_FIRST(&find_list)->wl->idx) == 0) { + cmd_find_from_session(current, s); server_redraw_session(s); + } recalculate_sizes(); goto out; } diff --git a/cmd-join-pane.c b/cmd-join-pane.c index d2a50282..eb2f6022 100644 --- a/cmd-join-pane.c +++ b/cmd-join-pane.c @@ -63,6 +63,7 @@ static enum cmd_retval cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct cmd_find_state *current = &item->shared->current; struct session *dst_s; struct winlink *src_wl, *dst_wl; struct window *src_w, *dst_w; @@ -146,6 +147,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) if (!args_has(args, 'd')) { window_set_active_pane(dst_w, src_wp); session_select(dst_s, dst_idx); + cmd_find_from_session(current, dst_s); server_redraw_session(dst_s); } else server_status_session(dst_s); diff --git a/cmd-new-session.c b/cmd-new-session.c index 0808b60c..cf0528d3 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -324,8 +324,10 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) free(cp); } - if (!detached) + if (!detached) { c->flags |= CLIENT_ATTACHED; + cmd_find_from_session(&item->shared->current, s); + } if (to_free != NULL) free((void *)to_free); diff --git a/cmd-new-window.c b/cmd-new-window.c index e99a8089..cbbcda2f 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -52,6 +52,7 @@ static enum cmd_retval cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct cmd_find_state *current = &item->shared->current; struct session *s = item->state.tflag.s; struct winlink *wl = item->state.tflag.wl; struct client *c = item->state.c; @@ -132,6 +133,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) } if (!detached) { session_select(s, wl->idx); + cmd_find_from_winlink(current, wl); server_redraw_session_group(s); } else server_status_session_group(s); diff --git a/cmd-select-pane.c b/cmd-select-pane.c index 7fc5d6ee..700bacb2 100644 --- a/cmd-select-pane.c +++ b/cmd-select-pane.c @@ -56,6 +56,7 @@ static enum cmd_retval cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct cmd_find_state *current = &item->shared->current; struct winlink *wl = item->state.tflag.wl; struct window *w = wl->window; struct session *s = item->state.tflag.s; @@ -68,7 +69,6 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no last pane"); return (CMD_RETURN_ERROR); } - if (args_has(self->args, 'e')) lastwp->flags &= ~PANE_INPUTOFF; else if (args_has(self->args, 'd')) @@ -77,6 +77,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) server_unzoom_window(w); window_redraw_active_switch(w, lastwp); if (window_set_active_pane(w, lastwp)) { + cmd_find_from_winlink(current, wl); server_status_window(w); server_redraw_window_borders(w); } @@ -155,6 +156,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) } window_redraw_active_switch(w, wp); if (window_set_active_pane(w, wp)) { + cmd_find_from_winlink(current, wl); server_status_window(w); server_redraw_window_borders(w); } diff --git a/cmd-select-window.c b/cmd-select-window.c index b741af51..4cc4b536 100644 --- a/cmd-select-window.c +++ b/cmd-select-window.c @@ -84,9 +84,10 @@ const struct cmd_entry cmd_last_window_entry = { static enum cmd_retval cmd_select_window_exec(struct cmd *self, struct cmdq_item *item) { - struct winlink *wl = item->state.tflag.wl; - struct session *s = item->state.tflag.s; - int next, previous, last, activity; + struct cmd_find_state *current = &item->shared->current; + struct winlink *wl = item->state.tflag.wl; + struct session *s = item->state.tflag.s; + int next, previous, last, activity; next = self->entry == &cmd_next_window_entry; if (args_has(self->args, 'n')) @@ -116,7 +117,7 @@ cmd_select_window_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_ERROR); } } - + cmd_find_from_session(&item->shared->current, s); server_redraw_session(s); } else { /* @@ -128,9 +129,13 @@ cmd_select_window_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no last window"); return (-1); } + if (current->s == s) + cmd_find_from_session(current, s); server_redraw_session(s); - } else if (session_select(s, wl->idx) == 0) + } else if (session_select(s, wl->idx) == 0) { + cmd_find_from_session(current, s); server_redraw_session(s); + } } recalculate_sizes(); diff --git a/cmd-split-window.c b/cmd-split-window.c index cb39d8f8..57513e3f 100644 --- a/cmd-split-window.c +++ b/cmd-split-window.c @@ -53,6 +53,7 @@ const struct cmd_entry cmd_split_window_entry = { static enum cmd_retval cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) { + struct cmd_find_state *current = &item->shared->current; struct args *args = self->args; struct client *c = item->state.c; struct session *s = item->state.tflag.s; @@ -156,6 +157,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) if (!args_has(args, 'd')) { window_set_active_pane(w, new_wp); session_select(s, wl->idx); + cmd_find_from_session(current, s); server_redraw_session(s); } else server_status_session(s); diff --git a/cmd-switch-client.c b/cmd-switch-client.c index 06388d44..dbb57ff0 100644 --- a/cmd-switch-client.c +++ b/cmd-switch-client.c @@ -99,6 +99,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item *item) if (wp != NULL) window_set_active_pane(wp->window, wp); session_set_current(s, state->tflag.wl); + cmd_find_from_session(&item->shared->current, s); } } diff --git a/server-client.c b/server-client.c index 875f7ef7..f64e93bd 100644 --- a/server-client.c +++ b/server-client.c @@ -856,10 +856,9 @@ server_client_handle_key(struct client *c, key_code key) m->valid = 0; /* Find affected pane. */ - if (KEYC_IS_MOUSE(key) && m->valid) - wp = cmd_mouse_pane(m, NULL, NULL); - else - wp = w->active; + if (!KEYC_IS_MOUSE(key) || cmd_find_from_mouse(&fs, m) != 0) + cmd_find_from_session(&fs, s); + wp = fs.wp; /* Forward mouse keys if disabled. */ if (KEYC_IS_MOUSE(key) && !options_get_number(s->options, "mouse")) @@ -946,13 +945,8 @@ retry: } server_status_client(c); - /* Find default state if the pane is known. */ - if (KEYC_IS_MOUSE(key) && m->valid && wp != NULL) { - cmd_find_from_winlink_pane(&fs, s->curw, wp); - cmd_find_log_state(__func__, &fs); - key_bindings_dispatch(bd, c, m, &fs); - } else - key_bindings_dispatch(bd, c, m, NULL); + /* Execute the key binding. */ + key_bindings_dispatch(bd, c, m, &fs); key_bindings_unref_table(table); return; } -- cgit From ee45a8a149e1a3c8fe7c232a9e32f3a007e21bee Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 22 Apr 2017 10:22:39 +0000 Subject: Get rid of the extra layer of flags and cmd_prepare() and just store the CMD_FIND_* flags in the cmd_entry and call it for the command. Commands with special requirements call it themselves and update the target for hooks to use. --- cmd-attach-session.c | 32 ++++++--- cmd-break-pane.c | 19 +++--- cmd-capture-pane.c | 6 +- cmd-choose-buffer.c | 6 +- cmd-choose-client.c | 6 +- cmd-choose-tree.c | 12 ++-- cmd-command-prompt.c | 7 +- cmd-confirm-before.c | 7 +- cmd-copy-mode.c | 6 +- cmd-detach-client.c | 14 ++-- cmd-display-message.c | 12 ++-- cmd-display-panes.c | 7 +- cmd-find-window.c | 8 +-- cmd-find.c | 6 ++ cmd-if-shell.c | 10 +-- cmd-join-pane.c | 18 ++--- cmd-kill-pane.c | 6 +- cmd-kill-session.c | 4 +- cmd-kill-window.c | 8 +-- cmd-list-clients.c | 4 +- cmd-list-panes.c | 6 +- cmd-list-windows.c | 4 +- cmd-lock-server.c | 19 +++--- cmd-move-window.c | 31 ++++++--- cmd-new-session.c | 12 ++-- cmd-new-window.c | 10 +-- cmd-paste-buffer.c | 4 +- cmd-pipe-pane.c | 10 +-- cmd-queue.c | 42 ++++++++---- cmd-refresh-client.c | 7 +- cmd-rename-session.c | 4 +- cmd-rename-window.c | 4 +- cmd-resize-pane.c | 8 +-- cmd-respawn-pane.c | 8 +-- cmd-respawn-window.c | 6 +- cmd-rotate-window.c | 4 +- cmd-run-shell.c | 10 +-- cmd-select-layout.c | 8 +-- cmd-select-pane.c | 10 +-- cmd-select-window.c | 12 ++-- cmd-send-keys.c | 10 +-- cmd-set-environment.c | 6 +- cmd-set-hook.c | 8 +-- cmd-set-option.c | 6 +- cmd-show-environment.c | 8 +-- cmd-show-messages.c | 7 +- cmd-show-options.c | 6 +- cmd-split-window.c | 10 +-- cmd-swap-pane.c | 12 ++-- cmd-swap-window.c | 12 ++-- cmd-switch-client.c | 33 +++++++--- cmd.c | 174 ------------------------------------------------- tmux.h | 52 ++++----------- 53 files changed, 323 insertions(+), 438 deletions(-) diff --git a/cmd-attach-session.c b/cmd-attach-session.c index 22d9320d..81ed4a87 100644 --- a/cmd-attach-session.c +++ b/cmd-attach-session.c @@ -40,21 +40,23 @@ const struct cmd_entry cmd_attach_session_entry = { .args = { "c:dErt:", 0, 0 }, .usage = "[-dEr] [-c working-directory] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION_WITHPANE, + /* -t is special */ .flags = CMD_STARTSERVER, .exec = cmd_attach_session_exec }; enum cmd_retval -cmd_attach_session(struct cmdq_item *item, int dflag, int rflag, - const char *cflag, int Eflag) +cmd_attach_session(struct cmdq_item *item, const char *tflag, int dflag, + int rflag, const char *cflag, int Eflag) { struct cmd_find_state *current = &item->shared->current; - struct session *s = item->state.tflag.s; + enum cmd_find_type type; + int flags; struct client *c = item->client, *c_loop; - struct winlink *wl = item->state.tflag.wl; - struct window_pane *wp = item->state.tflag.wp; + struct session *s; + struct winlink *wl; + struct window_pane *wp; char *cause; if (RB_EMPTY(&sessions)) { @@ -70,6 +72,19 @@ cmd_attach_session(struct cmdq_item *item, int dflag, int rflag, return (CMD_RETURN_ERROR); } + if (tflag != NULL && tflag[strcspn(tflag, ":.")] != '\0') { + type = CMD_FIND_PANE; + flags = 0; + } else { + type = CMD_FIND_SESSION; + flags = CMD_FIND_PREFER_UNATTACHED; + } + if (cmd_find_target(&item->target, item, tflag, type, flags) != 0) + return (CMD_RETURN_ERROR); + s = item->target.s; + wl = item->target.wl; + wp = item->target.wp; + if (wl != NULL) { if (wp != NULL) window_set_active_pane(wp->window, wp); @@ -150,6 +165,7 @@ cmd_attach_session_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - return (cmd_attach_session(item, args_has(args, 'd'), - args_has(args, 'r'), args_get(args, 'c'), args_has(args, 'E'))); + return (cmd_attach_session(item, args_get(args, 't'), + args_has(args, 'd'), args_has(args, 'r'), args_get(args, 'c'), + args_has(args, 'E'))); } diff --git a/cmd-break-pane.c b/cmd-break-pane.c index a2648418..b92c5077 100644 --- a/cmd-break-pane.c +++ b/cmd-break-pane.c @@ -35,10 +35,11 @@ const struct cmd_entry cmd_break_pane_entry = { .alias = "breakp", .args = { "dPF:n:s:t:", 0, 0 }, - .usage = "[-dP] [-F format] [-n window-name] [-s src-pane] [-t dst-window]", + .usage = "[-dP] [-F format] [-n window-name] [-s src-pane] " + "[-t dst-window]", - .sflag = CMD_PANE, - .tflag = CMD_WINDOW_INDEX, + .source = { 's', CMD_FIND_PANE, 0 }, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_WINDOW_INDEX }, .flags = 0, .exec = cmd_break_pane_exec @@ -49,14 +50,14 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_find_state *current = &item->shared->current; - struct client *c = item->state.c; - struct winlink *wl = item->state.sflag.wl; - struct session *src_s = item->state.sflag.s; - struct session *dst_s = item->state.tflag.s; - struct window_pane *wp = item->state.sflag.wp; + struct client *c = cmd_find_client(item, NULL, 1); + struct winlink *wl = item->source.wl; + struct session *src_s = item->source.s; + struct session *dst_s = item->target.s; + struct window_pane *wp = item->source.wp; struct window *w = wl->window; char *name, *cause; - int idx = item->state.tflag.idx; + int idx = item->target.idx; const char *template; char *cp; diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index 87db6e99..d3d7e8f8 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -43,7 +43,7 @@ const struct cmd_entry cmd_capture_pane_entry = { .usage = "[-aCeJpPq] " CMD_BUFFER_USAGE " [-E end-line] " "[-S start-line]" CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_capture_pane_exec @@ -56,7 +56,7 @@ const struct cmd_entry cmd_clear_history_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_capture_pane_exec @@ -193,7 +193,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct client *c; - struct window_pane *wp = item->state.tflag.wp; + struct window_pane *wp = item->target.wp; char *buf, *cause; const char *bufname; size_t len; diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c index ae619b6c..52ad0ac1 100644 --- a/cmd-choose-buffer.c +++ b/cmd-choose-buffer.c @@ -40,7 +40,7 @@ const struct cmd_entry cmd_choose_buffer_entry = { .args = { "F:t:", 0, 1 }, .usage = CMD_TARGET_WINDOW_USAGE " [-F format] [template]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_choose_buffer_exec @@ -50,8 +50,8 @@ static enum cmd_retval cmd_choose_buffer_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; - struct winlink *wl = item->state.tflag.wl; + struct client *c = cmd_find_client(item, NULL, 1); + struct winlink *wl = item->target.wl; struct window_choose_data *cdata; struct paste_buffer *pb; char *action, *action_data; diff --git a/cmd-choose-client.c b/cmd-choose-client.c index 96a79534..88118209 100644 --- a/cmd-choose-client.c +++ b/cmd-choose-client.c @@ -45,7 +45,7 @@ const struct cmd_entry cmd_choose_client_entry = { .args = { "F:t:", 0, 1 }, .usage = CMD_TARGET_WINDOW_USAGE " [-F format] [template]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_choose_client_exec @@ -59,10 +59,10 @@ static enum cmd_retval cmd_choose_client_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; + struct client *c = cmd_find_client(item, NULL, 1); struct client *c1; struct window_choose_data *cdata; - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; const char *template; char *action; u_int idx, cur; diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c index 65d55407..28b5013a 100644 --- a/cmd-choose-tree.c +++ b/cmd-choose-tree.c @@ -51,7 +51,7 @@ const struct cmd_entry cmd_choose_tree_entry = { .usage = "[-suw] [-b session-template] [-c window template] " "[-S format] [-W format] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_choose_tree_exec @@ -64,7 +64,7 @@ const struct cmd_entry cmd_choose_session_entry = { .args = { "F:t:", 0, 1 }, .usage = CMD_TARGET_WINDOW_USAGE " [-F format] [template]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_choose_tree_exec @@ -77,7 +77,7 @@ const struct cmd_entry cmd_choose_window_entry = { .args = { "F:t:", 0, 1 }, .usage = CMD_TARGET_WINDOW_USAGE "[-F format] [template]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_choose_tree_exec @@ -87,9 +87,9 @@ static enum cmd_retval cmd_choose_tree_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; - struct winlink *wl = item->state.tflag.wl, *wm; - struct session *s = item->state.tflag.s, *s2; + struct client *c = cmd_find_client(item, NULL, 1); + struct winlink *wl = item->target.wl, *wm; + struct session *s = item->target.s, *s2; struct window_choose_data *wcd = NULL; const char *ses_template, *win_template; char *final_win_action, *cur_win_template; diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c index 41bbe01d..45a71525 100644 --- a/cmd-command-prompt.c +++ b/cmd-command-prompt.c @@ -43,8 +43,6 @@ const struct cmd_entry cmd_command_prompt_entry = { .usage = "[-1Ni] [-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " " "[template]", - .tflag = CMD_CLIENT, - .flags = 0, .exec = cmd_command_prompt_exec }; @@ -69,10 +67,13 @@ cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item) struct args *args = self->args; const char *inputs, *prompts; struct cmd_command_prompt_cdata *cdata; - struct client *c = item->state.c; + struct client *c; char *prompt, *ptr, *input = NULL; size_t n; + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + if (c->prompt_string != NULL) return (CMD_RETURN_NORMAL); diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index e7366ec2..3042d066 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -41,8 +41,6 @@ const struct cmd_entry cmd_confirm_before_entry = { .args = { "p:t:", 1, 1 }, .usage = "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command", - .tflag = CMD_CLIENT, - .flags = 0, .exec = cmd_confirm_before_exec }; @@ -57,10 +55,13 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_confirm_before_data *cdata; - struct client *c = item->state.c; + struct client *c; char *cmd, *copy, *new_prompt, *ptr; const char *prompt; + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + if ((prompt = args_get(args, 'p')) != NULL) xasprintf(&new_prompt, "%s ", prompt); else { diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c index 35c41a3a..5599bb96 100644 --- a/cmd-copy-mode.c +++ b/cmd-copy-mode.c @@ -33,7 +33,7 @@ const struct cmd_entry cmd_copy_mode_entry = { .args = { "Met:u", 0, 0 }, .usage = "[-Mu] " CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_copy_mode_exec @@ -46,7 +46,7 @@ const struct cmd_entry cmd_clock_mode_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_copy_mode_exec @@ -59,7 +59,7 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) struct cmdq_shared *shared = item->shared; struct client *c = item->client; struct session *s; - struct window_pane *wp = item->state.tflag.wp; + struct window_pane *wp = item->target.wp; if (args_has(args, 'M')) { if ((wp = cmd_mouse_pane(&shared->mouse, &s, NULL)) == NULL) diff --git a/cmd-detach-client.c b/cmd-detach-client.c index 2e21f795..85b9a4ed 100644 --- a/cmd-detach-client.c +++ b/cmd-detach-client.c @@ -37,8 +37,7 @@ const struct cmd_entry cmd_detach_client_entry = { .usage = "[-aP] [-E shell-command] " "[-s target-session] " CMD_TARGET_CLIENT_USAGE, - .sflag = CMD_SESSION, - .tflag = CMD_CLIENT, + .source = { 's', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, .flags = CMD_READONLY, .exec = cmd_detach_client_exec @@ -51,8 +50,6 @@ const struct cmd_entry cmd_suspend_client_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_CLIENT_USAGE, - .tflag = CMD_CLIENT, - .flags = 0, .exec = cmd_detach_client_exec }; @@ -61,11 +58,14 @@ static enum cmd_retval cmd_detach_client_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c, *cloop; + struct client *c, *cloop; struct session *s; enum msgtype msgtype; const char *cmd = args_get(args, 'E'); + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + if (self->entry == &cmd_suspend_client_entry) { server_client_suspend(c); return (CMD_RETURN_NORMAL); @@ -77,7 +77,9 @@ cmd_detach_client_exec(struct cmd *self, struct cmdq_item *item) msgtype = MSG_DETACH; if (args_has(args, 's')) { - s = item->state.sflag.s; + s = item->source.s; + if (s == NULL) + return (CMD_RETURN_NORMAL); TAILQ_FOREACH(cloop, &clients, entry) { if (cloop->session == s) { if (cmd != NULL) diff --git a/cmd-display-message.c b/cmd-display-message.c index 3bb5f9ac..41be8362 100644 --- a/cmd-display-message.c +++ b/cmd-display-message.c @@ -43,8 +43,7 @@ const struct cmd_entry cmd_display_message_entry = { .usage = "[-p] [-c target-client] [-F format] " CMD_TARGET_PANE_USAGE " [message]", - .cflag = CMD_CLIENT_CANFAIL, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_display_message_exec @@ -54,10 +53,10 @@ static enum cmd_retval cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; - struct window_pane *wp = item->state.tflag.wp; + struct client *c; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct window_pane *wp = item->target.wp; const char *template; char *msg; struct format_tree *ft; @@ -66,6 +65,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "only one of -F or argument must be given"); return (CMD_RETURN_ERROR); } + c = cmd_find_client(item, args_get(args, 'c'), 1); template = args_get(args, 'F'); if (args->argc != 0) diff --git a/cmd-display-panes.c b/cmd-display-panes.c index 6a2fbfd8..5593b268 100644 --- a/cmd-display-panes.c +++ b/cmd-display-panes.c @@ -40,8 +40,6 @@ const struct cmd_entry cmd_display_panes_entry = { .args = { "t:", 0, 1 }, .usage = CMD_TARGET_CLIENT_USAGE, - .tflag = CMD_CLIENT, - .flags = CMD_AFTERHOOK, .exec = cmd_display_panes_exec }; @@ -50,7 +48,10 @@ static enum cmd_retval cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; + struct client *c; + + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); if (c->identify_callback != NULL) return (CMD_RETURN_NORMAL); diff --git a/cmd-find-window.c b/cmd-find-window.c index 0392688a..06cdd946 100644 --- a/cmd-find-window.c +++ b/cmd-find-window.c @@ -54,7 +54,7 @@ const struct cmd_entry cmd_find_window_entry = { .args = { "F:CNt:T", 1, 4 }, .usage = "[-CNT] [-F format] " CMD_TARGET_WINDOW_USAGE " match-string", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_find_window_exec @@ -143,10 +143,10 @@ cmd_find_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_find_state *current = &item->shared->current; - struct client *c = item->state.c; + struct client *c = cmd_find_client(item, NULL, 1); struct window_choose_data *cdata; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl, *wm; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl, *wm; struct cmd_find_window_list find_list; struct cmd_find_window_data *find_data; struct cmd_find_window_data *find_data1; diff --git a/cmd-find.c b/cmd-find.c index 44f50bf7..630a6340 100644 --- a/cmd-find.c +++ b/cmd-find.c @@ -953,6 +953,10 @@ cmd_find_target(struct cmd_find_state *fs, struct cmdq_item *item, const char *session, *window, *pane; int window_only = 0, pane_only = 0; + /* Can fail flag implies quiet. */ + if (flags & CMD_FIND_CANFAIL) + flags |= CMD_FIND_QUIET; + /* Log the arguments. */ if (target == NULL) log_debug("%s: target none, type %d", __func__, type); @@ -1190,6 +1194,8 @@ error: log_debug("%s: error", __func__); free(copy); + if (flags & CMD_FIND_CANFAIL) + return (0); return (-1); found: diff --git a/cmd-if-shell.c b/cmd-if-shell.c index 4a93885b..580526f8 100644 --- a/cmd-if-shell.c +++ b/cmd-if-shell.c @@ -43,7 +43,7 @@ const struct cmd_entry cmd_if_shell_entry = { .usage = "[-bF] " CMD_TARGET_PANE_USAGE " shell-command command " "[command]", - .tflag = CMD_PANE_CANFAIL, + .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL }, .flags = 0, .exec = cmd_if_shell_exec @@ -70,10 +70,10 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item) char *shellcmd, *cmd, *cause; struct cmd_list *cmdlist; struct cmdq_item *new_item; - struct client *c = item->state.c; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; - struct window_pane *wp = item->state.tflag.wp; + struct client *c = cmd_find_client(item, NULL, 1); + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct window_pane *wp = item->target.wp; const char *cwd; if (item->client != NULL && item->client->session == NULL) diff --git a/cmd-join-pane.c b/cmd-join-pane.c index eb2f6022..a4ab81f7 100644 --- a/cmd-join-pane.c +++ b/cmd-join-pane.c @@ -38,8 +38,8 @@ const struct cmd_entry cmd_join_pane_entry = { .args = { "bdhvp:l:s:t:", 0, 0 }, .usage = "[-bdhv] [-p percentage|-l size] " CMD_SRCDST_PANE_USAGE, - .sflag = CMD_PANE_MARKED, - .tflag = CMD_PANE, + .source = { 's', CMD_FIND_PANE, CMD_FIND_DEFAULT_MARKED }, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_join_pane_exec @@ -52,8 +52,8 @@ const struct cmd_entry cmd_move_pane_entry = { .args = { "bdhvp:l:s:t:", 0, 0 }, .usage = "[-bdhv] [-p percentage|-l size] " CMD_SRCDST_PANE_USAGE, - .sflag = CMD_PANE, - .tflag = CMD_PANE, + .source = { 's', CMD_FIND_PANE, 0 }, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_join_pane_exec @@ -79,15 +79,15 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) else not_same_window = 0; - dst_s = item->state.tflag.s; - dst_wl = item->state.tflag.wl; - dst_wp = item->state.tflag.wp; + dst_s = item->target.s; + dst_wl = item->target.wl; + dst_wp = item->target.wp; dst_w = dst_wl->window; dst_idx = dst_wl->idx; server_unzoom_window(dst_w); - src_wl = item->state.sflag.wl; - src_wp = item->state.sflag.wp; + src_wl = item->source.wl; + src_wp = item->source.wp; src_w = src_wl->window; server_unzoom_window(src_w); diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c index 19dcf96f..a8a423d0 100644 --- a/cmd-kill-pane.c +++ b/cmd-kill-pane.c @@ -35,7 +35,7 @@ const struct cmd_entry cmd_kill_pane_entry = { .args = { "at:", 0, 0 }, .usage = "[-a] " CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_kill_pane_exec @@ -44,8 +44,8 @@ const struct cmd_entry cmd_kill_pane_entry = { static enum cmd_retval cmd_kill_pane_exec(struct cmd *self, struct cmdq_item *item) { - struct winlink *wl = item->state.tflag.wl; - struct window_pane *loopwp, *tmpwp, *wp = item->state.tflag.wp; + struct winlink *wl = item->target.wl; + struct window_pane *loopwp, *tmpwp, *wp = item->target.wp; server_unzoom_window(wl->window); diff --git a/cmd-kill-session.c b/cmd-kill-session.c index 200fe4f9..87ab8a0a 100644 --- a/cmd-kill-session.c +++ b/cmd-kill-session.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_kill_session_entry = { .args = { "aCt:", 0, 0 }, .usage = "[-aC] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = 0, .exec = cmd_kill_session_exec @@ -49,7 +49,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmdq_item *item) struct session *s, *sloop, *stmp; struct winlink *wl; - s = item->state.tflag.s; + s = item->target.s; if (args_has(args, 'C')) { RB_FOREACH(wl, winlinks, &s->windows) { diff --git a/cmd-kill-window.c b/cmd-kill-window.c index 6365aecb..50df83ee 100644 --- a/cmd-kill-window.c +++ b/cmd-kill-window.c @@ -33,7 +33,7 @@ const struct cmd_entry cmd_kill_window_entry = { .args = { "at:", 0, 0 }, .usage = "[-a] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_kill_window_exec @@ -46,7 +46,7 @@ const struct cmd_entry cmd_unlink_window_entry = { .args = { "kt:", 0, 0 }, .usage = "[-k] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_kill_window_exec @@ -56,9 +56,9 @@ static enum cmd_retval cmd_kill_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct winlink *wl = item->state.tflag.wl, *wl2, *wl3; + struct winlink *wl = item->target.wl, *wl2, *wl3; struct window *w = wl->window; - struct session *s = item->state.tflag.s; + struct session *s = item->target.s; if (self->entry == &cmd_unlink_window_entry) { if (!args_has(self->args, 'k') && !session_is_linked(s, w)) { diff --git a/cmd-list-clients.c b/cmd-list-clients.c index ca34bf25..df9538e6 100644 --- a/cmd-list-clients.c +++ b/cmd-list-clients.c @@ -42,7 +42,7 @@ const struct cmd_entry cmd_list_clients_entry = { .args = { "F:t:", 0, 0 }, .usage = "[-F format] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = CMD_READONLY|CMD_AFTERHOOK, .exec = cmd_list_clients_exec @@ -60,7 +60,7 @@ cmd_list_clients_exec(struct cmd *self, struct cmdq_item *item) char *line; if (args_has(args, 't')) - s = item->state.tflag.s; + s = item->target.s; else s = NULL; diff --git a/cmd-list-panes.c b/cmd-list-panes.c index d8ca2a93..47a77ade 100644 --- a/cmd-list-panes.c +++ b/cmd-list-panes.c @@ -41,7 +41,7 @@ const struct cmd_entry cmd_list_panes_entry = { .args = { "asF:t:", 0, 0 }, .usage = "[-as] [-F format] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_list_panes_exec @@ -51,8 +51,8 @@ static enum cmd_retval cmd_list_panes_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; if (args_has(args, 'a')) cmd_list_panes_server(self, item); diff --git a/cmd-list-windows.c b/cmd-list-windows.c index 52a8d562..ff7ada95 100644 --- a/cmd-list-windows.c +++ b/cmd-list-windows.c @@ -52,7 +52,7 @@ const struct cmd_entry cmd_list_windows_entry = { .args = { "F:at:", 0, 0 }, .usage = "[-a] [-F format] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_list_windows_exec @@ -66,7 +66,7 @@ cmd_list_windows_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'a')) cmd_list_windows_server(self, item); else - cmd_list_windows_session(self, item->state.tflag.s, item, 0); + cmd_list_windows_session(self, item->target.s, item, 0); return (CMD_RETURN_NORMAL); } diff --git a/cmd-lock-server.c b/cmd-lock-server.c index 117c423f..524fa451 100644 --- a/cmd-lock-server.c +++ b/cmd-lock-server.c @@ -44,7 +44,7 @@ const struct cmd_entry cmd_lock_session_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_lock_server_exec @@ -57,22 +57,25 @@ const struct cmd_entry cmd_lock_client_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_CLIENT_USAGE, - .tflag = CMD_CLIENT, - .flags = CMD_AFTERHOOK, .exec = cmd_lock_server_exec }; static enum cmd_retval -cmd_lock_server_exec(struct cmd *self, __unused struct cmdq_item *item) +cmd_lock_server_exec(struct cmd *self, struct cmdq_item *item) { + struct args *args = self->args; + struct client *c; + if (self->entry == &cmd_lock_server_entry) server_lock(); else if (self->entry == &cmd_lock_session_entry) - server_lock_session(item->state.tflag.s); - else - server_lock_client(item->state.c); - + server_lock_session(item->target.s); + else { + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + server_lock_client(c); + } recalculate_sizes(); return (CMD_RETURN_NORMAL); diff --git a/cmd-move-window.c b/cmd-move-window.c index 7f5cb74a..cb64d1e0 100644 --- a/cmd-move-window.c +++ b/cmd-move-window.c @@ -35,8 +35,8 @@ const struct cmd_entry cmd_move_window_entry = { .args = { "adkrs:t:", 0, 0 }, .usage = "[-dkr] " CMD_SRCDST_WINDOW_USAGE, - .sflag = CMD_WINDOW, - .tflag = CMD_MOVEW_R, + .source = { 's', CMD_FIND_WINDOW, 0 }, + /* -t is special */ .flags = 0, .exec = cmd_move_window_exec @@ -49,8 +49,8 @@ const struct cmd_entry cmd_link_window_entry = { .args = { "adks:t:", 0, 0 }, .usage = "[-dk] " CMD_SRCDST_WINDOW_USAGE, - .sflag = CMD_WINDOW, - .tflag = CMD_WINDOW_INDEX, + .source = { 's', CMD_FIND_WINDOW, 0 }, + /* -t is special */ .flags = 0, .exec = cmd_move_window_exec @@ -60,18 +60,31 @@ static enum cmd_retval cmd_move_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct session *src = item->state.sflag.s; - struct session *dst = item->state.tflag.s; - struct winlink *wl = item->state.sflag.wl; + const char *tflag = args_get(args, 't'); + struct session *src; + struct session *dst; + struct winlink *wl; char *cause; - int idx = item->state.tflag.idx, kflag, dflag, sflag; + int idx, kflag, dflag, sflag; if (args_has(args, 'r')) { - session_renumber_windows(dst); + if (cmd_find_target(&item->target, item, tflag, + CMD_FIND_SESSION, CMD_FIND_QUIET) != 0) + return (CMD_RETURN_ERROR); + + session_renumber_windows(item->target.s); recalculate_sizes(); + server_status_session(item->target.s); return (CMD_RETURN_NORMAL); } + if (cmd_find_target(&item->target, item, tflag, CMD_FIND_WINDOW, + CMD_FIND_WINDOW_INDEX) != 0) + return (CMD_RETURN_ERROR); + src = item->source.s; + dst = item->target.s; + wl = item->source.wl; + idx = item->target.idx; kflag = args_has(self->args, 'k'); dflag = args_has(self->args, 'd'); diff --git a/cmd-new-session.c b/cmd-new-session.c index cf0528d3..8c347ce6 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -44,7 +44,7 @@ const struct cmd_entry cmd_new_session_entry = { "[-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] " "[-y height] [command]", - .tflag = CMD_SESSION_CANFAIL, + .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, .flags = CMD_STARTSERVER, .exec = cmd_new_session_exec @@ -57,7 +57,7 @@ const struct cmd_entry cmd_has_session_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = 0, .exec = cmd_new_session_exec @@ -108,10 +108,10 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) * have already been prepared, copy this * session into its tflag so it can be used. */ - cmd_find_from_session(&item->state.tflag, as); + cmd_find_from_session(&item->target, as); return (cmd_attach_session(item, - args_has(args, 'D'), 0, NULL, - args_has(args, 'E'))); + args_get(args, 't'), args_has(args, 'D'), + 0, NULL, args_has(args, 'E'))); } cmdq_error(item, "duplicate session: %s", newname); return (CMD_RETURN_ERROR); @@ -121,7 +121,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item) /* Is this going to be part of a session group? */ group = args_get(args, 't'); if (group != NULL) { - groupwith = item->state.tflag.s; + groupwith = item->target.s; if (groupwith == NULL) { if (!session_check_name(group)) { cmdq_error(item, "bad group name: %s", group); diff --git a/cmd-new-window.c b/cmd-new-window.c index cbbcda2f..82f1d745 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -42,7 +42,7 @@ const struct cmd_entry cmd_new_window_entry = { .usage = "[-adkP] [-c start-directory] [-F format] [-n window-name] " CMD_TARGET_WINDOW_USAGE " [command]", - .tflag = CMD_WINDOW_INDEX, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_WINDOW_INDEX }, .flags = 0, .exec = cmd_new_window_exec @@ -53,10 +53,10 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_find_state *current = &item->shared->current; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; - struct client *c = item->state.c; - int idx = item->state.tflag.idx; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct client *c = cmd_find_client(item, NULL, 1); + int idx = item->target.idx; const char *cmd, *path, *template, *cwd, *to_free; char **argv, *cause, *cp; int argc, detached; diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c index 20b668fb..baad707a 100644 --- a/cmd-paste-buffer.c +++ b/cmd-paste-buffer.c @@ -38,7 +38,7 @@ const struct cmd_entry cmd_paste_buffer_entry = { .usage = "[-dpr] [-s separator] " CMD_BUFFER_USAGE " " CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_paste_buffer_exec @@ -48,7 +48,7 @@ static enum cmd_retval cmd_paste_buffer_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct window_pane *wp = item->state.tflag.wp; + struct window_pane *wp = item->target.wp; struct paste_buffer *pb; const char *sepstr, *bufname, *bufdata, *bufend, *line; size_t seplen, bufsize; diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c index e43f4a9b..1d467f4d 100644 --- a/cmd-pipe-pane.c +++ b/cmd-pipe-pane.c @@ -44,7 +44,7 @@ const struct cmd_entry cmd_pipe_pane_entry = { .args = { "ot:", 0, 1 }, .usage = "[-o] " CMD_TARGET_PANE_USAGE " [command]", - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_pipe_pane_exec @@ -54,10 +54,10 @@ static enum cmd_retval cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; - struct window_pane *wp = item->state.tflag.wp; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; + struct client *c = cmd_find_client(item, NULL, 1); + struct window_pane *wp = item->target.wp; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; char *cmd; int old_fd, pipe_fd[2], null_fd; struct format_tree *ft; diff --git a/cmd-queue.c b/cmd-queue.c index 99ec6055..5165df17 100644 --- a/cmd-queue.c +++ b/cmd-queue.c @@ -189,14 +189,34 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current, return (first); } +/* Fill in flag for a command. */ +static enum cmd_retval +cmdq_find_flag(struct cmdq_item *item, struct cmd_find_state *fs, + const struct cmd_entry_flag *flag) +{ + const char *value; + + if (flag->flag == 0) { + cmd_find_clear_state(fs, 0); + return (CMD_RETURN_NORMAL); + } + + value = args_get(item->cmd->args, flag->flag); + if (cmd_find_target(fs, item, value, flag->type, flag->flags) != 0) { + cmd_find_clear_state(fs, 0); + return (CMD_RETURN_ERROR); + } + return (CMD_RETURN_NORMAL); +} + /* Fire command on command queue. */ static enum cmd_retval cmdq_fire_command(struct cmdq_item *item) { struct client *c = item->client; struct cmd *cmd = item->cmd; + const struct cmd_entry *entry = cmd->entry; enum cmd_retval retval; - const char *name; struct cmd_find_state *fsp, fs; int flags; @@ -205,27 +225,27 @@ cmdq_fire_command(struct cmdq_item *item) if (item->client == NULL) item->client = cmd_find_client(item, NULL, 1); - - if (cmd_prepare_state(cmd, item) != 0) { - retval = CMD_RETURN_ERROR; + retval = cmdq_find_flag(item, &item->source, &entry->source); + if (retval == CMD_RETURN_ERROR) + goto out; + retval = cmdq_find_flag(item, &item->target, &entry->target); + if (retval == CMD_RETURN_ERROR) goto out; - } - retval = cmd->entry->exec(cmd, item); + retval = entry->exec(cmd, item); if (retval == CMD_RETURN_ERROR) goto out; - if (cmd->entry->flags & CMD_AFTERHOOK) { - name = cmd->entry->name; - if (cmd_find_valid_state(&item->state.tflag)) - fsp = &item->state.tflag; + if (entry->flags & CMD_AFTERHOOK) { + if (cmd_find_valid_state(&item->target)) + fsp = &item->target; else if (cmd_find_valid_state(&item->shared->current)) fsp = &item->shared->current; else if (cmd_find_from_client(&fs, item->client) == 0) fsp = &fs; else goto out; - hooks_insert(fsp->s->hooks, item, fsp, "after-%s", name); + hooks_insert(fsp->s->hooks, item, fsp, "after-%s", entry->name); } out: diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c index 289563c6..5190df89 100644 --- a/cmd-refresh-client.c +++ b/cmd-refresh-client.c @@ -34,8 +34,6 @@ const struct cmd_entry cmd_refresh_client_entry = { .args = { "C:St:", 0, 0 }, .usage = "[-S] [-C size] " CMD_TARGET_CLIENT_USAGE, - .tflag = CMD_CLIENT, - .flags = CMD_AFTERHOOK, .exec = cmd_refresh_client_exec }; @@ -44,10 +42,13 @@ static enum cmd_retval cmd_refresh_client_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; + struct client *c; const char *size; u_int w, h; + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + if (args_has(args, 'C')) { if ((size = args_get(args, 'C')) == NULL) { cmdq_error(item, "missing size"); diff --git a/cmd-rename-session.c b/cmd-rename-session.c index 0c250aa6..e7586e0b 100644 --- a/cmd-rename-session.c +++ b/cmd-rename-session.c @@ -37,7 +37,7 @@ const struct cmd_entry cmd_rename_session_entry = { .args = { "t:", 1, 1 }, .usage = CMD_TARGET_SESSION_USAGE " new-name", - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_rename_session_exec @@ -47,7 +47,7 @@ static enum cmd_retval cmd_rename_session_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct session *s = item->state.tflag.s; + struct session *s = item->target.s; const char *newname; newname = args->argv[0]; diff --git a/cmd-rename-window.c b/cmd-rename-window.c index 89dfdf31..802eab7d 100644 --- a/cmd-rename-window.c +++ b/cmd-rename-window.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_rename_window_entry = { .args = { "t:", 1, 1 }, .usage = CMD_TARGET_WINDOW_USAGE " new-name", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_rename_window_exec @@ -46,7 +46,7 @@ static enum cmd_retval cmd_rename_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; window_set_name(wl->window, args->argv[0]); options_set_number(wl->window->options, "automatic-rename", 0); diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c index b9755c1f..2ad11c23 100644 --- a/cmd-resize-pane.c +++ b/cmd-resize-pane.c @@ -39,7 +39,7 @@ const struct cmd_entry cmd_resize_pane_entry = { .usage = "[-DLMRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " " "[adjustment]", - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_resize_pane_exec @@ -50,11 +50,11 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmdq_shared *shared = item->shared; - struct window_pane *wp = item->state.tflag.wp; - struct winlink *wl = item->state.tflag.wl; + struct window_pane *wp = item->target.wp; + struct winlink *wl = item->target.wl; struct window *w = wl->window; struct client *c = item->client; - struct session *s = item->state.tflag.s; + struct session *s = item->target.s; const char *errstr; char *cause; u_int adjust; diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c index 66e0d955..defdc77e 100644 --- a/cmd-respawn-pane.c +++ b/cmd-respawn-pane.c @@ -37,7 +37,7 @@ const struct cmd_entry cmd_respawn_pane_entry = { .args = { "kt:", 0, -1 }, .usage = "[-k] " CMD_TARGET_PANE_USAGE " [command]", - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_respawn_pane_exec @@ -47,10 +47,10 @@ static enum cmd_retval cmd_respawn_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; struct window *w = wl->window; - struct window_pane *wp = item->state.tflag.wp; - struct session *s = item->state.tflag.s; + struct window_pane *wp = item->target.wp; + struct session *s = item->target.s; struct environ *env; const char *path; char *cause; diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c index 876fab6a..f9edbec7 100644 --- a/cmd-respawn-window.c +++ b/cmd-respawn-window.c @@ -37,7 +37,7 @@ const struct cmd_entry cmd_respawn_window_entry = { .args = { "kt:", 0, -1 }, .usage = "[-k] " CMD_TARGET_WINDOW_USAGE " [command]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_respawn_window_exec @@ -47,8 +47,8 @@ static enum cmd_retval cmd_respawn_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; struct window *w = wl->window; struct window_pane *wp; struct environ *env; diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c index a64797d1..3c15b54e 100644 --- a/cmd-rotate-window.c +++ b/cmd-rotate-window.c @@ -34,7 +34,7 @@ const struct cmd_entry cmd_rotate_window_entry = { .args = { "Dt:U", 0, 0 }, .usage = "[-DU] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_rotate_window_exec @@ -43,7 +43,7 @@ const struct cmd_entry cmd_rotate_window_entry = { static enum cmd_retval cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item) { - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; struct window *w = wl->window; struct window_pane *wp, *wp2; struct layout_cell *lc; diff --git a/cmd-run-shell.c b/cmd-run-shell.c index 906b6909..2565d6a1 100644 --- a/cmd-run-shell.c +++ b/cmd-run-shell.c @@ -42,7 +42,7 @@ const struct cmd_entry cmd_run_shell_entry = { .args = { "bt:", 1, 1 }, .usage = "[-b] " CMD_TARGET_PANE_USAGE " shell-command", - .tflag = CMD_PANE_CANFAIL, + .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL }, .flags = 0, .exec = cmd_run_shell_exec @@ -86,10 +86,10 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_run_shell_data *cdata; - struct client *c = item->state.c; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; - struct window_pane *wp = item->state.tflag.wp; + struct client *c = cmd_find_client(item, NULL, 1); + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct window_pane *wp = item->target.wp; const char *cwd; if (item->client != NULL && item->client->session == NULL) diff --git a/cmd-select-layout.c b/cmd-select-layout.c index 10a7413c..e32f115d 100644 --- a/cmd-select-layout.c +++ b/cmd-select-layout.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_select_layout_entry = { .args = { "nopt:", 0, 1 }, .usage = "[-nop] " CMD_TARGET_WINDOW_USAGE " [layout-name]", - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_select_layout_exec @@ -49,7 +49,7 @@ const struct cmd_entry cmd_next_layout_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_select_layout_exec @@ -62,7 +62,7 @@ const struct cmd_entry cmd_previous_layout_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_select_layout_exec @@ -72,7 +72,7 @@ static enum cmd_retval cmd_select_layout_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; struct window *w; const char *layoutname; char *oldlayout; diff --git a/cmd-select-pane.c b/cmd-select-pane.c index 700bacb2..86152bed 100644 --- a/cmd-select-pane.c +++ b/cmd-select-pane.c @@ -33,7 +33,7 @@ const struct cmd_entry cmd_select_pane_entry = { .args = { "DdegLlMmP:Rt:U", 0, 0 }, .usage = "[-DdegLlMmRU] [-P style] " CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_select_pane_exec @@ -46,7 +46,7 @@ const struct cmd_entry cmd_last_pane_entry = { .args = { "det:", 0, 0 }, .usage = "[-de] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_select_pane_exec @@ -57,10 +57,10 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_find_state *current = &item->shared->current; - struct winlink *wl = item->state.tflag.wl; + struct winlink *wl = item->target.wl; struct window *w = wl->window; - struct session *s = item->state.tflag.s; - struct window_pane *wp = item->state.tflag.wp, *lastwp, *markedwp; + struct session *s = item->target.s; + struct window_pane *wp = item->target.wp, *lastwp, *markedwp; const char *style; if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) { diff --git a/cmd-select-window.c b/cmd-select-window.c index 4cc4b536..6cfaf535 100644 --- a/cmd-select-window.c +++ b/cmd-select-window.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_select_window_entry = { .args = { "lnpTt:", 0, 0 }, .usage = "[-lnpT] " CMD_TARGET_WINDOW_USAGE, - .tflag = CMD_WINDOW, + .target = { 't', CMD_FIND_WINDOW, 0 }, .flags = 0, .exec = cmd_select_window_exec @@ -49,7 +49,7 @@ const struct cmd_entry cmd_next_window_entry = { .args = { "at:", 0, 0 }, .usage = "[-a] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = 0, .exec = cmd_select_window_exec @@ -62,7 +62,7 @@ const struct cmd_entry cmd_previous_window_entry = { .args = { "at:", 0, 0 }, .usage = "[-a] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = 0, .exec = cmd_select_window_exec @@ -75,7 +75,7 @@ const struct cmd_entry cmd_last_window_entry = { .args = { "t:", 0, 0 }, .usage = CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = 0, .exec = cmd_select_window_exec @@ -85,8 +85,8 @@ static enum cmd_retval cmd_select_window_exec(struct cmd *self, struct cmdq_item *item) { struct cmd_find_state *current = &item->shared->current; - struct winlink *wl = item->state.tflag.wl; - struct session *s = item->state.tflag.s; + struct winlink *wl = item->target.wl; + struct session *s = item->target.s; int next, previous, last, activity; next = self->entry == &cmd_next_window_entry; diff --git a/cmd-send-keys.c b/cmd-send-keys.c index d6c958d5..3c61b25b 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_send_keys_entry = { .args = { "lXRMN:t:", 0, -1 }, .usage = "[-lXRM] [-N repeat-count] " CMD_TARGET_PANE_USAGE " key ...", - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_send_keys_exec @@ -49,7 +49,7 @@ const struct cmd_entry cmd_send_prefix_entry = { .args = { "2t:", 0, 0 }, .usage = "[-2] " CMD_TARGET_PANE_USAGE, - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_send_keys_exec @@ -59,9 +59,9 @@ static enum cmd_retval cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; - struct window_pane *wp = item->state.tflag.wp; - struct session *s = item->state.tflag.s; + struct client *c = cmd_find_client(item, NULL, 1); + struct window_pane *wp = item->target.wp; + struct session *s = item->target.s; struct mouse_event *m = &item->shared->mouse; struct utf8_data *ud, *uc; wchar_t wc; diff --git a/cmd-set-environment.c b/cmd-set-environment.c index b3737e72..a80acd01 100644 --- a/cmd-set-environment.c +++ b/cmd-set-environment.c @@ -37,7 +37,7 @@ const struct cmd_entry cmd_set_environment_entry = { .args = { "grt:u", 1, 2 }, .usage = "[-gru] " CMD_TARGET_SESSION_USAGE " name [value]", - .tflag = CMD_SESSION_CANFAIL, + .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_set_environment_exec @@ -68,7 +68,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmdq_item *item) if (args_has(self->args, 'g')) env = global_environ; else { - if (item->state.tflag.s == NULL) { + if (item->target.s == NULL) { target = args_get(args, 't'); if (target != NULL) cmdq_error(item, "no such session: %s", target); @@ -76,7 +76,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no current session"); return (CMD_RETURN_ERROR); } - env = item->state.tflag.s->environ; + env = item->target.s->environ; } if (args_has(self->args, 'u')) { diff --git a/cmd-set-hook.c b/cmd-set-hook.c index fff7ccd7..d0cd98db 100644 --- a/cmd-set-hook.c +++ b/cmd-set-hook.c @@ -36,7 +36,7 @@ const struct cmd_entry cmd_set_hook_entry = { .args = { "gt:u", 1, 2 }, .usage = "[-gu] " CMD_TARGET_SESSION_USAGE " hook-name [command]", - .tflag = CMD_SESSION_CANFAIL, + .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_set_hook_exec @@ -49,7 +49,7 @@ const struct cmd_entry cmd_show_hooks_entry = { .args = { "gt:", 0, 1 }, .usage = "[-g] " CMD_TARGET_SESSION_USAGE, - .tflag = CMD_SESSION, + .target = { 't', CMD_FIND_SESSION, 0 }, .flags = CMD_AFTERHOOK, .exec = cmd_set_hook_exec @@ -68,7 +68,7 @@ cmd_set_hook_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'g')) hooks = global_hooks; else { - if (item->state.tflag.s == NULL) { + if (item->target.s == NULL) { target = args_get(args, 't'); if (target != NULL) cmdq_error(item, "no such session: %s", target); @@ -76,7 +76,7 @@ cmd_set_hook_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no current session"); return (CMD_RETURN_ERROR); } - hooks = item->state.tflag.s->hooks; + hooks = item->target.s->hooks; } if (self->entry == &cmd_show_hooks_entry) { diff --git a/cmd-set-option.c b/cmd-set-option.c index d862bb98..b35d60d8 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -45,7 +45,7 @@ const struct cmd_entry cmd_set_option_entry = { .args = { "agoqst:uw", 1, 2 }, .usage = "[-agosquw] [-t target-window] option [value]", - .tflag = CMD_WINDOW_CANFAIL, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_set_option_exec @@ -58,7 +58,7 @@ const struct cmd_entry cmd_set_window_option_entry = { .args = { "agoqt:u", 1, 2 }, .usage = "[-agoqu] " CMD_TARGET_WINDOW_USAGE " option [value]", - .tflag = CMD_WINDOW_CANFAIL, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_set_option_exec @@ -69,7 +69,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; int append = args_has(args, 'a'); - struct cmd_find_state *fs = &item->state.tflag; + struct cmd_find_state *fs = &item->target; struct session *s = fs->s; struct winlink *wl = fs->wl; struct window *w; diff --git a/cmd-show-environment.c b/cmd-show-environment.c index 8b38de2c..eb19cf20 100644 --- a/cmd-show-environment.c +++ b/cmd-show-environment.c @@ -41,7 +41,7 @@ const struct cmd_entry cmd_show_environment_entry = { .args = { "gst:", 0, 1 }, .usage = "[-gs] " CMD_TARGET_SESSION_USAGE " [name]", - .tflag = CMD_SESSION_CANFAIL, + .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_show_environment_exec @@ -97,7 +97,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmdq_item *item) const char *target; if ((target = args_get(args, 't')) != NULL) { - if (item->state.tflag.s == NULL) { + if (item->target.s == NULL) { cmdq_error(item, "no such session: %s", target); return (CMD_RETURN_ERROR); } @@ -106,7 +106,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmdq_item *item) if (args_has(self->args, 'g')) env = global_environ; else { - if (item->state.tflag.s == NULL) { + if (item->target.s == NULL) { target = args_get(args, 't'); if (target != NULL) cmdq_error(item, "no such session: %s", target); @@ -114,7 +114,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "no current session"); return (CMD_RETURN_ERROR); } - env = item->state.tflag.s->environ; + env = item->target.s->environ; } if (args->argc != 0) { diff --git a/cmd-show-messages.c b/cmd-show-messages.c index 559c36df..523ca054 100644 --- a/cmd-show-messages.c +++ b/cmd-show-messages.c @@ -39,8 +39,6 @@ const struct cmd_entry cmd_show_messages_entry = { .args = { "JTt:", 0, 0 }, .usage = "[-JT] " CMD_TARGET_CLIENT_USAGE, - .tflag = CMD_CLIENT, - .flags = CMD_AFTERHOOK, .exec = cmd_show_messages_exec }; @@ -92,11 +90,14 @@ static enum cmd_retval cmd_show_messages_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct client *c = item->state.c; + struct client *c; struct message_entry *msg; char *tim; int done, blank; + if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) + return (CMD_RETURN_ERROR); + done = blank = 0; if (args_has(args, 'T')) { blank = cmd_show_messages_terminals(item, blank); diff --git a/cmd-show-options.c b/cmd-show-options.c index 0ce438df..a0889c3a 100644 --- a/cmd-show-options.c +++ b/cmd-show-options.c @@ -42,7 +42,7 @@ const struct cmd_entry cmd_show_options_entry = { .args = { "gqst:vw", 0, 1 }, .usage = "[-gqsvw] [-t target-session|target-window] [option]", - .tflag = CMD_WINDOW_CANFAIL, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_show_options_exec @@ -55,7 +55,7 @@ const struct cmd_entry cmd_show_window_options_entry = { .args = { "gvt:", 0, 1 }, .usage = "[-gv] " CMD_TARGET_WINDOW_USAGE " [option]", - .tflag = CMD_WINDOW_CANFAIL, + .target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL }, .flags = CMD_AFTERHOOK, .exec = cmd_show_options_exec @@ -65,7 +65,7 @@ static enum cmd_retval cmd_show_options_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; - struct cmd_find_state *fs = &item->state.tflag; + struct cmd_find_state *fs = &item->target; struct options *oo; enum options_table_scope scope; char *cause; diff --git a/cmd-split-window.c b/cmd-split-window.c index 57513e3f..7de16ac2 100644 --- a/cmd-split-window.c +++ b/cmd-split-window.c @@ -44,7 +44,7 @@ const struct cmd_entry cmd_split_window_entry = { .usage = "[-bdfhvP] [-c start-directory] [-F format] " "[-p percentage|-l size] " CMD_TARGET_PANE_USAGE " [command]", - .tflag = CMD_PANE, + .target = { 't', CMD_FIND_PANE, 0 }, .flags = 0, .exec = cmd_split_window_exec @@ -55,11 +55,11 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) { struct cmd_find_state *current = &item->shared->current; struct args *args = self->args; - struct client *c = item->state.c; - struct session *s = item->state.tflag.s; - struct winlink *wl = item->state.tflag.wl; + struct client *c = cmd_find_client(item, NULL, 1); + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; struct window *w = wl->window; - struct window_pane *wp = item->state.tflag.wp, *new_wp = NULL; + struct windo