summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tmux/cmd-find.c31
-rw-r--r--usr.bin/tmux/cmd-queue.c4
-rw-r--r--usr.bin/tmux/cmd.c108
-rw-r--r--usr.bin/tmux/tmux.h12
4 files changed, 104 insertions, 51 deletions
diff --git a/usr.bin/tmux/cmd-find.c b/usr.bin/tmux/cmd-find.c
index 81b35668a24..7459e3e1945 100644
--- a/usr.bin/tmux/cmd-find.c
+++ b/usr.bin/tmux/cmd-find.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-find.c,v 1.30 2016/01/19 15:59:12 nicm Exp $ */
+/* $OpenBSD: cmd-find.c,v 1.31 2016/01/19 16:01:30 nicm Exp $ */
/*
* Copyright (c) 2015 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -923,15 +923,27 @@ cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp)
return (0);
}
+/* Find current state. */
+int
+cmd_find_current(struct cmd_find_state *fs, struct cmd_q *cmdq, int flags)
+{
+ cmd_find_clear_state(fs, cmdq, flags);
+ if (cmd_find_current_session(fs) != 0) {
+ if (~flags & CMD_FIND_QUIET)
+ cmdq_error(cmdq, "no current session");
+ return (-1);
+ }
+ return (0);
+}
+
/*
* Split target into pieces and resolve for the given type. Fills in the given
* state. Returns 0 on success or -1 on error.
*/
int
-cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
- const char *target, enum cmd_find_type type, int flags)
+cmd_find_target(struct cmd_find_state *fs, struct cmd_find_state *current,
+ struct cmd_q *cmdq, const char *target, enum cmd_find_type type, int flags)
{
- struct cmd_find_state current;
struct mouse_event *m;
char *colon, *period, *copy = NULL;
const char *session, *window, *pane;
@@ -951,15 +963,8 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
fs->current = &marked_pane;
else if (cmd_find_valid_state(&cmdq->current))
fs->current = &cmdq->current;
- else {
- cmd_find_clear_state(&current, cmdq, flags);
- if (cmd_find_current_session(&current) != 0) {
- if (~flags & CMD_FIND_QUIET)
- cmdq_error(cmdq, "no current session");
- goto error;
- }
- fs->current = &current;
- }
+ else
+ fs->current = current;
/* An empty or NULL target is the current. */
if (target == NULL || *target == '\0')
diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c
index 5a1eb7455bd..daf71ea8844 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.34 2016/01/19 15:59:12 nicm Exp $ */
+/* $OpenBSD: cmd-queue.c,v 1.35 2016/01/19 16:01:30 nicm Exp $ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -199,7 +199,7 @@ cmdq_continue_one(struct cmd_q *cmdq)
cmdq_guard(cmdq, "begin", flags);
- if (cmd_prepare_state(cmd, cmdq) != 0)
+ if (cmd_prepare_state(cmd, cmdq, NULL) != 0)
goto error;
retval = cmd->entry->exec(cmd, cmdq);
if (retval == CMD_RETURN_ERROR)
diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c
index 3de44ccd22f..e09e01c9d26 100644
--- a/usr.bin/tmux/cmd.c
+++ b/usr.bin/tmux/cmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd.c,v 1.120 2016/01/19 15:59:12 nicm Exp $ */
+/* $OpenBSD: cmd.c,v 1.121 2016/01/19 16:01:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -389,10 +389,23 @@ usage:
}
static int
-cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
- const char *target, struct cmd_q *cmdq)
+cmd_prepare_state_flag(char c, const char *target, enum cmd_entry_flag flag,
+ struct cmd_q *cmdq, struct cmd_q *parent)
{
- int targetflags, error;
+ int targetflags, error;
+ struct cmd_find_state *fs = NULL;
+ struct cmd_find_state *current = NULL;
+ struct cmd_find_state tmp;
+
+ if (flag == CMD_NONE ||
+ flag == CMD_CLIENT ||
+ flag == CMD_CLIENT_CANFAIL)
+ return (0);
+
+ if (c == 't')
+ fs = &cmdq->state.tflag;
+ else if (c == 's')
+ fs = &cmdq->state.sflag;
if (flag == CMD_SESSION_WITHPANE) {
if (target != NULL && target[strcspn(target, ":.")] != '\0')
@@ -401,70 +414,101 @@ cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
flag = CMD_SESSION;
}
+ targetflags = 0;
switch (flag) {
- case CMD_NONE:
- case CMD_CLIENT:
- case CMD_CLIENT_CANFAIL:
- return (0);
case CMD_SESSION:
case CMD_SESSION_CANFAIL:
case CMD_SESSION_PREFERUNATTACHED:
- case CMD_SESSION_WITHPANE:
- targetflags = 0;
if (flag == CMD_SESSION_CANFAIL)
targetflags |= CMD_FIND_QUIET;
if (flag == CMD_SESSION_PREFERUNATTACHED)
targetflags |= CMD_FIND_PREFER_UNATTACHED;
-
- error = cmd_find_target(fs, cmdq, target, CMD_FIND_SESSION,
- targetflags);
- if (error != 0 && flag != CMD_SESSION_CANFAIL)
- return (-1);
break;
case CMD_MOVEW_R:
- error = cmd_find_target(fs, cmdq, target, CMD_FIND_SESSION,
- CMD_FIND_QUIET);
- if (error == 0)
- break;
flag = CMD_WINDOW_INDEX;
/* FALLTHROUGH */
case CMD_WINDOW:
case CMD_WINDOW_CANFAIL:
case CMD_WINDOW_MARKED:
case CMD_WINDOW_INDEX:
- targetflags = 0;
if (flag == CMD_WINDOW_CANFAIL)
targetflags |= CMD_FIND_QUIET;
if (flag == CMD_WINDOW_MARKED)
targetflags |= CMD_FIND_DEFAULT_MARKED;
if (flag == CMD_WINDOW_INDEX)
targetflags |= CMD_FIND_WINDOW_INDEX;
-
- error = cmd_find_target(fs, cmdq, target, CMD_FIND_WINDOW,
- targetflags);
- if (error != 0 && flag != CMD_WINDOW_CANFAIL)
- return (-1);
break;
case CMD_PANE:
case CMD_PANE_CANFAIL:
case CMD_PANE_MARKED:
- targetflags = 0;
if (flag == CMD_PANE_CANFAIL)
targetflags |= CMD_FIND_QUIET;
if (flag == CMD_PANE_MARKED)
targetflags |= CMD_FIND_DEFAULT_MARKED;
+ break;
+ default:
+ fatalx("unknown %cflag %d", c, flag);
+ }
- error = cmd_find_target(fs, cmdq, target, CMD_FIND_PANE,
- targetflags);
- if (error != 0 && flag != CMD_PANE_CANFAIL)
+ log_debug("%s: flag %c %d %#x", __func__, c, flag, targetflags);
+ if (parent != NULL) {
+ if (c == 't')
+ current = &parent->state.tflag;
+ else if (c == 's')
+ current = &parent->state.sflag;
+ } else {
+ error = cmd_find_current(&tmp, cmdq, targetflags);
+ if (error != 0 && ~targetflags & CMD_FIND_QUIET)
+ return (-1);
+ current = &tmp;
+ }
+
+ switch (flag) {
+ case CMD_NONE:
+ case CMD_CLIENT:
+ case CMD_CLIENT_CANFAIL:
+ return (0);
+ case CMD_SESSION:
+ case CMD_SESSION_CANFAIL:
+ case CMD_SESSION_PREFERUNATTACHED:
+ case CMD_SESSION_WITHPANE:
+ error = cmd_find_target(fs, current, cmdq, target,
+ CMD_FIND_SESSION, targetflags);
+ if (error != 0 && ~targetflags & CMD_FIND_QUIET)
return (-1);
break;
+ case CMD_MOVEW_R:
+ error = cmd_find_target(fs, current, cmdq, target,
+ CMD_FIND_SESSION, CMD_FIND_QUIET);
+ if (error == 0)
+ break;
+ flag = CMD_WINDOW_INDEX;
+ /* FALLTHROUGH */
+ case CMD_WINDOW:
+ case CMD_WINDOW_CANFAIL:
+ case CMD_WINDOW_MARKED:
+ case CMD_WINDOW_INDEX:
+ error = cmd_find_target(fs, current, cmdq, target,
+ CMD_FIND_WINDOW, targetflags);
+ if (error != 0 && ~targetflags & CMD_FIND_QUIET)
+ return (-1);
+ break;
+ case CMD_PANE:
+ case CMD_PANE_CANFAIL:
+ case CMD_PANE_MARKED:
+ error = cmd_find_target(fs, current, cmdq, target,
+ CMD_FIND_PANE, targetflags);
+ if (error != 0 && ~targetflags & CMD_FIND_QUIET)
+ return (-1);
+ break;
+ default:
+ fatalx("unknown %cflag %d", c, flag);
}
return (0);
}
int
-cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq)
+cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq, struct cmd_q *parent)
{
const struct cmd_entry *entry = cmd->entry;
struct cmd_state *state = &cmdq->state;
@@ -504,14 +548,14 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq)
s = args_get(cmd->args, 't');
log_debug("preparing -t state: target %s", s == NULL ? "none" : s);
- error = cmd_prepare_state_flag(&state->tflag, entry->tflag, s, cmdq);
+ error = cmd_prepare_state_flag('t', s, entry->tflag, cmdq, parent);
if (error != 0)
return (error);
s = args_get(cmd->args, 's');
log_debug("preparing -s state: target %s", s == NULL ? "none" : s);
- error = cmd_prepare_state_flag(&state->sflag, entry->sflag, s, cmdq);
+ error = cmd_prepare_state_flag('s', s, entry->sflag, cmdq, parent);
if (error != 0)
return (error);
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 70efbaed1c0..9c7c8745bb6 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.617 2016/01/19 15:59:12 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.618 2016/01/19 16:01:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1769,8 +1769,11 @@ long long args_strtonum(struct args *, u_char, long long, long long,
char **);
/* cmd-find.c */
-int cmd_find_target(struct cmd_find_state *, struct cmd_q *,
- const char *, enum cmd_find_type, int);
+int cmd_find_current(struct cmd_find_state *, struct cmd_q *,
+ int);
+int cmd_find_target(struct cmd_find_state *,
+ struct cmd_find_state *, struct cmd_q *, const char *,
+ enum cmd_find_type, int);
struct client *cmd_find_client(struct cmd_q *, const char *, int);
void cmd_find_clear_state(struct cmd_find_state *, struct cmd_q *,
int);
@@ -1793,7 +1796,8 @@ 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 *);
+int cmd_prepare_state(struct cmd *, struct cmd_q *,
+ struct cmd_q *);
char *cmd_print(struct cmd *);
int cmd_mouse_at(struct window_pane *, struct mouse_event *,
u_int *, u_int *, int);