mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +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:
		
							
								
								
									
										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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 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(¤t, cmdq, flags);
 | 
			
		||||
		if (cmd_find_current_session(¤t) != 0) {
 | 
			
		||||
			if (~flags & CMD_FIND_QUIET)
 | 
			
		||||
				cmdq_error(cmdq, "no current session");
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
		fs->current = ¤t;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		fs->current = current;
 | 
			
		||||
 | 
			
		||||
	/* An empty or NULL target is the current. */
 | 
			
		||||
	if (target == NULL || *target == '\0')
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										116
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								cmd.c
									
									
									
									
									
								
							@@ -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;
 | 
			
		||||
	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,6 +414,55 @@ cmd_prepare_state_flag(struct cmd_find_state *fs, enum cmd_entry_flag flag,
 | 
			
		||||
			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) {
 | 
			
		||||
	case CMD_NONE:
 | 
			
		||||
	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_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)
 | 
			
		||||
		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, cmdq, target, CMD_FIND_SESSION,
 | 
			
		||||
		    CMD_FIND_QUIET);
 | 
			
		||||
		error = cmd_find_target(fs, current, cmdq, target,
 | 
			
		||||
		    CMD_FIND_SESSION, CMD_FIND_QUIET);
 | 
			
		||||
		if (error == 0)
 | 
			
		||||
			break;
 | 
			
		||||
		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_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)
 | 
			
		||||
		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:
 | 
			
		||||
		targetflags = 0;
 | 
			
		||||
		if (flag == CMD_PANE_CANFAIL)
 | 
			
		||||
			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)
 | 
			
		||||
		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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								tmux.h
									
									
									
									
									
								
							@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user