summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2015-12-13 14:32:39 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2015-12-13 14:32:39 +0000
commite09bfc7e556d93074ecd379a6bdc8ed7cbd9c6e7 (patch)
tree04f4e480d5b9117f467347f4ac004f9bbaf482ed /usr.bin
parentb90210d68df99c50cef8daba1b4ff0056355fd61 (diff)
Instead of every command resolving the target (-t or -s) itself, prepare
the state (client, session, winlink, pane) for it it before entering the command. Each command provides some flags that tell the prepare step what it is expecting. This is a requirement for having hooks on commands (for example, if you hook "select-window -t1:2", the hook command should to operate on window 1:2 not whatever it thinks is the current window), and should allow some other target improvements. The old cmd_find_* functions remain for the moment but that layer will be dropped later. Joint work with Thomas Adam.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-attach-session.c45
-rw-r--r--usr.bin/tmux/cmd-break-pane.c25
-rw-r--r--usr.bin/tmux/cmd-capture-pane.c9
-rw-r--r--usr.bin/tmux/cmd-choose-buffer.c13
-rw-r--r--usr.bin/tmux/cmd-choose-client.c13
-rw-r--r--usr.bin/tmux/cmd-choose-tree.c19
-rw-r--r--usr.bin/tmux/cmd-clear-history.c13
-rw-r--r--usr.bin/tmux/cmd-command-prompt.c9
-rw-r--r--usr.bin/tmux/cmd-confirm-before.c9
-rw-r--r--usr.bin/tmux/cmd-copy-mode.c11
-rw-r--r--usr.bin/tmux/cmd-detach-client.c21
-rw-r--r--usr.bin/tmux/cmd-display-message.c34
-rw-r--r--usr.bin/tmux/cmd-display-panes.c14
-rw-r--r--usr.bin/tmux/cmd-find-window.c16
-rw-r--r--usr.bin/tmux/cmd-if-shell.c35
-rw-r--r--usr.bin/tmux/cmd-join-pane.c17
-rw-r--r--usr.bin/tmux/cmd-kill-pane.c11
-rw-r--r--usr.bin/tmux/cmd-kill-session.c7
-rw-r--r--usr.bin/tmux/cmd-kill-window.c18
-rw-r--r--usr.bin/tmux/cmd-list-clients.c12
-rw-r--r--usr.bin/tmux/cmd-list-panes.c19
-rw-r--r--usr.bin/tmux/cmd-list-windows.c13
-rw-r--r--usr.bin/tmux/cmd-load-buffer.c4
-rw-r--r--usr.bin/tmux/cmd-lock-server.c26
-rw-r--r--usr.bin/tmux/cmd-move-window.c32
-rw-r--r--usr.bin/tmux/cmd-new-session.c47
-rw-r--r--usr.bin/tmux/cmd-new-window.c30
-rw-r--r--usr.bin/tmux/cmd-paste-buffer.c10
-rw-r--r--usr.bin/tmux/cmd-pipe-pane.c16
-rw-r--r--usr.bin/tmux/cmd-queue.c27
-rw-r--r--usr.bin/tmux/cmd-refresh-client.c9
-rw-r--r--usr.bin/tmux/cmd-rename-session.c9
-rw-r--r--usr.bin/tmux/cmd-rename-window.c10
-rw-r--r--usr.bin/tmux/cmd-resize-pane.c18
-rw-r--r--usr.bin/tmux/cmd-respawn-pane.c16
-rw-r--r--usr.bin/tmux/cmd-respawn-window.c18
-rw-r--r--usr.bin/tmux/cmd-rotate-window.c13
-rw-r--r--usr.bin/tmux/cmd-run-shell.c35
-rw-r--r--usr.bin/tmux/cmd-save-buffer.c4
-rw-r--r--usr.bin/tmux/cmd-select-layout.c13
-rw-r--r--usr.bin/tmux/cmd-select-pane.c26
-rw-r--r--usr.bin/tmux/cmd-select-window.c23
-rw-r--r--usr.bin/tmux/cmd-send-keys.c15
-rw-r--r--usr.bin/tmux/cmd-set-environment.c12
-rw-r--r--usr.bin/tmux/cmd-set-hook.c15
-rw-r--r--usr.bin/tmux/cmd-set-option.c34
-rw-r--r--usr.bin/tmux/cmd-show-environment.c13
-rw-r--r--usr.bin/tmux/cmd-show-messages.c9
-rw-r--r--usr.bin/tmux/cmd-show-options.c30
-rw-r--r--usr.bin/tmux/cmd-source-file.c5
-rw-r--r--usr.bin/tmux/cmd-split-window.c21
-rw-r--r--usr.bin/tmux/cmd-swap-pane.c26
-rw-r--r--usr.bin/tmux/cmd-swap-window.c23
-rw-r--r--usr.bin/tmux/cmd-switch-client.c46
-rw-r--r--usr.bin/tmux/cmd.c253
-rw-r--r--usr.bin/tmux/tmux.h44
56 files changed, 661 insertions, 654 deletions
diff --git a/usr.bin/tmux/cmd-attach-session.c b/usr.bin/tmux/cmd-attach-session.c
index 95fd910df2d..fb9664e77a2 100644
--- a/usr.bin/tmux/cmd-attach-session.c
+++ b/usr.bin/tmux/cmd-attach-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-attach-session.c,v 1.54 2015/12/12 18:32:24 nicm Exp $ */
+/* $OpenBSD: cmd-attach-session.c,v 1.55 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -36,48 +36,27 @@ const struct cmd_entry cmd_attach_session_entry = {
"attach-session", "attach",
"c:dErt:", 0, 0,
"[-dEr] [-c working-directory] " CMD_TARGET_SESSION_USAGE,
- CMD_STARTSERVER,
+ CMD_STARTSERVER|CMD_SESSION_T|CMD_PANE_T|CMD_PREFERUNATTACHED,
cmd_attach_session_exec
};
enum cmd_retval
-cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
- const char *cflag, int Eflag)
+cmd_attach_session(struct cmd_q *cmdq, int dflag, int rflag, const char *cflag,
+ int Eflag)
{
- struct session *s;
+ struct session *s = cmdq->state.tflag.s;
struct client *c = cmdq->client, *c_loop;
- struct winlink *wl = NULL;
- struct window *w = NULL;
- struct window_pane *wp = NULL;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window_pane *wp = cmdq->state.tflag.wp;
const char *update;
- char *cause;
+ char *cause, *cwd;
struct format_tree *ft;
- char *cwd;
if (RB_EMPTY(&sessions)) {
cmdq_error(cmdq, "no sessions");
return (CMD_RETURN_ERROR);
}
- if (tflag == NULL) {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- } else if (tflag[strcspn(tflag, ":.")] != '\0') {
- if ((wl = cmd_find_pane(cmdq, tflag, &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- } else {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- w = window_find_by_id_str(tflag);
- if (w == NULL) {
- wp = window_pane_find_by_id_str(tflag);
- if (wp != NULL)
- w = wp->window;
- }
- if (w != NULL)
- wl = winlink_find_by_window(&s->windows, w);
- }
-
if (c == NULL)
return (CMD_RETURN_NORMAL);
if (server_client_check_nested(c)) {
@@ -94,8 +73,7 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
if (cflag != NULL) {
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s,
- NULL, NULL);
+ format_defaults(ft, c, s, wl, wp);
cwd = format_expand(ft, cflag);
format_free(ft);
@@ -176,7 +154,6 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- return (cmd_attach_session(cmdq, args_get(args, 't'),
- args_has(args, 'd'), args_has(args, 'r'), args_get(args, 'c'),
- args_has(args, 'E')));
+ return (cmd_attach_session(cmdq, args_has(args, 'd'),
+ args_has(args, 'r'), args_get(args, 'c'), args_has(args, 'E')));
}
diff --git a/usr.bin/tmux/cmd-break-pane.c b/usr.bin/tmux/cmd-break-pane.c
index 1e3dc2f2b9a..a6950ef88ce 100644
--- a/usr.bin/tmux/cmd-break-pane.c
+++ b/usr.bin/tmux/cmd-break-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-break-pane.c,v 1.32 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-break-pane.c,v 1.33 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -34,7 +34,7 @@ const struct cmd_entry cmd_break_pane_entry = {
"break-pane", "breakp",
"dPF:s:t:", 0, 0,
"[-dP] [-F format] " CMD_SRCDST_PANE_USAGE,
- 0,
+ CMD_PANE_S|CMD_INDEX_T,
cmd_break_pane_exec
};
@@ -42,28 +42,22 @@ enum cmd_retval
cmd_break_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl;
- struct session *src_s;
- struct session *dst_s;
- struct window_pane *wp;
- struct window *w;
+ struct winlink *wl = cmdq->state.sflag.wl;
+ struct session *src_s = cmdq->state.sflag.s;
+ struct session *dst_s = cmdq->state.tflag.s;
+ struct window_pane *wp = cmdq->state.sflag.wp;
+ struct window *w = wl->window;
char *name;
char *cause;
- int idx;
+ int idx = cmdq->state.tflag.idx;
struct format_tree *ft;
const char *template;
char *cp;
- wl = cmd_find_pane(cmdq, args_get(args, 's'), &src_s, &wp);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
- if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &dst_s)) == -2)
- return (CMD_RETURN_ERROR);
if (idx != -1 && winlink_find_by_index(&dst_s->windows, idx) != NULL) {
cmdq_error(cmdq, "index %d already in use", idx);
return (CMD_RETURN_ERROR);
}
- w = wl->window;
if (window_count_panes(w) == 1) {
cmdq_error(cmdq, "can't break with only one pane");
@@ -102,8 +96,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmd_q *cmdq)
template = BREAK_PANE_TEMPLATE;
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), dst_s, wl,
- wp);
+ format_defaults(ft, cmdq->state.c, dst_s, wl, wp);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
diff --git a/usr.bin/tmux/cmd-capture-pane.c b/usr.bin/tmux/cmd-capture-pane.c
index 808c93db060..c61007614cb 100644
--- a/usr.bin/tmux/cmd-capture-pane.c
+++ b/usr.bin/tmux/cmd-capture-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-capture-pane.c,v 1.35 2015/11/14 09:41:06 nicm Exp $ */
+/* $OpenBSD: cmd-capture-pane.c,v 1.36 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Jonathan Alvarado <radobobo@users.sourceforge.net>
@@ -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,
- 0,
+ CMD_PANE_T,
cmd_capture_pane_exec
};
@@ -175,14 +175,11 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct client *c;
- struct window_pane *wp;
+ struct window_pane *wp = cmdq->state.tflag.wp;
char *buf, *cause;
const char *bufname;
size_t len;
- if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
- return (CMD_RETURN_ERROR);
-
len = 0;
if (args_has(args, 'P'))
buf = cmd_capture_pane_pending(args, wp, &len);
diff --git a/usr.bin/tmux/cmd-choose-buffer.c b/usr.bin/tmux/cmd-choose-buffer.c
index 64e74dc394d..3b59deaf4fe 100644
--- a/usr.bin/tmux/cmd-choose-buffer.c
+++ b/usr.bin/tmux/cmd-choose-buffer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-choose-buffer.c,v 1.25 2015/11/12 11:09:11 nicm Exp $ */
+/* $OpenBSD: cmd-choose-buffer.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2010 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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]",
- 0,
+ CMD_WINDOW_T,
cmd_choose_buffer_exec
};
@@ -44,15 +44,15 @@ enum cmd_retval
cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
+ struct client *c = cmdq->state.c;
+ struct winlink *wl = cmdq->state.tflag.wl;
struct window_choose_data *cdata;
- struct winlink *wl;
struct paste_buffer *pb;
char *action, *action_data;
const char *template;
u_int idx;
- if ((c = cmd_find_client(cmdq, NULL, 1)) == NULL) {
+ if (c == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
@@ -60,9 +60,6 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
if ((template = args_get(args, 'F')) == NULL)
template = CHOOSE_BUFFER_TEMPLATE;
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
- return (CMD_RETURN_ERROR);
-
if (paste_get_top(NULL) == NULL)
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-choose-client.c b/usr.bin/tmux/cmd-choose-client.c
index b184b50f177..3906ff14a03 100644
--- a/usr.bin/tmux/cmd-choose-client.c
+++ b/usr.bin/tmux/cmd-choose-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-choose-client.c,v 1.25 2015/10/25 22:29:17 nicm Exp $ */
+/* $OpenBSD: cmd-choose-client.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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]",
- 0,
+ CMD_WINDOW_T,
cmd_choose_client_exec
};
@@ -53,22 +53,19 @@ enum cmd_retval
cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
+ struct client *c = cmdq->state.c;
struct client *c1;
struct window_choose_data *cdata;
- struct winlink *wl;
+ struct winlink *wl = cmdq->state.tflag.wl;
const char *template;
char *action;
u_int idx, cur;
- if ((c = cmd_find_client(cmdq, NULL, 1)) == NULL) {
+ if (c == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
- 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)
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-choose-tree.c b/usr.bin/tmux/cmd-choose-tree.c
index fee7ea20680..dd98aa2557c 100644
--- a/usr.bin/tmux/cmd-choose-tree.c
+++ b/usr.bin/tmux/cmd-choose-tree.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-choose-tree.c,v 1.28 2015/04/27 16:25:57 nicm Exp $ */
+/* $OpenBSD: cmd-choose-tree.c,v 1.29 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2012 Thomas Adam <thomas@xteddy.org>
@@ -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,
- 0,
+ CMD_WINDOW_T,
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]",
- 0,
+ CMD_WINDOW_T,
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]",
- 0,
+ CMD_WINDOW_T,
cmd_choose_tree_exec
};
@@ -72,9 +72,9 @@ enum cmd_retval
cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl, *wm;
- struct session *s, *s2;
- struct client *c;
+ struct client *c = cmdq->state.c;
+ struct winlink *wl = cmdq->state.tflag.wl, *wm;
+ struct session *s = cmdq->state.tflag.s, *s2;
struct window_choose_data *wcd = NULL;
const char *ses_template, *win_template;
char *final_win_action, *cur_win_template;
@@ -87,14 +87,11 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
ses_template = win_template = NULL;
ses_action = win_action = NULL;
- if ((c = cmd_find_client(cmdq, NULL, 1)) == NULL) {
+ if (c == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
- 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)
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-clear-history.c b/usr.bin/tmux/cmd-clear-history.c
index 78629181dab..6f993f671df 100644
--- a/usr.bin/tmux/cmd-clear-history.c
+++ b/usr.bin/tmux/cmd-clear-history.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-clear-history.c,v 1.14 2015/09/25 15:53:07 nicm Exp $ */
+/* $OpenBSD: cmd-clear-history.c,v 1.15 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,20 +30,17 @@ const struct cmd_entry cmd_clear_history_entry = {
"clear-history", "clearhist",
"t:", 0, 0,
CMD_TARGET_PANE_USAGE,
- 0,
+ CMD_PANE_T,
cmd_clear_history_exec
};
enum cmd_retval
-cmd_clear_history_exec(struct cmd *self, struct cmd_q *cmdq)
+cmd_clear_history_exec(__unused struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct window_pane *wp;
+ struct window_pane *wp = cmdq->state.tflag.wp;
struct grid *gd;
- if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
- return (CMD_RETURN_ERROR);
- gd = wp->base.grid;
+ gd = cmdq->state.tflag.wp->base.grid;
if (wp->mode == &window_copy_mode)
window_pane_reset_mode(wp);
diff --git a/usr.bin/tmux/cmd-command-prompt.c b/usr.bin/tmux/cmd-command-prompt.c
index 71b0eba53d4..f522e3acaac 100644
--- a/usr.bin/tmux/cmd-command-prompt.c
+++ b/usr.bin/tmux/cmd-command-prompt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-command-prompt.c,v 1.29 2015/04/19 21:34:21 nicm Exp $ */
+/* $OpenBSD: cmd-command-prompt.c,v 1.30 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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]",
- 0,
+ CMD_CLIENT_T,
cmd_command_prompt_exec
};
@@ -58,13 +58,10 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
struct args *args = self->args;
const char *inputs, *prompts;
struct cmd_command_prompt_cdata *cdata;
- struct client *c;
+ struct client *c = cmdq->state.c;
char *prompt, *ptr, *input = NULL;
size_t n;
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
if (c->prompt_string != NULL)
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-confirm-before.c b/usr.bin/tmux/cmd-confirm-before.c
index 15efc966bdf..edec72a236b 100644
--- a/usr.bin/tmux/cmd-confirm-before.c
+++ b/usr.bin/tmux/cmd-confirm-before.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-confirm-before.c,v 1.25 2015/06/05 18:06:30 nicm Exp $ */
+/* $OpenBSD: cmd-confirm-before.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -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",
- 0,
+ CMD_CLIENT_T,
cmd_confirm_before_exec
};
@@ -51,13 +51,10 @@ cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct cmd_confirm_before_data *cdata;
- struct client *c;
+ struct client *c = cmdq->state.c;
char *cmd, *copy, *new_prompt, *ptr;
const char *prompt;
- if ((c = cmd_find_client(cmdq, 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/usr.bin/tmux/cmd-copy-mode.c b/usr.bin/tmux/cmd-copy-mode.c
index 08889f2999e..4d706cbd3b4 100644
--- a/usr.bin/tmux/cmd-copy-mode.c
+++ b/usr.bin/tmux/cmd-copy-mode.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-copy-mode.c,v 1.21 2015/09/13 13:31:40 nicm Exp $ */
+/* $OpenBSD: cmd-copy-mode.c,v 1.22 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -29,8 +29,8 @@ enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_copy_mode_entry = {
"copy-mode", NULL,
"Met:u", 0, 0,
- "[-Meu] " CMD_TARGET_PANE_USAGE,
- 0,
+ "[-Mu] " CMD_TARGET_PANE_USAGE,
+ CMD_PANE_T,
cmd_copy_mode_exec
};
@@ -48,15 +48,14 @@ cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
struct args *args = self->args;
struct client *c = cmdq->client;
struct session *s;
- struct window_pane *wp;
+ struct window_pane *wp = cmdq->state.tflag.wp;
if (args_has(args, 'M')) {
if ((wp = cmd_mouse_pane(&cmdq->item->mouse, &s, NULL)) == NULL)
return (CMD_RETURN_NORMAL);
if (c == NULL || c->session != s)
return (CMD_RETURN_NORMAL);
- } else if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
- return (CMD_RETURN_ERROR);
+ }
if (self->entry == &cmd_clock_mode_entry) {
window_pane_set_mode(wp, &window_clock_mode);
diff --git a/usr.bin/tmux/cmd-detach-client.c b/usr.bin/tmux/cmd-detach-client.c
index 23694816a9a..0bf5562117b 100644
--- a/usr.bin/tmux/cmd-detach-client.c
+++ b/usr.bin/tmux/cmd-detach-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-detach-client.c,v 1.23 2015/12/08 01:10:31 nicm Exp $ */
+/* $OpenBSD: cmd-detach-client.c,v 1.24 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -31,8 +31,8 @@ enum cmd_retval cmd_detach_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_detach_client_entry = {
"detach-client", "detach",
"as:t:P", 0, 0,
- "[-aP] [-s target-session] " CMD_TARGET_CLIENT_USAGE,
- CMD_READONLY,
+ "[-P] [-a] [-s target-session] " CMD_TARGET_CLIENT_USAGE,
+ CMD_READONLY|CMD_CLIENT_T|CMD_SESSION_S,
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,
- 0,
+ CMD_CLIENT_T,
cmd_detach_client_exec
};
@@ -48,13 +48,11 @@ enum cmd_retval
cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c, *cloop;
+ struct client *c = cmdq->state.c, *cloop;
struct session *s;
enum msgtype msgtype;
if (self->entry == &cmd_suspend_client_entry) {
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
tty_stop_tty(&c->tty);
c->flags |= CLIENT_SUSPENDED;
proc_send(c->peer, MSG_SUSPEND, -1, NULL, 0);
@@ -67,10 +65,7 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
msgtype = MSG_DETACH;
if (args_has(args, 's')) {
- s = cmd_find_session(cmdq, args_get(args, 's'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
-
+ s = cmdq->state.sflag.s;
TAILQ_FOREACH(cloop, &clients, entry) {
if (cloop->session == s)
server_client_detach(cloop, msgtype);
@@ -78,10 +73,6 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_STOP);
}
- c = cmd_find_client(cmdq, args_get(args, 't'), 0);
- if (c == NULL)
- return (CMD_RETURN_ERROR);
-
if (args_has(args, 'a')) {
TAILQ_FOREACH(cloop, &clients, entry) {
if (cloop->session != NULL && cloop != c)
diff --git a/usr.bin/tmux/cmd-display-message.c b/usr.bin/tmux/cmd-display-message.c
index a5858249a07..33009da7ded 100644
--- a/usr.bin/tmux/cmd-display-message.c
+++ b/usr.bin/tmux/cmd-display-message.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-display-message.c,v 1.31 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-display-message.c,v 1.32 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -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]",
- 0,
+ CMD_CLIENT_C|CMD_PANE_T,
cmd_display_message_exec
};
@@ -47,41 +47,19 @@ enum cmd_retval
cmd_display_message_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
- struct session *s;
- struct winlink *wl;
- struct window_pane *wp;
+ struct client *c = cmdq->state.c;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window_pane *wp = cmdq->state.tflag.wp;
const char *template;
char *msg;
struct format_tree *ft;
- 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");
return (CMD_RETURN_ERROR);
}
- if (args_has(args, 'c')) {
- c = cmd_find_client(cmdq, args_get(args, 'c'), 0);
- if (c == NULL)
- return (CMD_RETURN_ERROR);
- } else {
- c = cmd_find_client(cmdq, NULL, 1);
- if (c == NULL && !args_has(self->args, 'p')) {
- cmdq_error(cmdq, "no client available");
- return (CMD_RETURN_ERROR);
- }
- }
-
template = args_get(args, 'F');
if (args->argc != 0)
template = args->argv[0];
diff --git a/usr.bin/tmux/cmd-display-panes.c b/usr.bin/tmux/cmd-display-panes.c
index 59ccab77b77..7f50377a9cf 100644
--- a/usr.bin/tmux/cmd-display-panes.c
+++ b/usr.bin/tmux/cmd-display-panes.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-display-panes.c,v 1.8 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-display-panes.c,v 1.9 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,20 +30,14 @@ const struct cmd_entry cmd_display_panes_entry = {
"display-panes", "displayp",
"t:", 0, 0,
CMD_TARGET_CLIENT_USAGE,
- 0,
+ CMD_CLIENT_T,
cmd_display_panes_exec
};
enum cmd_retval
-cmd_display_panes_exec(struct cmd *self, struct cmd_q *cmdq)
+cmd_display_panes_exec(__unused struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct client *c;
-
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
- server_set_identify(c);
+ server_set_identify(cmdq->state.c);
return (CMD_RETURN_NORMAL);
}
diff --git a/usr.bin/tmux/cmd-find-window.c b/usr.bin/tmux/cmd-find-window.c
index c00183fb699..bbcc76812d0 100644
--- a/usr.bin/tmux/cmd-find-window.c
+++ b/usr.bin/tmux/cmd-find-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-find-window.c,v 1.33 2015/05/07 07:59:52 nicm Exp $ */
+/* $OpenBSD: cmd-find-window.c,v 1.34 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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",
- 0,
+ CMD_WINDOW_T,
cmd_find_window_exec
};
@@ -137,10 +137,10 @@ enum cmd_retval
cmd_find_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
+ struct client *c = cmdq->state.c;
struct window_choose_data *cdata;
- struct session *s;
- struct winlink *wl, *wm;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl, *wm;
struct cmd_find_window_list find_list;
struct cmd_find_window_data *find_data;
struct cmd_find_window_data *find_data1;
@@ -148,14 +148,10 @@ cmd_find_window_exec(struct cmd *self, struct cmd_q *cmdq)
const char *template;
u_int i, match_flags;
- if ((c = cmd_find_client(cmdq, NULL, 1)) == NULL) {
+ if (c == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
- s = c->session;
-
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
- return (CMD_RETURN_ERROR);
if ((template = args_get(args, 'F')) == NULL)
template = FIND_WINDOW_TEMPLATE;
diff --git a/usr.bin/tmux/cmd-if-shell.c b/usr.bin/tmux/cmd-if-shell.c
index 78d3909cb32..b821fe0204c 100644
--- a/usr.bin/tmux/cmd-if-shell.c
+++ b/usr.bin/tmux/cmd-if-shell.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-if-shell.c,v 1.37 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-if-shell.c,v 1.38 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -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]",
- 0,
+ CMD_PANE_T|CMD_CANFAIL,
cmd_if_shell_exec
};
@@ -61,31 +61,20 @@ cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
struct cmd_if_shell_data *cdata;
char *shellcmd, *cmd, *cause;
struct cmd_list *cmdlist;
- struct client *c;
- struct session *s = NULL;
- struct winlink *wl = NULL;
- struct window_pane *wp = NULL;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window_pane *wp = cmdq->state.tflag.wp;
struct format_tree *ft;
const char *cwd;
- if (args_has(args, 't')) {
- wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
- cwd = wp->cwd;
- } else {
- c = cmd_find_client(cmdq, NULL, 1);
- if (c != NULL && c->session != NULL) {
- s = c->session;
- wl = s->curw;
- wp = wl->window->active;
- }
- if (cmdq->client != NULL && cmdq->client->session == NULL)
- cwd = cmdq->client->cwd;
- else if (s != NULL)
- cwd = s->cwd;
- else
- cwd = NULL;
- }
+ cwd = wp->cwd;
+ if (cmdq->client != NULL && cmdq->client->session == NULL)
+ cwd = cmdq->client->cwd;
+ else if (s != NULL)
+ cwd = s->cwd;
+ else
+ cwd = NULL;
ft = format_create(cmdq, 0);
format_defaults(ft, NULL, s, wl, wp);
shellcmd = format_expand(ft, args->argv[0]);
diff --git a/usr.bin/tmux/cmd-join-pane.c b/usr.bin/tmux/cmd-join-pane.c
index b1e8ad017d0..b5143738bbc 100644
--- a/usr.bin/tmux/cmd-join-pane.c
+++ b/usr.bin/tmux/cmd-join-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-join-pane.c,v 1.19 2015/06/18 23:56:01 nicm Exp $ */
+/* $OpenBSD: cmd-join-pane.c,v 1.20 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2011 George Nachman <tmux@georgester.com>
@@ -37,7 +37,7 @@ const struct cmd_entry cmd_join_pane_entry = {
"join-pane", "joinp",
"bdhvp:l:s:t:", 0, 0,
"[-bdhv] [-p percentage|-l size] " CMD_SRCDST_PANE_USAGE,
- 0,
+ CMD_PANE_MARKED_S|CMD_PANE_T,
cmd_join_pane_exec
};
@@ -45,7 +45,7 @@ const struct cmd_entry cmd_move_pane_entry = {
"move-pane", "movep",
"bdhvp:l:s:t:", 0, 0,
"[-bdhv] [-p percentage|-l size] " CMD_SRCDST_PANE_USAGE,
- 0,
+ CMD_PANE_S|CMD_PANE_T,
cmd_join_pane_exec
};
@@ -68,16 +68,15 @@ join_pane(struct cmd *self, struct cmd_q *cmdq, int not_same_window)
enum layout_type type;
struct layout_cell *lc;
- 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.tflag.s;
+ dst_wl = cmdq->state.tflag.wl;
+ dst_wp = cmdq->state.tflag.wp;
dst_w = dst_wl->window;
dst_idx = dst_wl->idx;
server_unzoom_window(dst_w);
- src_wl = cmd_find_pane_marked(cmdq, args_get(args, 's'), NULL, &src_wp);
- if (src_wl == NULL)
- return (CMD_RETURN_ERROR);
+ src_wl = cmdq->state.sflag.wl;
+ src_wp = cmdq->state.sflag.wp;
src_w = src_wl->window;
server_unzoom_window(src_w);
diff --git a/usr.bin/tmux/cmd-kill-pane.c b/usr.bin/tmux/cmd-kill-pane.c
index 951095afc71..3d0d721cfce 100644
--- a/usr.bin/tmux/cmd-kill-pane.c
+++ b/usr.bin/tmux/cmd-kill-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-kill-pane.c,v 1.16 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-kill-pane.c,v 1.17 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,19 +32,16 @@ const struct cmd_entry cmd_kill_pane_entry = {
"kill-pane", "killp",
"at:", 0, 0,
"[-a] " CMD_TARGET_PANE_USAGE,
- 0,
+ CMD_PANE_T,
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;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window_pane *loopwp, *tmpwp, *wp = cmdq->state.tflag.wp;
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
server_unzoom_window(wl->window);
if (window_count_panes(wl->window) == 1) {
diff --git a/usr.bin/tmux/cmd-kill-session.c b/usr.bin/tmux/cmd-kill-session.c
index dce0c609d7d..9178cff4738 100644
--- a/usr.bin/tmux/cmd-kill-session.c
+++ b/usr.bin/tmux/cmd-kill-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-kill-session.c,v 1.16 2015/11/24 21:50:06 nicm Exp $ */
+/* $OpenBSD: cmd-kill-session.c,v 1.17 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_kill_session_entry = {
"kill-session", NULL,
"aCt:", 0, 0,
"[-aC] " CMD_TARGET_SESSION_USAGE,
- 0,
+ CMD_SESSION_T,
cmd_kill_session_exec
};
@@ -44,8 +44,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmd_q *cmdq)
struct session *s, *sloop, *stmp;
struct winlink *wl;
- if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
+ s = cmdq->state.tflag.s;
if (args_has(args, 'C')) {
RB_FOREACH(wl, winlinks, &s->windows) {
diff --git a/usr.bin/tmux/cmd-kill-window.c b/usr.bin/tmux/cmd-kill-window.c
index 499929c0744..a70cbd17180 100644
--- a/usr.bin/tmux/cmd-kill-window.c
+++ b/usr.bin/tmux/cmd-kill-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-kill-window.c,v 1.17 2015/05/06 08:35:39 nicm Exp $ */
+/* $OpenBSD: cmd-kill-window.c,v 1.18 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_kill_window_entry = {
"kill-window", "killw",
"at:", 0, 0,
"[-a] " CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
cmd_kill_window_exec
};
@@ -38,21 +38,17 @@ const struct cmd_entry cmd_unlink_window_entry = {
"unlink-window", "unlinkw",
"kt:", 0, 0,
"[-k] " CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
cmd_kill_window_exec
};
enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct winlink *wl, *wl2, *wl3;
- struct window *w;
- struct session *s;
-
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
+ struct args *args = self->args;
+ struct winlink *wl = cmdq->state.tflag.wl, *wl2, *wl3;
+ struct window *w = wl->window;
+ struct session *s = cmdq->state.tflag.s;
if (self->entry == &cmd_unlink_window_entry) {
if (!args_has(self->args, 'k') && !session_is_linked(s, w)) {
diff --git a/usr.bin/tmux/cmd-list-clients.c b/usr.bin/tmux/cmd-list-clients.c
index e3daa80a6e9..150a241f703 100644
--- a/usr.bin/tmux/cmd-list-clients.c
+++ b/usr.bin/tmux/cmd-list-clients.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-list-clients.c,v 1.23 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-list-clients.c,v 1.24 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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_READONLY|CMD_SESSION_T,
cmd_list_clients_exec
};
@@ -54,11 +54,9 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
u_int idx;
char *line;
- if (args_has(args, 't')) {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
- } else
+ if (args_has(args, 't'))
+ s = cmdq->state.tflag.s;
+ else
s = NULL;
if ((template = args_get(args, 'F')) == NULL)
diff --git a/usr.bin/tmux/cmd-list-panes.c b/usr.bin/tmux/cmd-list-panes.c
index df04d9c90c5..68ee2e02f5d 100644
--- a/usr.bin/tmux/cmd-list-panes.c
+++ b/usr.bin/tmux/cmd-list-panes.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-list-panes.c,v 1.23 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-list-panes.c,v 1.24 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_list_panes_entry = {
"list-panes", "lsp",
"asF:t:", 0, 0,
"[-as] [-F format] " CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
cmd_list_panes_exec
};
@@ -46,22 +46,15 @@ enum cmd_retval
cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
- struct winlink *wl;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
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);
+ else if (args_has(args, 's'))
cmd_list_panes_session(self, s, cmdq, 1);
- } else {
- wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
+ else
cmd_list_panes_window(self, s, wl, cmdq, 0);
- }
return (CMD_RETURN_NORMAL);
}
diff --git a/usr.bin/tmux/cmd-list-windows.c b/usr.bin/tmux/cmd-list-windows.c
index c051e3e9b35..47964dc7e38 100644
--- a/usr.bin/tmux/cmd-list-windows.c
+++ b/usr.bin/tmux/cmd-list-windows.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-list-windows.c,v 1.33 2015/12/11 16:37:21 nicm Exp $ */
+/* $OpenBSD: cmd-list-windows.c,v 1.34 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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,
- 0,
+ CMD_SESSION_T,
cmd_list_windows_exec
};
@@ -57,16 +57,11 @@ enum cmd_retval
cmd_list_windows_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
if (args_has(args, 'a'))
cmd_list_windows_server(self, cmdq);
- else {
- 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);
- }
+ else
+ cmd_list_windows_session(self, cmdq->state.tflag.s, cmdq, 0);
return (CMD_RETURN_NORMAL);
}
diff --git a/usr.bin/tmux/cmd-load-buffer.c b/usr.bin/tmux/cmd-load-buffer.c
index 4b26c338274..5bcd41889e7 100644
--- a/usr.bin/tmux/cmd-load-buffer.c
+++ b/usr.bin/tmux/cmd-load-buffer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-load-buffer.c,v 1.39 2015/11/14 09:41:06 nicm Exp $ */
+/* $OpenBSD: cmd-load-buffer.c,v 1.40 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -72,7 +72,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
if (c != NULL && c->session == NULL)
cwd = c->cwd;
- else if ((s = cmd_find_current(cmdq)) != NULL)
+ else if ((s = c->session) != NULL)
cwd = s->cwd;
else
cwd = ".";
diff --git a/usr.bin/tmux/cmd-lock-server.c b/usr.bin/tmux/cmd-lock-server.c
index 80d1be968e5..171342ee295 100644
--- a/usr.bin/tmux/cmd-lock-server.c
+++ b/usr.bin/tmux/cmd-lock-server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-lock-server.c,v 1.18 2015/11/18 14:27:44 nicm Exp $ */
+/* $OpenBSD: cmd-lock-server.c,v 1.19 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -38,7 +38,7 @@ const struct cmd_entry cmd_lock_session_entry = {
"lock-session", "locks",
"t:", 0, 0,
CMD_TARGET_SESSION_USAGE,
- 0,
+ CMD_SESSION_T,
cmd_lock_server_exec
};
@@ -46,30 +46,20 @@ const struct cmd_entry cmd_lock_client_entry = {
"lock-client", "lockc",
"t:", 0, 0,
CMD_TARGET_CLIENT_USAGE,
- 0,
+ CMD_CLIENT_T,
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) {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
- server_lock_session(s);
- } else {
- c = cmd_find_client(cmdq, args_get(args, 't'), 0);
- if (c == NULL)
- return (CMD_RETURN_ERROR);
- server_lock_client(c);
- }
+ else if (self->entry == &cmd_lock_session_entry)
+ server_lock_session(cmdq->state.tflag.s);
+ else
+ server_lock_client(cmdq->state.c);
+
recalculate_sizes();
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-move-window.c b/usr.bin/tmux/cmd-move-window.c
index 1bbc79cefed..a12fa3a2b9e 100644
--- a/usr.bin/tmux/cmd-move-window.c
+++ b/usr.bin/tmux/cmd-move-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-move-window.c,v 1.21 2015/10/27 15:58:42 nicm Exp $ */
+/* $OpenBSD: cmd-move-window.c,v 1.22 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_move_window_entry = {
"move-window", "movew",
"adkrs:t:", 0, 0,
"[-dkr] " CMD_SRCDST_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_S|CMD_MOVEW_R|CMD_INDEX_T,
cmd_move_window_exec
};
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_link_window_entry = {
"link-window", "linkw",
"adks:t:", 0, 0,
"[-dk] " CMD_SRCDST_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_S|CMD_INDEX_T,
cmd_move_window_exec
};
@@ -48,36 +48,28 @@ enum cmd_retval
cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *src, *dst, *s;
- struct winlink *wl;
+ struct session *src = cmdq->state.sflag.s;
+ struct session *dst = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.sflag.wl;
char *cause;
- int idx, kflag, dflag, sflag;
+ int idx = cmdq->state.tflag.idx, kflag, dflag, sflag;
- if (args_has(args, 'r')) {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
+ kflag = args_has(self->args, 'k');
+ dflag = args_has(self->args, 'd');
- session_renumber_windows(s);
+ if (args_has(args, 'r')) {
+ session_renumber_windows(dst);
recalculate_sizes();
return (CMD_RETURN_NORMAL);
}
- if ((wl = cmd_find_window(cmdq, args_get(args, 's'), &src)) == NULL)
- return (CMD_RETURN_ERROR);
- if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &dst)) == -2)
- return (CMD_RETURN_ERROR);
-
kflag = args_has(self->args, 'k');
dflag = args_has(self->args, 'd');
sflag = args_has(self->args, 's');
if (args_has(self->args, 'a')) {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
- if ((idx = winlink_shuffle_up(s, s->curw)) == -1)
+ if ((idx = winlink_shuffle_up(dst, dst->curw)) == -1)
return (CMD_RETURN_ERROR);
}
diff --git a/usr.bin/tmux/cmd-new-session.c b/usr.bin/tmux/cmd-new-session.c
index f6d90a92bc0..0db90245333 100644
--- a/usr.bin/tmux/cmd-new-session.c
+++ b/usr.bin/tmux/cmd-new-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-new-session.c,v 1.80 2015/12/12 18:32:24 nicm Exp $ */
+/* $OpenBSD: cmd-new-session.c,v 1.81 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_new_session_entry = {
"[-AdDEP] [-c start-directory] [-F format] [-n window-name] "
"[-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] "
"[-y height] [command]",
- CMD_STARTSERVER,
+ CMD_STARTSERVER|CMD_CANFAIL|CMD_SESSION_T,
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,
- 0,
+ CMD_SESSION_T,
cmd_new_session_exec
};
@@ -57,8 +57,9 @@ enum cmd_retval
cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c = cmdq->client, *c0;
- struct session *s, *groupwith;
+ struct client *c = cmdq->client;
+ struct session *s, *attach_sess;
+ struct session *groupwith = cmdq->state.tflag.s;
struct window *w;
struct environ *env;
struct termios tio, *tiop;
@@ -71,8 +72,10 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
struct environ_entry *envent;
if (self->entry == &cmd_has_session_entry) {
- if (cmd_find_session(cmdq, args_get(args, 't'), 0) == NULL)
- return (CMD_RETURN_ERROR);
+ /*
+ * cmd_prepare() will fail if the session cannot be found,
+ * hence always return success here.
+ */
return (CMD_RETURN_NORMAL);
}
@@ -87,9 +90,16 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
cmdq_error(cmdq, "bad session name: %s", newname);
return (CMD_RETURN_ERROR);
}
- if (session_find(newname) != NULL) {
+ if ((attach_sess = session_find(newname)) != NULL) {
if (args_has(args, 'A')) {
- return (cmd_attach_session(cmdq, newname,
+ /*
+ * This cmdq is now destined for
+ * attach-session. Because attach-session
+ * will have already been prepared, copy this
+ * session into its tflag so it can be used.
+ */
+ cmdq->state.tflag.s = attach_sess;
+ return (cmd_attach_session(cmdq,
args_has(args, 'D'), 0, NULL,
args_has(args, 'E')));
}
@@ -98,12 +108,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
}
}
- target = args_get(args, 't');
- if (target != NULL) {
- groupwith = cmd_find_session(cmdq, target, 0);
- if (groupwith == NULL)
- return (CMD_RETURN_ERROR);
- } else
+ if ((target = args_get(args, 't')) == NULL)
groupwith = NULL;
/* Set -d if no client. */
@@ -120,14 +125,11 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
to_free = NULL;
if (args_has(args, 'c')) {
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), NULL, NULL,
- NULL);
+ format_defaults(ft, c, NULL, NULL, NULL);
to_free = cwd = format_expand(ft, args_get(args, 'c'));
format_free(ft);
} else if (c != NULL && c->session == NULL)
cwd = c->cwd;
- else if ((c0 = cmd_find_client(cmdq, NULL, 1)) != NULL)
- cwd = c0->session->cwd;
else
cwd = ".";
@@ -193,7 +195,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
/* Figure out the command for the new window. */
argc = -1;
argv = NULL;
- if (target == NULL && args->argc != 0) {
+ if (!args_has(args, 't') && args->argc != 0) {
argc = args->argc;
argv = args->argv;
} else if (target == NULL) {
@@ -245,7 +247,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
* If a target session is given, this is to be part of a session group,
* so add it to the group and synchronize.
*/
- if (groupwith != NULL) {
+ if (args_has(args, 't')) {
session_group_add(groupwith, s);
session_group_synchronize_to(s);
session_select(s, RB_MIN(winlinks, &s->windows)->idx);
@@ -285,8 +287,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
template = NEW_SESSION_TEMPLATE;
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, NULL,
- NULL);
+ format_defaults(ft, c, s, NULL, NULL);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
diff --git a/usr.bin/tmux/cmd-new-window.c b/usr.bin/tmux/cmd-new-window.c
index d5a837283fd..579c8e9f44c 100644
--- a/usr.bin/tmux/cmd-new-window.c
+++ b/usr.bin/tmux/cmd-new-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-new-window.c,v 1.54 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-new-window.c,v 1.55 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -39,7 +39,12 @@ const struct cmd_entry cmd_new_window_entry = {
"ac:dF:kn:Pt:", 0, -1,
"[-adkP] [-c start-directory] [-F format] [-n window-name] "
CMD_TARGET_WINDOW_USAGE " [command]",
- 0,
+ /*
+ * Using PREP_CANFAIL here ensures that the wl is filled in
+ * regardless; making PREP_INDEX the thing we want -t to be used for
+ * in the specific case.
+ */
+ CMD_INDEX_T|CMD_CANFAIL,
cmd_new_window_exec
};
@@ -47,26 +52,21 @@ enum cmd_retval
cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
- struct winlink *wl;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct client *c = cmdq->state.c;
+ int idx = cmdq->state.tflag.idx;
const char *cmd, *path, *template, *cwd, *to_free;
char **argv, *cause, *cp;
- int argc, idx, detached;
+ int argc, detached;
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);
if ((idx = winlink_shuffle_up(s, wl)) == -1) {
cmdq_error(cmdq, "no free window indexes");
return (CMD_RETURN_ERROR);
}
- } else {
- idx = cmd_find_index(cmdq, args_get(args, 't'), &s);
- if (idx == -2)
- return (CMD_RETURN_ERROR);
}
detached = args_has(args, 'd');
@@ -95,8 +95,7 @@ cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
to_free = NULL;
if (args_has(args, 'c')) {
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, NULL,
- NULL);
+ format_defaults(ft, c, s, NULL, NULL);
cwd = to_free = format_expand(ft, args_get(args, 'c'));
format_free(ft);
} else if (cmdq->client != NULL && cmdq->client->session == NULL)
@@ -144,8 +143,7 @@ cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
template = NEW_WINDOW_TEMPLATE;
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, wl,
- NULL);
+ format_defaults(ft, c, s, wl, NULL);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
diff --git a/usr.bin/tmux/cmd-paste-buffer.c b/usr.bin/tmux/cmd-paste-buffer.c
index f18ece5daa2..c7b5fc33342 100644
--- a/usr.bin/tmux/cmd-paste-buffer.c
+++ b/usr.bin/tmux/cmd-paste-buffer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-paste-buffer.c,v 1.30 2015/09/11 14:41:50 nicm Exp $ */
+/* $OpenBSD: cmd-paste-buffer.c,v 1.31 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -37,7 +37,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,
- 0,
+ CMD_PANE_T,
cmd_paste_buffer_exec
};
@@ -45,16 +45,12 @@ enum cmd_retval
cmd_paste_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct window_pane *wp;
- struct session *s;
+ struct window_pane *wp = cmdq->state.tflag.wp;
struct paste_buffer *pb;
const char *sepstr, *bufname, *bufdata, *bufend, *line;
size_t seplen, bufsize;
int bracket = args_has(args, 'p');
- 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');
diff --git a/usr.bin/tmux/cmd-pipe-pane.c b/usr.bin/tmux/cmd-pipe-pane.c
index de5baae5571..2e4852a01e7 100644
--- a/usr.bin/tmux/cmd-pipe-pane.c
+++ b/usr.bin/tmux/cmd-pipe-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-pipe-pane.c,v 1.32 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-pipe-pane.c,v 1.33 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_pipe_pane_entry = {
"pipe-pane", "pipep",
"ot:", 0, 1,
"[-o] " CMD_TARGET_PANE_USAGE " [command]",
- 0,
+ CMD_PANE_T,
cmd_pipe_pane_exec
};
@@ -49,18 +49,14 @@ enum cmd_retval
cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
- struct session *s;
- struct winlink *wl;
- struct window_pane *wp;
+ struct client *c = cmdq->state.c;
+ struct window_pane *wp = cmdq->state.tflag.wp;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
char *cmd;
int old_fd, pipe_fd[2], null_fd;
struct format_tree *ft;
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- c = cmd_find_client(cmdq, NULL, 1);
-
/* Destroy the old pipe. */
old_fd = wp->pipe_fd;
if (wp->pipe_fd != -1) {
diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c
index 60ed6d7bb5f..ef63770292b 100644
--- a/usr.bin/tmux/cmd-queue.c
+++ b/usr.bin/tmux/cmd-queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-queue.c,v 1.30 2015/11/27 15:06:43 nicm Exp $ */
+/* $OpenBSD: cmd-queue.c,v 1.31 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -25,7 +25,7 @@
#include "tmux.h"
-enum cmd_retval cmdq_continue_one(struct cmd_q *);
+static enum cmd_retval cmdq_continue_one(struct cmd_q *);
/* Create new command queue. */
struct cmd_q *
@@ -179,37 +179,40 @@ cmdq_append(struct cmd_q *cmdq, struct cmd_list *cmdlist, struct mouse_event *m)
}
/* Process one command. */
-enum cmd_retval
+static enum cmd_retval
cmdq_continue_one(struct cmd_q *cmdq)
{
struct cmd *cmd = cmdq->cmd;
enum cmd_retval retval;
- char *s;
+ char *tmp;
int flags = !!(cmd->flags & CMD_CONTROL);
- s = cmd_print(cmd);
- log_debug("cmdq %p: %s", cmdq, s);
- free(s);
+ tmp = cmd_print(cmd);
+ log_debug("cmdq %p: %s", cmdq, tmp);
+ free(tmp);
cmdq->time = time(NULL);
cmdq->number++;
cmdq_guard(cmdq, "begin", flags);
+ if (cmd_prepare_state(cmd, cmdq) != 0)
+ goto error;
retval = cmd->entry->exec(cmd, cmdq);
- if (retval == CMD_RETURN_ERROR)
- cmdq_guard(cmdq, "error", flags);
- else
- cmdq_guard(cmdq, "end", flags);
+ cmdq_guard(cmdq, "end", flags);
return (retval);
+
+error:
+ cmdq_guard(cmdq, "error", flags);
+ return (CMD_RETURN_ERROR);
}
/* Continue processing command queue. Returns 1 if finishes empty. */
int
cmdq_continue(struct cmd_q *cmdq)
{
- struct client *c = cmdq->client;
+ struct client *c = cmdq->client;
struct cmd_q_item *next;
enum cmd_retval retval;
int empty;
diff --git a/usr.bin/tmux/cmd-refresh-client.c b/usr.bin/tmux/cmd-refresh-client.c
index 7c31af993dc..fa8b9e30509 100644
--- a/usr.bin/tmux/cmd-refresh-client.c
+++ b/usr.bin/tmux/cmd-refresh-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-refresh-client.c,v 1.15 2015/09/14 10:25:52 nicm Exp $ */
+/* $OpenBSD: cmd-refresh-client.c,v 1.16 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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,
- 0,
+ CMD_CLIENT_T,
cmd_refresh_client_exec
};
@@ -38,13 +38,10 @@ enum cmd_retval
cmd_refresh_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
+ struct client *c = cmdq->state.c;
const char *size;
u_int w, h;
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
if (args_has(args, 'C')) {
if ((size = args_get(args, 'C')) == NULL) {
cmdq_error(cmdq, "missing size");
diff --git a/usr.bin/tmux/cmd-rename-session.c b/usr.bin/tmux/cmd-rename-session.c
index 5246ab0ac37..cd097f33fa9 100644
--- a/usr.bin/tmux/cmd-rename-session.c
+++ b/usr.bin/tmux/cmd-rename-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-rename-session.c,v 1.16 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-rename-session.c,v 1.17 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_rename_session_entry = {
"rename-session", "rename",
"t:", 1, 1,
CMD_TARGET_SESSION_USAGE " new-name",
- 0,
+ CMD_SESSION_T,
cmd_rename_session_exec
};
@@ -40,7 +40,7 @@ enum cmd_retval
cmd_rename_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
+ struct session *s = cmdq->state.tflag.s;
const char *newname;
newname = args->argv[0];
@@ -53,9 +53,6 @@ cmd_rename_session_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_ERROR);
}
- if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
RB_REMOVE(sessions, &sessions, s);
free(s->name);
s->name = xstrdup(newname);
diff --git a/usr.bin/tmux/cmd-rename-window.c b/usr.bin/tmux/cmd-rename-window.c
index 0b4cbb21245..db83d6916ee 100644
--- a/usr.bin/tmux/cmd-rename-window.c
+++ b/usr.bin/tmux/cmd-rename-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-rename-window.c,v 1.12 2015/10/27 15:58:42 nicm Exp $ */
+/* $OpenBSD: cmd-rename-window.c,v 1.13 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_rename_window_entry = {
"rename-window", "renamew",
"t:", 1, 1,
CMD_TARGET_WINDOW_USAGE " new-name",
- 0,
+ CMD_WINDOW_T,
cmd_rename_window_exec
};
@@ -40,11 +40,7 @@ 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 = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
- return (CMD_RETURN_ERROR);
+ struct winlink *wl = cmdq->state.tflag.wl;
window_set_name(wl->window, args->argv[0]);
options_set_number(wl->window->options, "automatic-rename", 0);
diff --git a/usr.bin/tmux/cmd-resize-pane.c b/usr.bin/tmux/cmd-resize-pane.c
index 9e12c9e2c4f..eb41276fd30 100644
--- a/usr.bin/tmux/cmd-resize-pane.c
+++ b/usr.bin/tmux/cmd-resize-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-resize-pane.c,v 1.18 2015/04/19 21:34:21 nicm Exp $ */
+/* $OpenBSD: cmd-resize-pane.c,v 1.19 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -33,9 +33,8 @@ void cmd_resize_pane_mouse_update(struct client *, struct mouse_event *);
const struct cmd_entry cmd_resize_pane_entry = {
"resize-pane", "resizep",
"DLMRt:Ux:y:Z", 0, 1,
- "[-DLMRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE
- " [adjustment]",
- 0,
+ "[-DLMRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " [adjustment]",
+ CMD_PANE_T,
cmd_resize_pane_exec
};
@@ -43,13 +42,13 @@ enum cmd_retval
cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
+ struct window_pane *wp = cmdq->state.tflag.wp;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
struct client *c = cmdq->client;
- struct session *s;
- struct winlink *wl;
- struct window *w;
+ struct session *s = cmdq->state.tflag.s;
const char *errstr;
char *cause;
- struct window_pane *wp;
u_int adjust;
int x, y;
@@ -63,10 +62,7 @@ cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
w = wl->window;
-
if (args_has(args, 'Z')) {
if (w->flags & WINDOW_ZOOMED)
window_unzoom(w);
diff --git a/usr.bin/tmux/cmd-respawn-pane.c b/usr.bin/tmux/cmd-respawn-pane.c
index fc601724668..9858acdc6ab 100644
--- a/usr.bin/tmux/cmd-respawn-pane.c
+++ b/usr.bin/tmux/cmd-respawn-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-respawn-pane.c,v 1.16 2015/10/31 08:13:58 nicm Exp $ */
+/* $OpenBSD: cmd-respawn-pane.c,v 1.17 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -34,7 +34,7 @@ const struct cmd_entry cmd_respawn_pane_entry = {
"respawn-pane", "respawnp",
"kt:", 0, -1,
"[-k] " CMD_TARGET_PANE_USAGE " [command]",
- 0,
+ CMD_PANE_T,
cmd_respawn_pane_exec
};
@@ -42,20 +42,16 @@ enum cmd_retval
cmd_respawn_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl;
- struct window *w;
- struct window_pane *wp;
- struct session *s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
+ struct window_pane *wp = cmdq->state.tflag.wp;
+ struct session *s = cmdq->state.tflag.s;
struct environ *env;
const char *path;
char *cause;
u_int idx;
struct environ_entry *envent;
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
-
if (!args_has(self->args, 'k') && wp->fd != -1) {
if (window_pane_index(wp, &idx) != 0)
fatalx("index not found");
diff --git a/usr.bin/tmux/cmd-respawn-window.c b/usr.bin/tmux/cmd-respawn-window.c
index d41e3657045..74c5e8de667 100644
--- a/usr.bin/tmux/cmd-respawn-window.c
+++ b/usr.bin/tmux/cmd-respawn-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-respawn-window.c,v 1.25 2015/10/31 08:13:58 nicm Exp $ */
+/* $OpenBSD: cmd-respawn-window.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_respawn_window_entry = {
"respawn-window", "respawnw",
"kt:", 0, -1,
"[-k] " CMD_TARGET_WINDOW_USAGE " [command]",
- 0,
+ CMD_WINDOW_T,
cmd_respawn_window_exec
};
@@ -41,25 +41,21 @@ enum cmd_retval
cmd_respawn_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl;
- struct window *w;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
struct window_pane *wp;
- struct session *s;
struct environ *env;
const char *path;
char *cause;
struct environ_entry *envent;
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
-
if (!args_has(self->args, 'k')) {
TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->fd == -1)
continue;
- cmdq_error(cmdq,
- "window still active: %s:%d", s->name, wl->idx);
+ cmdq_error(cmdq, "window still active: %s:%d", s->name,
+ wl->idx);
return (CMD_RETURN_ERROR);
}
}
diff --git a/usr.bin/tmux/cmd-rotate-window.c b/usr.bin/tmux/cmd-rotate-window.c
index 461bf42ad44..213561434a3 100644
--- a/usr.bin/tmux/cmd-rotate-window.c
+++ b/usr.bin/tmux/cmd-rotate-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-rotate-window.c,v 1.15 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-rotate-window.c,v 1.16 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,24 +30,19 @@ const struct cmd_entry cmd_rotate_window_entry = {
"rotate-window", "rotatew",
"Dt:U", 0, 0,
"[-DU] " CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
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 winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
struct window_pane *wp, *wp2;
struct layout_cell *lc;
u_int sx, sy, xoff, yoff;
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
-
if (args_has(self->args, 'D')) {
wp = TAILQ_LAST(&w->panes, window_panes);
TAILQ_REMOVE(&w->panes, wp, entry);
diff --git a/usr.bin/tmux/cmd-run-shell.c b/usr.bin/tmux/cmd-run-shell.c
index d73124c928d..3d403ed4ac8 100644
--- a/usr.bin/tmux/cmd-run-shell.c
+++ b/usr.bin/tmux/cmd-run-shell.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-run-shell.c,v 1.32 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-run-shell.c,v 1.33 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -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",
- 0,
+ CMD_PANE_T|CMD_CANFAIL,
cmd_run_shell_exec
};
@@ -75,31 +75,18 @@ 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 session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window_pane *wp = cmdq->state.tflag.wp;
struct format_tree *ft;
const char *cwd;
- if (args_has(args, 't')) {
- wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
- cwd = wp->cwd;
- } else {
- c = cmd_find_client(cmdq, NULL, 1);
- if (c != NULL && c->session != NULL) {
- s = c->session;
- wl = s->curw;
- wp = wl->window->active;
- }
- if (cmdq->client != NULL && cmdq->client->session == NULL)
- cwd = cmdq->client->cwd;
- else if (s != NULL)
- cwd = s->cwd;
- else
- cwd = NULL;
- }
-
+ if (cmdq->client != NULL && cmdq->client->session == NULL)
+ cwd = cmdq->client->cwd;
+ else if (s != NULL)
+ cwd = s->cwd;
+ else
+ cwd = NULL;
ft = format_create(cmdq, 0);
format_defaults(ft, NULL, s, wl, wp);
shellcmd = format_expand(ft, args->argv[0]);
diff --git a/usr.bin/tmux/cmd-save-buffer.c b/usr.bin/tmux/cmd-save-buffer.c
index 75cdcc9b31f..862307df01b 100644
--- a/usr.bin/tmux/cmd-save-buffer.c
+++ b/usr.bin/tmux/cmd-save-buffer.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-save-buffer.c,v 1.34 2015/11/14 09:41:06 nicm Exp $ */
+/* $OpenBSD: cmd-save-buffer.c,v 1.35 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -94,7 +94,7 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
if (c != NULL && c->session == NULL)
cwd = c->cwd;
- else if ((s = cmd_find_current(cmdq)) != NULL)
+ else if ((s = c->session) != NULL)
cwd = s->cwd;
else
cwd = ".";
diff --git a/usr.bin/tmux/cmd-select-layout.c b/usr.bin/tmux/cmd-select-layout.c
index 8f209415831..e62cf4270b7 100644
--- a/usr.bin/tmux/cmd-select-layout.c
+++ b/usr.bin/tmux/cmd-select-layout.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-select-layout.c,v 1.25 2015/04/28 10:43:13 nicm Exp $ */
+/* $OpenBSD: cmd-select-layout.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_select_layout_entry = {
"select-layout", "selectl",
"nopt:", 0, 1,
"[-nop] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
- 0,
+ CMD_WINDOW_T,
cmd_select_layout_exec
};
@@ -40,7 +40,7 @@ const struct cmd_entry cmd_next_layout_entry = {
"next-layout", "nextl",
"t:", 0, 0,
CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
cmd_select_layout_exec
};
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_previous_layout_entry = {
"previous-layout", "prevl",
"t:", 0, 0,
CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
cmd_select_layout_exec
};
@@ -56,16 +56,13 @@ enum cmd_retval
cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl;
+ struct winlink *wl = cmdq->state.tflag.wl;
struct window *w;
const char *layoutname;
char *oldlayout;
int next, previous, layout;
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
- return (CMD_RETURN_ERROR);
w = wl->window;
-
server_unzoom_window(w);
next = self->entry == &cmd_next_layout_entry;
diff --git a/usr.bin/tmux/cmd-select-pane.c b/usr.bin/tmux/cmd-select-pane.c
index f74df0d6797..c9fcf07e0fd 100644
--- a/usr.bin/tmux/cmd-select-pane.c
+++ b/usr.bin/tmux/cmd-select-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-select-pane.c,v 1.26 2015/10/22 11:19:31 nicm Exp $ */
+/* $OpenBSD: cmd-select-pane.c,v 1.27 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,7 +30,7 @@ const struct cmd_entry cmd_select_pane_entry = {
"select-pane", "selectp",
"DdegLlMmP:Rt:U", 0, 0,
"[-DdegLlMmRU] [-P style] " CMD_TARGET_PANE_USAGE,
- 0,
+ CMD_PANE_T,
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,
- 0,
+ CMD_WINDOW_T,
cmd_select_pane_exec
};
@@ -46,19 +46,15 @@ enum cmd_retval
cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *wl;
- struct window *w;
- struct session *s;
- struct window_pane *wp, *lastwp, *markedwp;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
+ struct session *s = cmdq->state.tflag.s;
+ struct window_pane *wp = cmdq->state.tflag.wp, *lastwp, *markedwp;
const char *style;
if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
- wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
- if (w->last == NULL) {
+ if (wl->window->last == NULL) {
cmdq_error(cmdq, "no last pane");
return (CMD_RETURN_ERROR);
}
@@ -79,9 +75,11 @@ cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
+ server_unzoom_window(wp->window);
+ if (!window_pane_visible(wp)) {
+ cmdq_error(cmdq, "pane not visible");
return (CMD_RETURN_ERROR);
- w = wl->window;
+ }
if (args_has(args, 'm') || args_has(args, 'M')) {
if (args_has(args, 'm') && !window_pane_visible(wp))
diff --git a/usr.bin/tmux/cmd-select-window.c b/usr.bin/tmux/cmd-select-window.c
index c959bb37b66..7c2f27e600d 100644
--- a/usr.bin/tmux/cmd-select-window.c
+++ b/usr.bin/tmux/cmd-select-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-select-window.c,v 1.12 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-select-window.c,v 1.13 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,7 +32,7 @@ const struct cmd_entry cmd_select_window_entry = {
"select-window", "selectw",
"lnpTt:", 0, 0,
"[-lnpT] " CMD_TARGET_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_T,
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,
- 0,
+ CMD_SESSION_T,
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,
- 0,
+ CMD_SESSION_T,
cmd_select_window_exec
};
@@ -56,16 +56,15 @@ const struct cmd_entry cmd_last_window_entry = {
"last-window", "last",
"t:", 0, 0,
CMD_TARGET_SESSION_USAGE,
- 0,
+ CMD_SESSION_T,
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;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct session *s = cmdq->state.tflag.s;
int next, previous, last, activity;
next = self->entry == &cmd_next_window_entry;
@@ -79,10 +78,6 @@ cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
last = 1;
if (next || previous || last) {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
-
activity = args_has(self->args, 'a');
if (next) {
if (session_next(s, activity) != 0) {
@@ -103,10 +98,6 @@ cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
server_redraw_session(s);
} else {
- wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
-
/*
* If -T and select-window is invoked on same window as
* current, switch to previous window.
diff --git a/usr.bin/tmux/cmd-send-keys.c b/usr.bin/tmux/cmd-send-keys.c
index a083a6b95ee..70be78de33c 100644
--- a/usr.bin/tmux/cmd-send-keys.c
+++ b/usr.bin/tmux/cmd-send-keys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-send-keys.c,v 1.23 2015/12/12 18:19:00 nicm Exp $ */
+/* $OpenBSD: cmd-send-keys.c,v 1.24 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_send_keys_entry = {
"send-keys", "send",
"lRMt:", 0, -1,
"[-lRM] " CMD_TARGET_PANE_USAGE " key ...",
- 0,
+ CMD_PANE_T,
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,
- 0,
+ CMD_PANE_T,
cmd_send_keys_exec
};
@@ -49,11 +49,11 @@ enum cmd_retval
cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
+ struct window_pane *wp = cmdq->state.tflag.wp;
+ struct session *s = cmdq->state.tflag.s;
struct mouse_event *m = &cmdq->item->mouse;
- struct window_pane *wp;
- struct session *s;
- int i, literal;
const u_char *keystr;
+ int i, literal;
key_code key;
if (args_has(args, 'M')) {
@@ -66,9 +66,6 @@ cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
- if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
- return (CMD_RETURN_ERROR);
-
if (self->entry == &cmd_send_prefix_entry) {
if (args_has(args, '2'))
key = options_get_number(s->options, "prefix2");
diff --git a/usr.bin/tmux/cmd-set-environment.c b/usr.bin/tmux/cmd-set-environment.c
index 9ec8e8f8fa5..7bb0b47e394 100644
--- a/usr.bin/tmux/cmd-set-environment.c
+++ b/usr.bin/tmux/cmd-set-environment.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-set-environment.c,v 1.12 2015/11/24 23:46:15 nicm Exp $ */
+/* $OpenBSD: cmd-set-environment.c,v 1.13 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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]",
- 0,
+ CMD_SESSION_T,
cmd_set_environment_exec
};
@@ -41,7 +41,6 @@ enum cmd_retval
cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
struct environ *env;
const char *name, *value;
@@ -62,11 +61,8 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(self->args, 'g'))
env = global_environ;
- else {
- if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
- env = s->environ;
- }
+ else
+ env = cmdq->state.tflag.s->environ;
if (args_has(self->args, 'u')) {
if (value != NULL) {
diff --git a/usr.bin/tmux/cmd-set-hook.c b/usr.bin/tmux/cmd-set-hook.c
index d69d50944e6..7ae2a3db9b0 100644
--- a/usr.bin/tmux/cmd-set-hook.c
+++ b/usr.bin/tmux/cmd-set-hook.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-set-hook.c,v 1.2 2015/12/11 15:46:57 nicm Exp $ */
+/* $OpenBSD: cmd-set-hook.c,v 1.3 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2012 Thomas Adam <thomas@xteddy.org>
@@ -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]",
- 0,
+ CMD_SESSION_T,
cmd_set_hook_exec
};
@@ -41,7 +41,7 @@ const struct cmd_entry cmd_show_hooks_entry = {
"show-hooks", NULL,
"gt:", 0, 1,
"[-g] " CMD_TARGET_SESSION_USAGE,
- 0,
+ CMD_SESSION_T,
cmd_set_hook_exec
};
@@ -49,7 +49,6 @@ enum cmd_retval
cmd_set_hook_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
struct cmd_list *cmdlist;
struct hooks *hooks;
struct hook *hook;
@@ -58,12 +57,8 @@ cmd_set_hook_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(args, 'g'))
hooks = global_hooks;
- else {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
- hooks = s->hooks;
- }
+ else
+ hooks = cmdq->state.tflag.s->hooks;
if (self->entry == &cmd_show_hooks_entry) {
hook = hooks_first(hooks);
diff --git a/usr.bin/tmux/cmd-set-option.c b/usr.bin/tmux/cmd-set-option.c
index d95eae96dae..0425887467a 100644
--- a/usr.bin/tmux/cmd-set-option.c
+++ b/usr.bin/tmux/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-set-option.c,v 1.89 2015/12/12 18:32:24 nicm Exp $ */
+/* $OpenBSD: cmd-set-option.c,v 1.90 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -67,8 +67,8 @@ struct options_entry *cmd_set_option_style(struct cmd *, struct cmd_q *,
const struct cmd_entry cmd_set_option_entry = {
"set-option", "set",
"agoqst:uw", 1, 2,
- "[-agosquw] [-t target-session|target-window] option [value]",
- 0,
+ "[-agosquw] [-t target-window] option [value]",
+ CMD_WINDOW_T|CMD_CANFAIL,
cmd_set_option_exec
};
@@ -76,7 +76,7 @@ const struct cmd_entry cmd_set_window_option_entry = {
"set-window-option", "setw",
"agoqt:u", 1, 2,
"[-agoqu] " CMD_TARGET_WINDOW_USAGE " option [value]",
- 0,
+ CMD_WINDOW_T|CMD_CANFAIL,
cmd_set_option_exec
};
@@ -84,12 +84,12 @@ enum cmd_retval
cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- const struct options_table_entry *oe;
- struct session *s;
- struct winlink *wl;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w;
struct client *c;
+ const struct options_table_entry *oe;
struct options *oo;
- struct window *w;
const char *optstr, *valstr;
/* Get the option name and value. */
@@ -131,7 +131,6 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(self->args, 'g'))
oo = global_w_options;
else {
- wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
if (wl == NULL) {
cmdq_error(cmdq,
"couldn't set '%s'%s", optstr,
@@ -145,7 +144,6 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
if (args_has(self->args, 'g'))
oo = global_s_options;
else {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL) {
cmdq_error(cmdq,
"couldn't set '%s'%s", optstr,
@@ -209,8 +207,8 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
const char *valstr)
{
struct args *args = self->args;
- struct session *s;
- struct winlink *wl;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
struct options *oo;
if (args_has(args, 's'))
@@ -219,21 +217,13 @@ cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char *optstr,
self->entry == &cmd_set_window_option_entry) {
if (args_has(self->args, 'g'))
oo = global_w_options;
- else {
- wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
+ else
oo = wl->window->options;
- }
} else {
if (args_has(self->args, 'g'))
oo = global_s_options;
- else {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
+ else
oo = s->options;
- }
}
if (args_has(args, 'u')) {
diff --git a/usr.bin/tmux/cmd-show-environment.c b/usr.bin/tmux/cmd-show-environment.c
index ef61a58de8d..b3ff7bd5345 100644
--- a/usr.bin/tmux/cmd-show-environment.c
+++ b/usr.bin/tmux/cmd-show-environment.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-show-environment.c,v 1.12 2015/10/28 09:51:55 nicm Exp $ */
+/* $OpenBSD: cmd-show-environment.c,v 1.13 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -37,7 +37,7 @@ const struct cmd_entry cmd_show_environment_entry = {
"show-environment", "showenv",
"gst:", 0, 1,
"[-gs] " CMD_TARGET_SESSION_USAGE " [name]",
- 0,
+ CMD_SESSION_T,
cmd_show_environment_exec
};
@@ -86,18 +86,13 @@ enum cmd_retval
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
struct environ *env;
struct environ_entry *envent;
if (args_has(self->args, 'g'))
env = global_environ;
- else {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
- env = s->environ;
- }
+ else
+ env = cmdq->state.tflag.s->environ;
if (args->argc != 0) {
envent = environ_find(env, args->argv[0]);
diff --git a/usr.bin/tmux/cmd-show-messages.c b/usr.bin/tmux/cmd-show-messages.c
index df1bd2bb094..f3ded3427fe 100644
--- a/usr.bin/tmux/cmd-show-messages.c
+++ b/usr.bin/tmux/cmd-show-messages.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-show-messages.c,v 1.16 2015/11/24 21:52:06 nicm Exp $ */
+/* $OpenBSD: cmd-show-messages.c,v 1.17 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -35,7 +35,7 @@ const struct cmd_entry cmd_show_messages_entry = {
"show-messages", "showmsgs",
"JTt:", 0, 0,
"[-JT] " CMD_TARGET_CLIENT_USAGE,
- 0,
+ CMD_CLIENT_T,
cmd_show_messages_exec
};
@@ -94,7 +94,7 @@ enum cmd_retval
cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
+ struct client *c = cmdq->state.c;
struct message_entry *msg;
char *tim;
int done, blank;
@@ -111,9 +111,6 @@ cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
if (done)
return (CMD_RETURN_NORMAL);
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
-
TAILQ_FOREACH(msg, &c->message_log, entry) {
tim = ctime(&msg->msg_time);
*strchr(tim, '\n') = '\0';
diff --git a/usr.bin/tmux/cmd-show-options.c b/usr.bin/tmux/cmd-show-options.c
index b3fd6124e40..1c44e568a05 100644
--- a/usr.bin/tmux/cmd-show-options.c
+++ b/usr.bin/tmux/cmd-show-options.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-show-options.c,v 1.25 2015/11/20 12:01:19 nicm Exp $ */
+/* $OpenBSD: cmd-show-options.c,v 1.26 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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]",
- 0,
+ CMD_WINDOW_T,
cmd_show_options_exec
};
@@ -46,19 +46,19 @@ const struct cmd_entry cmd_show_window_options_entry = {
"show-window-options", "showw",
"gvt:", 0, 1,
"[-gv] " CMD_TARGET_WINDOW_USAGE " [option]",
- 0,
+ CMD_WINDOW_T,
cmd_show_options_exec
};
enum cmd_retval
cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct session *s;
- struct winlink *wl;
- struct options *oo;
- int quiet;
- enum options_table_scope scope;
+ struct args *args = self->args;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct options *oo;
+ enum options_table_scope scope;
+ int quiet;
if (args_has(self->args, 's')) {
oo = global_options;
@@ -68,22 +68,14 @@ cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
scope = OPTIONS_TABLE_WINDOW;
if (args_has(self->args, 'g'))
oo = global_w_options;
- else {
- wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
- if (wl == NULL)
- return (CMD_RETURN_ERROR);
+ else
oo = wl->window->options;
- }
} else {
scope = OPTIONS_TABLE_SESSION;
if (args_has(self->args, 'g'))
oo = global_s_options;
- else {
- s = cmd_find_session(cmdq, args_get(args, 't'), 0);
- if (s == NULL)
- return (CMD_RETURN_ERROR);
+ else
oo = s->options;
- }
}
quiet = args_has(self->args, 'q');
diff --git a/usr.bin/tmux/cmd-source-file.c b/usr.bin/tmux/cmd-source-file.c
index 121539836c9..f1bd264a3ce 100644
--- a/usr.bin/tmux/cmd-source-file.c
+++ b/usr.bin/tmux/cmd-source-file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-source-file.c,v 1.21 2014/10/27 22:23:47 nicm Exp $ */
+/* $OpenBSD: cmd-source-file.c,v 1.22 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2008 Tiago Cunha <me@tiagocunha.org>
@@ -45,8 +45,7 @@ cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
struct cmd_q *cmdq1;
char *cause;
- cmdq1 = cmdq_new(NULL);
- cmdq1->client = cmdq->client;
+ cmdq1 = cmdq_new(cmdq->client);
cmdq1->emptyfn = cmd_source_file_done;
cmdq1->data = cmdq;
diff --git a/usr.bin/tmux/cmd-split-window.c b/usr.bin/tmux/cmd-split-window.c
index e4e92ec3668..c9051125a05 100644
--- a/usr.bin/tmux/cmd-split-window.c
+++ b/usr.bin/tmux/cmd-split-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-split-window.c,v 1.64 2015/12/11 12:27:36 nicm Exp $ */
+/* $OpenBSD: cmd-split-window.c,v 1.65 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -40,7 +40,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]",
- 0,
+ CMD_PANE_T,
cmd_split_window_exec
};
@@ -48,10 +48,10 @@ enum cmd_retval
cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct session *s;
- struct winlink *wl;
- struct window *w;
- struct window_pane *wp, *new_wp = NULL;
+ struct session *s = cmdq->state.tflag.s;
+ struct winlink *wl = cmdq->state.tflag.wl;
+ struct window *w = wl->window;
+ struct window_pane *wp = cmdq->state.tflag.wp, *new_wp = NULL;
struct environ *env;
const char *cmd, *path, *shell, *template, *cwd, *to_free;
char **argv, *cause, *new_cause, *cp;
@@ -62,9 +62,6 @@ cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
struct format_tree *ft;
struct environ_entry *envent;
- if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
server_unzoom_window(w);
env = environ_create();
@@ -89,8 +86,7 @@ cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
to_free = NULL;
if (args_has(args, 'c')) {
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, NULL,
- NULL);
+ format_defaults(ft, cmdq->state.c, s, NULL, NULL);
to_free = cwd = format_expand(ft, args_get(args, 'c'));
format_free(ft);
} else if (cmdq->client != NULL && cmdq->client->session == NULL)
@@ -166,8 +162,7 @@ cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
template = SPLIT_WINDOW_TEMPLATE;
ft = format_create(cmdq, 0);
- format_defaults(ft, cmd_find_client(cmdq, NULL, 1), s, wl,
- new_wp);
+ format_defaults(ft, cmdq->state.c, s, wl, new_wp);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
diff --git a/usr.bin/tmux/cmd-swap-pane.c b/usr.bin/tmux/cmd-swap-pane.c
index d2feddb27cc..ae208be1321 100644
--- a/usr.bin/tmux/cmd-swap-pane.c
+++ b/usr.bin/tmux/cmd-swap-pane.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-swap-pane.c,v 1.21 2015/08/30 15:43:40 nicm Exp $ */
+/* $OpenBSD: cmd-swap-pane.c,v 1.22 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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,
- 0,
+ CMD_PANE_MARKED_S|CMD_PANE_T,
cmd_swap_pane_exec
};
@@ -40,16 +40,18 @@ enum cmd_retval
cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct winlink *src_wl, *dst_wl;
+ struct winlink *src_wl, *dst_wl;
struct window *src_w, *dst_w;
struct window_pane *tmp_wp, *src_wp, *dst_wp;
struct layout_cell *src_lc, *dst_lc;
u_int sx, sy, xoff, yoff;
- dst_wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &dst_wp);
- if (dst_wl == NULL)
- return (CMD_RETURN_ERROR);
+ dst_wl = cmdq->state.tflag.wl;
dst_w = dst_wl->window;
+ dst_wp = cmdq->state.tflag.wp;
+ src_wp = cmdq->state.sflag.wp;
+ src_wl = cmdq->state.sflag.wl;
+ src_w = src_wl->window;
server_unzoom_window(dst_w);
if (!args_has(args, 's')) {
@@ -62,19 +64,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
src_wp = TAILQ_PREV(dst_wp, window_panes, entry);
if (src_wp == NULL)
src_wp = TAILQ_LAST(&dst_w->panes, window_panes);
- } else {
- src_wl = cmd_find_pane_marked(cmdq, NULL, NULL,
- &src_wp);
- if (src_wl == NULL)
- return (CMD_RETURN_ERROR);
- src_w = src_wl->window;
}
- } else {
- src_wl = cmd_find_pane_marked(cmdq, args_get(args, 's'), NULL,
- &src_wp);
- if (src_wl == NULL)
- return (CMD_RETURN_ERROR);
- src_w = src_wl->window;
}
server_unzoom_window(src_w);
diff --git a/usr.bin/tmux/cmd-swap-window.c b/usr.bin/tmux/cmd-swap-window.c
index bae3ec56875..6fec606ab78 100644
--- a/usr.bin/tmux/cmd-swap-window.c
+++ b/usr.bin/tmux/cmd-swap-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-swap-window.c,v 1.12 2015/06/04 11:43:51 nicm Exp $ */
+/* $OpenBSD: cmd-swap-window.c,v 1.13 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -32,31 +32,28 @@ const struct cmd_entry cmd_swap_window_entry = {
"swap-window", "swapw",
"ds:t:", 0, 0,
"[-d] " CMD_SRCDST_WINDOW_USAGE,
- 0,
+ CMD_WINDOW_MARKED_S|CMD_WINDOW_MARKED_T,
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;
- target_src = args_get(args, 's');
- if ((wl_src = cmd_find_window_marked(cmdq, target_src, &src)) == NULL)
- return (CMD_RETURN_ERROR);
- target_dst = args_get(args, 't');
- if ((wl_dst = cmd_find_window(cmdq, target_dst, &dst)) == NULL)
- return (CMD_RETURN_ERROR);
-
+ wl_src = cmdq->state.sflag.wl;
+ src = cmdq->state.sflag.s;
sg_src = session_group_find(src);
+
+ wl_dst = cmdq->state.tflag.wl;
+ dst = cmdq->state.tflag.s;
sg_dst = session_group_find(dst);
- if (src != dst &&
- sg_src != NULL && sg_dst != NULL && sg_src == sg_dst) {
+
+ if (src != dst && sg_src != NULL && sg_dst != NULL &&
+ sg_src == sg_dst) {
cmdq_error(cmdq, "can't move window, sessions are grouped");
return (CMD_RETURN_ERROR);
}
diff --git a/usr.bin/tmux/cmd-switch-client.c b/usr.bin/tmux/cmd-switch-client.c
index d0b5906bdea..30f31ab9823 100644
--- a/usr.bin/tmux/cmd-switch-client.c
+++ b/usr.bin/tmux/cmd-switch-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-switch-client.c,v 1.37 2015/12/12 18:32:24 nicm Exp $ */
+/* $OpenBSD: cmd-switch-client.c,v 1.38 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -33,7 +33,7 @@ const struct cmd_entry cmd_switch_client_entry = {
"switch-client", "switchc",
"lc:Enpt:rT:", 0, 0,
"[-Elnpr] [-c target-client] [-t target-session] [-T key-table]",
- CMD_READONLY,
+ CMD_READONLY|CMD_CLIENT_C|CMD_PANE_T|CMD_SESSION_T|CMD_PREFERUNATTACHED,
cmd_switch_client_exec
};
@@ -41,16 +41,13 @@ enum cmd_retval
cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
- struct client *c;
- struct session *s = NULL;
- struct winlink *wl = NULL;
- struct window *w = NULL;
- struct window_pane *wp = NULL;
- const char *tflag, *tablename, *update;
+ struct cmd_state *state = &cmdq->state;
+ struct client *c = state->c;
+ struct session *s = cmdq->state.tflag.s;
+ struct window_pane *wp;
+ const char *tablename, *update;
struct key_table *table;
- if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
- return (CMD_RETURN_ERROR);
if (args_has(args, 'r'))
c->flags ^= CLIENT_READONLY;
@@ -68,7 +65,6 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
return (CMD_RETURN_NORMAL);
}
- tflag = args_get(args, 't');
if (args_has(args, 'n')) {
if ((s = session_next_session(c->session)) == NULL) {
cmdq_error(cmdq, "can't find next session");
@@ -82,37 +78,21 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
} else if (args_has(args, 'l')) {
if (c->last_session != NULL && session_alive(c->last_session))
s = c->last_session;
+ else
+ s = NULL;
if (s == NULL) {
cmdq_error(cmdq, "can't find last session");
return (CMD_RETURN_ERROR);
}
- } else {
- if (tflag == NULL) {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- } else if (tflag[strcspn(tflag, ":.")] != '\0') {
- if ((wl = cmd_find_pane(cmdq, tflag, &s, &wp)) == NULL)
- return (CMD_RETURN_ERROR);
- } else {
- if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
- return (CMD_RETURN_ERROR);
- w = window_find_by_id_str(tflag);
- if (w == NULL) {
- wp = window_pane_find_by_id_str(tflag);
- if (wp != NULL)
- w = wp->window;
- }
- if (w != NULL)
- wl = winlink_find_by_window(&s->windows, w);
- }
-
if (cmdq->client == NULL)
return (CMD_RETURN_NORMAL);
- if (wl != NULL) {
+ s = state->tflag.s;
+ if (state->tflag.wl != NULL) {
+ wp = state->tflag.wp;
if (wp != NULL)
window_set_active_pane(wp->window, wp);
- session_set_current(s, wl);
+ session_set_current(s, state->tflag.wl);
}
}
diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c
index e9b82c0eadd..465053292a3 100644
--- a/usr.bin/tmux/cmd.c
+++ b/usr.bin/tmux/cmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd.c,v 1.107 2015/12/08 01:10:31 nicm Exp $ */
+/* $OpenBSD: cmd.c,v 1.108 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -207,6 +207,10 @@ const struct cmd_entry *cmd_table[] = {
NULL
};
+static void cmd_clear_state(struct cmd_state *);
+static struct client *cmd_get_state_client(struct cmd_q *, int);
+static int cmd_set_state_flag(struct cmd *, struct cmd_q *, char);
+
int
cmd_pack_argv(int argc, char **argv, char *buf, size_t len)
{
@@ -388,6 +392,253 @@ usage:
return (NULL);
}
+static void
+cmd_clear_state(struct cmd_state *state)
+{
+ state->c = NULL;
+
+ state->tflag.s = NULL;
+ state->tflag.wl = NULL;
+ state->tflag.wp = NULL;
+ state->tflag.idx = -1;
+
+ state->sflag.s = NULL;
+ state->sflag.wl = NULL;
+ state->sflag.wp = NULL;
+ state->sflag.idx = -1;
+}
+
+static struct client *
+cmd_get_state_client(struct cmd_q *cmdq, int quiet)
+{
+ struct cmd *cmd = cmdq->cmd;
+ struct args *args = cmd->args;
+
+ switch (cmd->entry->flags & (CMD_CLIENT_C|CMD_CLIENT_T)) {
+ case 0:
+ return (cmd_find_client(cmdq, NULL, 1));
+ case CMD_CLIENT_C:
+ return (cmd_find_client(cmdq, args_get(args, 'c'), quiet));
+ case CMD_CLIENT_T:
+ return (cmd_find_client(cmdq, args_get(args, 't'), quiet));
+ default:
+ fatalx("both -t and -c for %s", cmd->entry->name);
+ }
+}
+
+static int
+cmd_set_state_flag(struct cmd *cmd, struct cmd_q *cmdq, char c)
+{
+ struct cmd_state *state = &cmdq->state;
+ struct cmd_state_flag *statef = NULL;
+ const char *flag;
+ int flags = cmd->entry->flags, everything = 0;
+ int allflags = 0;
+ int prefer = !!(flags & CMD_PREFERUNATTACHED);
+ struct session *s;
+ struct window *w;
+ struct winlink *wl;
+ struct window_pane *wp;
+
+ if (c == 't') {
+ statef = &cmdq->state.tflag;
+ allflags = CMD_ALL_T;
+ } else if (c == 's') {
+ statef = &cmdq->state.sflag;
+ allflags = CMD_ALL_S;
+ }
+
+ /*
+ * If the command wants something and no argument is present, use the
+ * base command instead.
+ */
+ flag = args_get(cmd->args, c);
+ if (flag == NULL) {
+ if ((flags & allflags) == 0)
+ return (0); /* doesn't care about flag */
+ cmd = cmdq->cmd;
+ everything = 1;
+ flag = args_get(cmd->args, c);
+ }
+
+ /*
+ * If no flag and the current command is allowed to fail, just skip to
+ * fill in as much we can, otherwise continue and fail later if needed.
+ */
+ if (flag == NULL && (flags & CMD_CANFAIL))
+ goto complete_everything;
+
+ /* Fill in state using command (current or base) flags. */
+ switch (cmd->entry->flags & allflags) {
+ case 0:
+ break;
+ case CMD_SESSION_T|CMD_PANE_T:
+ case CMD_SESSION_S|CMD_PANE_S:
+ if (flag != NULL && flag[strcspn(flag, ":.")] != '\0') {
+ statef->wl = cmd_find_pane(cmdq, flag, &statef->s,
+ &statef->wp);
+ if (statef->wl == NULL)
+ return (-1);
+ } else {
+ statef->s = cmd_find_session(cmdq, flag, prefer);
+ if (statef->s == NULL)
+ return (-1);
+
+ s = statef->s;
+ if (flag == NULL) {
+ statef->wl = s->curw;
+ statef->wp = s->curw->window->active;
+ } else {
+ if ((w = window_find_by_id_str(flag)) != NULL)
+ wp = w->active;
+ else {
+ wp = window_pane_find_by_id_str(flag);
+ if (wp != NULL)
+ w = wp->window;
+ }
+ wl = winlink_find_by_window(&s->windows, w);
+ if (wl != NULL) {
+ statef->wl = wl;
+ statef->wp = wp;
+ }
+ }
+ }
+ break;
+ case CMD_MOVEW_R|CMD_INDEX_T:
+ case CMD_MOVEW_R|CMD_INDEX_S:
+ statef->s = cmd_find_session(cmdq, flag, prefer);
+ if (statef->s == NULL) {
+ statef->idx = cmd_find_index(cmdq, flag, &statef->s);
+ if (statef->idx == -2)
+ return (-1);
+ }
+ break;
+ case CMD_SESSION_T:
+ case CMD_SESSION_S:
+ statef->s = cmd_find_session(cmdq, flag, prefer);
+ if (statef->s == NULL)
+ return (-1);
+ break;
+ case CMD_WINDOW_T:
+ case CMD_WINDOW_S:
+ statef->wl = cmd_find_window(cmdq, flag, &statef->s);
+ if (statef->wl == NULL)
+ return (-1);
+ break;
+ case CMD_WINDOW_MARKED_T:
+ case CMD_WINDOW_MARKED_S:
+ statef->wl = cmd_find_window_marked(cmdq, flag, &statef->s);
+ if (statef->wl == NULL)
+ return (-1);
+ break;
+ case CMD_PANE_T:
+ case CMD_PANE_S:
+ statef->wl = cmd_find_pane(cmdq, flag, &statef->s,
+ &statef->wp);
+ if (statef->wl == NULL)
+ return (-1);
+ break;
+ case CMD_PANE_MARKED_S:
+ case CMD_PANE_MARKED_T:
+ statef->wl = cmd_find_pane_marked(cmdq, flag, &statef->s,
+ &statef->wp);
+ if (statef->wl == NULL)
+ return (-1);
+ break;
+ case CMD_INDEX_T:
+ case CMD_INDEX_S:
+ statef->idx = cmd_find_index(cmdq, flag, &statef->s);
+ if (statef->idx == -2)
+ return (-1);
+ break;
+ default:
+ fatalx("too many -%c for %s", c, cmd->entry->name);
+ }
+
+ /*
+ * If this is still the current command, it wants what it asked for and
+ * nothing more. If it's the base command, fill in as much as possible
+ * because the current command may have different flags.
+ */
+ if (!everything)
+ return (0);
+
+complete_everything:
+ if (statef->s == NULL) {
+ if (state->c != NULL)
+ statef->s = state->c->session;
+ if (statef->s == NULL)
+ statef->s = cmd_find_current(cmdq);
+ if (statef->s == NULL) {
+ if (flags & CMD_CANFAIL)
+ return (0);
+
+ cmdq_error(cmdq, "no current session");
+ return (-1);
+ }
+ }
+ if (statef->wl == NULL)
+ statef->wl = cmd_find_window(cmdq, flag, &statef->s);
+ if (statef->wp == NULL)
+ statef->wl = cmd_find_pane(cmdq, flag, &statef->s, &statef->wp);
+
+ return (0);
+}
+
+int
+cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq)
+{
+ struct cmd_state *state = &cmdq->state;
+ struct args *args = cmd->args;
+ const char *cflag, *tflag;
+ char *tmp;
+ int error;
+
+ tmp = cmd_print(cmd);
+ log_debug("preparing state for: %s (client %d)", tmp,
+ cmdq->client != NULL ? cmdq->client->fd : -1);
+ free(tmp);
+
+ /* Start with an empty state. */
+ cmd_clear_state(state);
+
+ /*
+ * If the command wants a client and provides -c or -t, use it. If not,
+ * try the base command instead via cmd_get_state_client. No client is
+ * allowed if no flags, otherwise it must be available.
+ */
+ switch (cmd->entry->flags & (CMD_CLIENT_C|CMD_CLIENT_T)) {
+ case 0:
+ state->c = cmd_get_state_client(cmdq, 1);
+ break;
+ case CMD_CLIENT_C:
+ cflag = args_get(args, 'c');
+ if (cflag == NULL)
+ state->c = cmd_get_state_client(cmdq, 0);
+ else
+ state->c = cmd_find_client(cmdq, cflag, 0);
+ if (state->c == NULL)
+ return (-1);
+ break;
+ case CMD_CLIENT_T:
+ tflag = args_get(args, 't');
+ if (tflag == NULL)
+ state->c = cmd_get_state_client(cmdq, 0);
+ else
+ state->c = cmd_find_client(cmdq, tflag, 0);
+ if (state->c == NULL)
+ return (-1);
+ break;
+ default:
+ fatalx("both -c and -t for %s", cmd->entry->name);
+ }
+
+ error = cmd_set_state_flag(cmd, cmdq, 't');
+ if (error == 0)
+ error = cmd_set_state_flag(cmd, cmdq, 's');
+ return (error);
+}
+
char *
cmd_print(struct cmd *cmd)
{
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index e7af74e9ba8..6b17a9956c0 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.602 2015/12/12 18:32:24 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.603 2015/12/13 14:32:38 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1293,6 +1293,20 @@ struct args {
char **argv;
};
+/* Context for a command about to be executed. */
+struct cmd_state_flag {
+ struct session *s;
+ struct winlink *wl;
+ struct window_pane *wp;
+ int idx;
+
+};
+struct cmd_state {
+ struct client *c;
+ struct cmd_state_flag tflag;
+ struct cmd_state_flag sflag;
+};
+
/* Command and list of commands. */
struct cmd {
const struct cmd_entry *entry;
@@ -1343,6 +1357,8 @@ struct cmd_q {
struct cmd_q_item *item;
struct cmd *cmd;
+ struct cmd_state state;
+
time_t time;
u_int number;
@@ -1365,10 +1381,31 @@ struct cmd_entry {
#define CMD_STARTSERVER 0x1
#define CMD_READONLY 0x2
+#define CMD_SESSION_T 0x4
+#define CMD_SESSION_S 0x8
+#define CMD_WINDOW_T 0x10
+#define CMD_WINDOW_S 0x20
+#define CMD_PANE_T 0x40
+#define CMD_PANE_S 0x80
+#define CMD_CLIENT_T 0x100
+#define CMD_CLIENT_C 0x200
+#define CMD_INDEX_T 0x400
+#define CMD_INDEX_S 0x800
+#define CMD_CANFAIL 0x1000
+#define CMD_PREFERUNATTACHED 0x2000
+#define CMD_MOVEW_R 0x4000 /* for movew -r only */
+#define CMD_PANE_MARKED_S 0x8000
+#define CMD_PANE_MARKED_T 0x10000
+#define CMD_WINDOW_MARKED_T 0x20000
+#define CMD_WINDOW_MARKED_S 0x40000
int flags;
enum cmd_retval (*exec)(struct cmd *, struct cmd_q *);
};
+#define CMD_ALL_T (CMD_SESSION_T|CMD_WINDOW_T|CMD_PANE_T|CMD_INDEX_T| \
+ CMD_MOVEW_R|CMD_PANE_MARKED_T|CMD_WINDOW_MARKED_T)
+#define CMD_ALL_S (CMD_SESSION_S|CMD_WINDOW_S|CMD_PANE_S|CMD_INDEX_S| \
+ CMD_PANE_MARKED_S|CMD_WINDOW_MARKED_S)
/* Key binding and key table. */
struct key_binding {
@@ -1718,6 +1755,7 @@ char **cmd_copy_argv(int, char **);
void cmd_free_argv(int, char **);
char *cmd_stringify_argv(int, char **);
struct cmd *cmd_parse(int, char **, const char *, u_int, char **);
+int cmd_prepare_state(struct cmd *, struct cmd_q *);
char *cmd_print(struct cmd *);
int cmd_mouse_at(struct window_pane *, struct mouse_event *,
u_int *, u_int *, int);
@@ -1728,8 +1766,8 @@ char *cmd_template_replace(const char *, const char *, int);
extern const struct cmd_entry *cmd_table[];
/* cmd-attach-session.c */
-enum cmd_retval cmd_attach_session(struct cmd_q *, const char *, int, int,
- const char *, int);
+enum cmd_retval cmd_attach_session(struct cmd_q *, int, int, const char *,
+ int);
/* cmd-list.c */
struct cmd_list *cmd_list_parse(int, char **, const char *, u_int, char **);