mirror of
https://github.com/tmux/tmux.git
synced 2024-11-12 23:28:52 +00:00
Split out getting the current state from the target search so it can be
replaced if we already know the current.
This commit is contained in:
parent
995af0e2b7
commit
b5b5221c13
29
cmd-find.c
29
cmd-find.c
@ -923,15 +923,27 @@ cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp)
|
|||||||
return (0);
|
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
|
* Split target into pieces and resolve for the given type. Fills in the given
|
||||||
* state. Returns 0 on success or -1 on error.
|
* state. Returns 0 on success or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
|
cmd_find_target(struct cmd_find_state *fs, struct cmd_find_state *current,
|
||||||
const char *target, enum cmd_find_type type, int flags)
|
struct cmd_q *cmdq, const char *target, enum cmd_find_type type, int flags)
|
||||||
{
|
{
|
||||||
struct cmd_find_state current;
|
|
||||||
struct mouse_event *m;
|
struct mouse_event *m;
|
||||||
char *colon, *period, *copy = NULL;
|
char *colon, *period, *copy = NULL;
|
||||||
const char *session, *window, *pane;
|
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;
|
fs->current = &marked_pane;
|
||||||
else if (cmd_find_valid_state(&cmdq->current))
|
else if (cmd_find_valid_state(&cmdq->current))
|
||||||
fs->current = &cmdq->current;
|
fs->current = &cmdq->current;
|
||||||
else {
|
else
|
||||||
cmd_find_clear_state(¤t, cmdq, flags);
|
fs->current = current;
|
||||||
if (cmd_find_current_session(¤t) != 0) {
|
|
||||||
if (~flags & CMD_FIND_QUIET)
|
|
||||||
cmdq_error(cmdq, "no current session");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
fs->current = ¤t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An empty or NULL target is the current. */
|
/* An empty or NULL target is the current. */
|
||||||
if (target == NULL || *target == '\0')
|
if (target == NULL || *target == '\0')
|
||||||
|
@ -199,7 +199,7 @@ cmdq_continue_one(struct cmd_q *cmdq)
|
|||||||
|
|
||||||
cmdq_guard(cmdq, "begin", flags);
|
cmdq_guard(cmdq, "begin", flags);
|
||||||
|
|
||||||
if (cmd_prepare_state(cmd, cmdq) != 0)
|
if (cmd_prepare_state(cmd, cmdq, NULL) != 0)
|
||||||
goto error;
|
goto error;
|
||||||
retval = cmd->entry->exec(cmd, cmdq);
|
retval = cmd->entry->exec(cmd, cmdq);
|
||||||
if (retval == CMD_RETURN_ERROR)
|
if (retval == CMD_RETURN_ERROR)
|
||||||
|
118
cmd.c
118
cmd.c
@ -389,10 +389,23 @@ usage:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
|
cmd_prepare_state_flag(char c, const char *target, enum cmd_entry_flag flag,
|
||||||
const char *target, struct cmd_q *cmdq)
|
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 (flag == CMD_SESSION_WITHPANE) {
|
||||||
if (target != NULL && target[strcspn(target, ":.")] != '\0')
|
if (target != NULL && target[strcspn(target, ":.")] != '\0')
|
||||||
@ -401,6 +414,55 @@ cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
|
|||||||
flag = CMD_SESSION;
|
flag = CMD_SESSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
targetflags = 0;
|
||||||
|
switch (flag) {
|
||||||
|
case CMD_SESSION:
|
||||||
|
case CMD_SESSION_CANFAIL:
|
||||||
|
case CMD_SESSION_PREFERUNATTACHED:
|
||||||
|
if (flag == CMD_SESSION_CANFAIL)
|
||||||
|
targetflags |= CMD_FIND_QUIET;
|
||||||
|
if (flag == CMD_SESSION_PREFERUNATTACHED)
|
||||||
|
targetflags |= CMD_FIND_PREFER_UNATTACHED;
|
||||||
|
break;
|
||||||
|
case CMD_MOVEW_R:
|
||||||
|
flag = CMD_WINDOW_INDEX;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case CMD_WINDOW:
|
||||||
|
case CMD_WINDOW_CANFAIL:
|
||||||
|
case CMD_WINDOW_MARKED:
|
||||||
|
case CMD_WINDOW_INDEX:
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case CMD_PANE:
|
||||||
|
case CMD_PANE_CANFAIL:
|
||||||
|
case CMD_PANE_MARKED:
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
switch (flag) {
|
||||||
case CMD_NONE:
|
case CMD_NONE:
|
||||||
case CMD_CLIENT:
|
case CMD_CLIENT:
|
||||||
@ -410,20 +472,14 @@ cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
|
|||||||
case CMD_SESSION_CANFAIL:
|
case CMD_SESSION_CANFAIL:
|
||||||
case CMD_SESSION_PREFERUNATTACHED:
|
case CMD_SESSION_PREFERUNATTACHED:
|
||||||
case CMD_SESSION_WITHPANE:
|
case CMD_SESSION_WITHPANE:
|
||||||
targetflags = 0;
|
error = cmd_find_target(fs, current, cmdq, target,
|
||||||
if (flag == CMD_SESSION_CANFAIL)
|
CMD_FIND_SESSION, targetflags);
|
||||||
targetflags |= CMD_FIND_QUIET;
|
if (error != 0 && ~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);
|
return (-1);
|
||||||
break;
|
break;
|
||||||
case CMD_MOVEW_R:
|
case CMD_MOVEW_R:
|
||||||
error = cmd_find_target(fs, cmdq, target, CMD_FIND_SESSION,
|
error = cmd_find_target(fs, current, cmdq, target,
|
||||||
CMD_FIND_QUIET);
|
CMD_FIND_SESSION, CMD_FIND_QUIET);
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
break;
|
break;
|
||||||
flag = CMD_WINDOW_INDEX;
|
flag = CMD_WINDOW_INDEX;
|
||||||
@ -432,39 +488,27 @@ cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
|
|||||||
case CMD_WINDOW_CANFAIL:
|
case CMD_WINDOW_CANFAIL:
|
||||||
case CMD_WINDOW_MARKED:
|
case CMD_WINDOW_MARKED:
|
||||||
case CMD_WINDOW_INDEX:
|
case CMD_WINDOW_INDEX:
|
||||||
targetflags = 0;
|
error = cmd_find_target(fs, current, cmdq, target,
|
||||||
if (flag == CMD_WINDOW_CANFAIL)
|
CMD_FIND_WINDOW, targetflags);
|
||||||
targetflags |= CMD_FIND_QUIET;
|
if (error != 0 && ~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);
|
return (-1);
|
||||||
break;
|
break;
|
||||||
case CMD_PANE:
|
case CMD_PANE:
|
||||||
case CMD_PANE_CANFAIL:
|
case CMD_PANE_CANFAIL:
|
||||||
case CMD_PANE_MARKED:
|
case CMD_PANE_MARKED:
|
||||||
targetflags = 0;
|
error = cmd_find_target(fs, current, cmdq, target,
|
||||||
if (flag == CMD_PANE_CANFAIL)
|
CMD_FIND_PANE, targetflags);
|
||||||
targetflags |= CMD_FIND_QUIET;
|
if (error != 0 && ~targetflags & CMD_FIND_QUIET)
|
||||||
if (flag == CMD_PANE_MARKED)
|
|
||||||
targetflags |= CMD_FIND_DEFAULT_MARKED;
|
|
||||||
|
|
||||||
error = cmd_find_target(fs, cmdq, target, CMD_FIND_PANE,
|
|
||||||
targetflags);
|
|
||||||
if (error != 0 && flag != CMD_PANE_CANFAIL)
|
|
||||||
return (-1);
|
return (-1);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
fatalx("unknown %cflag %d", c, flag);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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;
|
const struct cmd_entry *entry = cmd->entry;
|
||||||
struct cmd_state *state = &cmdq->state;
|
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');
|
s = args_get(cmd->args, 't');
|
||||||
log_debug("preparing -t state: target %s", s == NULL ? "none" : s);
|
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)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
s = args_get(cmd->args, 's');
|
s = args_get(cmd->args, 's');
|
||||||
log_debug("preparing -s state: target %s", s == NULL ? "none" : 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)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
10
tmux.h
10
tmux.h
@ -1769,8 +1769,11 @@ long long args_strtonum(struct args *, u_char, long long, long long,
|
|||||||
char **);
|
char **);
|
||||||
|
|
||||||
/* cmd-find.c */
|
/* cmd-find.c */
|
||||||
int cmd_find_target(struct cmd_find_state *, struct cmd_q *,
|
int cmd_find_current(struct cmd_find_state *, struct cmd_q *,
|
||||||
const char *, enum cmd_find_type, int);
|
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);
|
struct client *cmd_find_client(struct cmd_q *, const char *, int);
|
||||||
void cmd_find_clear_state(struct cmd_find_state *, struct cmd_q *,
|
void cmd_find_clear_state(struct cmd_find_state *, struct cmd_q *,
|
||||||
int);
|
int);
|
||||||
@ -1793,7 +1796,8 @@ char **cmd_copy_argv(int, char **);
|
|||||||
void cmd_free_argv(int, char **);
|
void cmd_free_argv(int, char **);
|
||||||
char *cmd_stringify_argv(int, char **);
|
char *cmd_stringify_argv(int, char **);
|
||||||
struct cmd *cmd_parse(int, char **, const char *, u_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 *);
|
char *cmd_print(struct cmd *);
|
||||||
int cmd_mouse_at(struct window_pane *, struct mouse_event *,
|
int cmd_mouse_at(struct window_pane *, struct mouse_event *,
|
||||||
u_int *, u_int *, int);
|
u_int *, u_int *, int);
|
||||||
|
Loading…
Reference in New Issue
Block a user