mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Make the marked pane a cmd_find_state.
This commit is contained in:
		
							
								
								
									
										109
									
								
								cmd-find.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								cmd-find.c
									
									
									
									
									
								
							@@ -792,6 +792,67 @@ cmd_find_clear_state(struct cmd_find_state *fs, struct cmd_q *cmdq, int flags)
 | 
			
		||||
	fs->idx = -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Check if a state if valid. */
 | 
			
		||||
int
 | 
			
		||||
cmd_find_valid_state(struct cmd_find_state *fs)
 | 
			
		||||
{
 | 
			
		||||
	struct winlink	*wl;
 | 
			
		||||
 | 
			
		||||
	if (fs->s == NULL || fs->wl == NULL || fs->w == NULL || fs->wp == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (!session_alive(fs->s))
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	RB_FOREACH(wl, winlinks, &fs->s->windows) {
 | 
			
		||||
		if (wl->window == fs->w && wl == fs->wl)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	if (wl == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (fs->w != fs->wl->window)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (!window_has_pane(fs->w, fs->wp))
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (window_pane_visible(fs->wp));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Copy a state. */
 | 
			
		||||
void
 | 
			
		||||
cmd_find_copy_state(struct cmd_find_state *dst, struct cmd_find_state *src)
 | 
			
		||||
{
 | 
			
		||||
	dst->s = src->s;
 | 
			
		||||
	dst->wl = src->wl;
 | 
			
		||||
	dst->idx = dst->wl->idx;
 | 
			
		||||
	dst->w = dst->wl->window;
 | 
			
		||||
	dst->wp = src->wp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Log the result. */
 | 
			
		||||
void
 | 
			
		||||
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
 | 
			
		||||
{
 | 
			
		||||
	if (fs->s != NULL)
 | 
			
		||||
		log_debug("%s: s=$%u", prefix, fs->s->id);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: s=none", prefix);
 | 
			
		||||
	if (fs->wl != NULL) {
 | 
			
		||||
		log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
 | 
			
		||||
		    fs->wl->window == fs->w, fs->w->id, fs->w->name);
 | 
			
		||||
	} else
 | 
			
		||||
		log_debug("%s: wl=none", prefix);
 | 
			
		||||
	if (fs->wp != NULL)
 | 
			
		||||
		log_debug("%s: wp=%%%u", prefix, fs->wp->id);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: wp=none", prefix);
 | 
			
		||||
	if (fs->idx != -1)
 | 
			
		||||
		log_debug("%s: idx=%d", prefix, fs->idx);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: idx=none", prefix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Split target into pieces and resolve for the given type. Fills in the given
 | 
			
		||||
 * state. Returns 0 on success or -1 on error.
 | 
			
		||||
@@ -814,17 +875,14 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
 | 
			
		||||
 | 
			
		||||
	/* Find current state. */
 | 
			
		||||
	cmd_find_clear_state(¤t, cmdq, flags);
 | 
			
		||||
	if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED)) {
 | 
			
		||||
		current.s = marked_session;
 | 
			
		||||
		current.wl = marked_winlink;
 | 
			
		||||
		current.idx = current.wl->idx;
 | 
			
		||||
		current.w = current.wl->window;
 | 
			
		||||
		current.wp = marked_window_pane;
 | 
			
		||||
	}
 | 
			
		||||
	if (current.s == NULL && cmd_find_current_session(¤t) != 0) {
 | 
			
		||||
		if (~flags & CMD_FIND_QUIET)
 | 
			
		||||
			cmdq_error(cmdq, "no current session");
 | 
			
		||||
		goto error;
 | 
			
		||||
	if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED))
 | 
			
		||||
		cmd_find_copy_state(¤t, &marked_pane);
 | 
			
		||||
	else {
 | 
			
		||||
		if (cmd_find_current_session(¤t) != 0) {
 | 
			
		||||
			if (~flags & CMD_FIND_QUIET)
 | 
			
		||||
				cmdq_error(cmdq, "no current session");
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Clear new state. */
 | 
			
		||||
@@ -868,11 +926,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
 | 
			
		||||
				cmdq_error(cmdq, "no marked target");
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
		fs->s = marked_session;
 | 
			
		||||
		fs->wl = marked_winlink;
 | 
			
		||||
		fs->idx = fs->wl->idx;
 | 
			
		||||
		fs->w = fs->wl->window;
 | 
			
		||||
		fs->wp = marked_window_pane;
 | 
			
		||||
		cmd_find_copy_state(fs, &marked_pane);
 | 
			
		||||
		goto found;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -1068,29 +1122,6 @@ no_pane:
 | 
			
		||||
	goto error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Log the result. */
 | 
			
		||||
void
 | 
			
		||||
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
 | 
			
		||||
{
 | 
			
		||||
	if (fs->s != NULL)
 | 
			
		||||
		log_debug("%s: s=$%u", prefix, fs->s->id);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: s=none", prefix);
 | 
			
		||||
	if (fs->wl != NULL) {
 | 
			
		||||
		log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
 | 
			
		||||
		    fs->wl->window == fs->w, fs->w->id, fs->w->name);
 | 
			
		||||
	} else
 | 
			
		||||
		log_debug("%s: wl=none", prefix);
 | 
			
		||||
	if (fs->wp != NULL)
 | 
			
		||||
		log_debug("%s: wp=%%%u", prefix, fs->wp->id);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: wp=none", prefix);
 | 
			
		||||
	if (fs->idx != -1)
 | 
			
		||||
		log_debug("%s: idx=%d", prefix, fs->idx);
 | 
			
		||||
	else
 | 
			
		||||
		log_debug("%s: idx=none", prefix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Find the target client or report an error and return NULL. */
 | 
			
		||||
struct client *
 | 
			
		||||
cmd_find_client(struct cmd_q *cmdq, const char *target, int quiet)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user