mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Do not forbid targets to specify non-visible panes - the checks for
visibility are better where the target is used. GitHub issue 1049.
This commit is contained in:
		
							
								
								
									
										32
									
								
								cmd-find.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								cmd-find.c
									
									
									
									
									
								
							@@ -510,7 +510,7 @@ cmd_find_get_pane(struct cmd_find_state *fs, const char *pane, int only)
 | 
			
		||||
	/* Check for pane ids starting with %. */
 | 
			
		||||
	if (*pane == '%') {
 | 
			
		||||
		fs->wp = window_pane_find_by_id_str(pane);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		fs->w = fs->wp->window;
 | 
			
		||||
		return (cmd_find_best_session_with_window(fs));
 | 
			
		||||
@@ -547,7 +547,7 @@ cmd_find_get_pane_with_session(struct cmd_find_state *fs, const char *pane)
 | 
			
		||||
	/* Check for pane ids starting with %. */
 | 
			
		||||
	if (*pane == '%') {
 | 
			
		||||
		fs->wp = window_pane_find_by_id_str(pane);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		fs->w = fs->wp->window;
 | 
			
		||||
		return (cmd_find_best_winlink_with_window(fs));
 | 
			
		||||
@@ -579,7 +579,7 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)
 | 
			
		||||
	/* Check for pane ids starting with %. */
 | 
			
		||||
	if (*pane == '%') {
 | 
			
		||||
		fs->wp = window_pane_find_by_id_str(pane);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		if (fs->wp->window != fs->w)
 | 
			
		||||
			return (-1);
 | 
			
		||||
@@ -591,27 +591,27 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)
 | 
			
		||||
		if (fs->w->last == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		fs->wp = fs->w->last;
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	} else if (strcmp(pane, "{up-of}") == 0) {
 | 
			
		||||
		fs->wp = window_pane_find_up(fs->w->active);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	} else if (strcmp(pane, "{down-of}") == 0) {
 | 
			
		||||
		fs->wp = window_pane_find_down(fs->w->active);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	} else if (strcmp(pane, "{left-of}") == 0) {
 | 
			
		||||
		fs->wp = window_pane_find_left(fs->w->active);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	} else if (strcmp(pane, "{right-of}") == 0) {
 | 
			
		||||
		fs->wp = window_pane_find_right(fs->w->active);
 | 
			
		||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	}
 | 
			
		||||
@@ -627,7 +627,7 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)
 | 
			
		||||
			fs->wp = window_pane_next_by_number(fs->w, wp, n);
 | 
			
		||||
		else
 | 
			
		||||
			fs->wp = window_pane_previous_by_number(fs->w, wp, n);
 | 
			
		||||
		if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp != NULL)
 | 
			
		||||
			return (0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -635,13 +635,13 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)
 | 
			
		||||
	idx = strtonum(pane, 0, INT_MAX, &errstr);
 | 
			
		||||
	if (errstr == NULL) {
 | 
			
		||||
		fs->wp = window_pane_at_index(fs->w, idx);
 | 
			
		||||
		if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
			
		||||
		if (fs->wp != NULL)
 | 
			
		||||
			return (0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Try as a description. */
 | 
			
		||||
	fs->wp = window_find_string(fs->w, pane);
 | 
			
		||||
	if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
			
		||||
	if (fs->wp != NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	return (-1);
 | 
			
		||||
@@ -689,9 +689,7 @@ cmd_find_valid_state(struct cmd_find_state *fs)
 | 
			
		||||
	if (fs->w != fs->wl->window)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (!window_has_pane(fs->w, fs->wp))
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (!window_pane_outside(fs->wp));
 | 
			
		||||
	return (window_has_pane(fs->w, fs->wp));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Copy a state. */
 | 
			
		||||
@@ -818,10 +816,6 @@ cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	if (cmd_find_from_window(fs, wp->window) != 0)
 | 
			
		||||
		return (-1);
 | 
			
		||||
	if (window_pane_outside(wp)) {
 | 
			
		||||
		cmd_find_clear_state(fs, 0);
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
	fs->wp = wp;
 | 
			
		||||
 | 
			
		||||
	cmd_find_log_state(__func__, fs);
 | 
			
		||||
@@ -1016,7 +1010,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmdq_item *item,
 | 
			
		||||
		switch (type) {
 | 
			
		||||
		case CMD_FIND_PANE:
 | 
			
		||||
			fs->wp = cmd_mouse_pane(m, &fs->s, &fs->wl);
 | 
			
		||||
			if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
			
		||||
			if (fs->wp != NULL)
 | 
			
		||||
				fs->w = fs->wl->window;
 | 
			
		||||
			break;
 | 
			
		||||
		case CMD_FIND_WINDOW:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								resize.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								resize.c
									
									
									
									
									
								
							@@ -159,6 +159,8 @@ recalculate_sizes(void)
 | 
			
		||||
			if (w->active == wp)
 | 
			
		||||
			       break;
 | 
			
		||||
		}
 | 
			
		||||
		if (w->active == w->last)
 | 
			
		||||
			w->last = NULL;
 | 
			
		||||
 | 
			
		||||
		server_redraw_window(w);
 | 
			
		||||
		notify_window("window-layout-changed", w);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2162,7 +2162,6 @@ int		 window_pane_set_mode(struct window_pane *,
 | 
			
		||||
void		 window_pane_reset_mode(struct window_pane *);
 | 
			
		||||
void		 window_pane_key(struct window_pane *, struct client *,
 | 
			
		||||
		     struct session *, key_code, struct mouse_event *);
 | 
			
		||||
int		 window_pane_outside(struct window_pane *);
 | 
			
		||||
int		 window_pane_visible(struct window_pane *);
 | 
			
		||||
u_int		 window_pane_search(struct window_pane *, const char *);
 | 
			
		||||
const char	*window_printable_flags(struct winlink *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								window.c
									
									
									
									
									
								
							@@ -634,6 +634,8 @@ window_add_pane(struct window *w, struct window_pane *other, int before,
 | 
			
		||||
void
 | 
			
		||||
window_lost_pane(struct window *w, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	log_debug("%s: @%u pane %%%u", __func__, w->id, wp->id);
 | 
			
		||||
 | 
			
		||||
	if (wp == marked_pane.wp)
 | 
			
		||||
		server_clear_marked();
 | 
			
		||||
 | 
			
		||||
@@ -1279,23 +1281,18 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_pane_outside(struct window_pane *wp)
 | 
			
		||||
window_pane_visible(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window	*w = wp->window;
 | 
			
		||||
 | 
			
		||||
	if (wp->xoff >= w->sx || wp->yoff >= w->sy)
 | 
			
		||||
		return (1);
 | 
			
		||||
	if (wp->xoff + wp->sx > w->sx || wp->yoff + wp->sy > w->sy)
 | 
			
		||||
		return (1);
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
window_pane_visible(struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	if (wp->layout_cell == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (!window_pane_outside(wp));
 | 
			
		||||
 | 
			
		||||
	if (wp->xoff >= w->sx || wp->yoff >= w->sy)
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (wp->xoff + wp->sx > w->sx || wp->yoff + wp->sy > w->sy)
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u_int
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user