mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +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 %. */
 | 
						/* Check for pane ids starting with %. */
 | 
				
			||||||
	if (*pane == '%') {
 | 
						if (*pane == '%') {
 | 
				
			||||||
		fs->wp = window_pane_find_by_id_str(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);
 | 
								return (-1);
 | 
				
			||||||
		fs->w = fs->wp->window;
 | 
							fs->w = fs->wp->window;
 | 
				
			||||||
		return (cmd_find_best_session_with_window(fs));
 | 
							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 %. */
 | 
						/* Check for pane ids starting with %. */
 | 
				
			||||||
	if (*pane == '%') {
 | 
						if (*pane == '%') {
 | 
				
			||||||
		fs->wp = window_pane_find_by_id_str(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);
 | 
								return (-1);
 | 
				
			||||||
		fs->w = fs->wp->window;
 | 
							fs->w = fs->wp->window;
 | 
				
			||||||
		return (cmd_find_best_winlink_with_window(fs));
 | 
							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 %. */
 | 
						/* Check for pane ids starting with %. */
 | 
				
			||||||
	if (*pane == '%') {
 | 
						if (*pane == '%') {
 | 
				
			||||||
		fs->wp = window_pane_find_by_id_str(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);
 | 
								return (-1);
 | 
				
			||||||
		if (fs->wp->window != fs->w)
 | 
							if (fs->wp->window != fs->w)
 | 
				
			||||||
			return (-1);
 | 
								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)
 | 
							if (fs->w->last == NULL)
 | 
				
			||||||
			return (-1);
 | 
								return (-1);
 | 
				
			||||||
		fs->wp = fs->w->last;
 | 
							fs->wp = fs->w->last;
 | 
				
			||||||
		if (fs->wp == NULL || window_pane_outside(fs->wp))
 | 
							if (fs->wp == NULL)
 | 
				
			||||||
			return (-1);
 | 
								return (-1);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	} else if (strcmp(pane, "{up-of}") == 0) {
 | 
						} else if (strcmp(pane, "{up-of}") == 0) {
 | 
				
			||||||
		fs->wp = window_pane_find_up(fs->w->active);
 | 
							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 (-1);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	} else if (strcmp(pane, "{down-of}") == 0) {
 | 
						} else if (strcmp(pane, "{down-of}") == 0) {
 | 
				
			||||||
		fs->wp = window_pane_find_down(fs->w->active);
 | 
							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 (-1);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	} else if (strcmp(pane, "{left-of}") == 0) {
 | 
						} else if (strcmp(pane, "{left-of}") == 0) {
 | 
				
			||||||
		fs->wp = window_pane_find_left(fs->w->active);
 | 
							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 (-1);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	} else if (strcmp(pane, "{right-of}") == 0) {
 | 
						} else if (strcmp(pane, "{right-of}") == 0) {
 | 
				
			||||||
		fs->wp = window_pane_find_right(fs->w->active);
 | 
							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 (-1);
 | 
				
			||||||
		return (0);
 | 
							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);
 | 
								fs->wp = window_pane_next_by_number(fs->w, wp, n);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			fs->wp = window_pane_previous_by_number(fs->w, wp, n);
 | 
								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);
 | 
								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);
 | 
						idx = strtonum(pane, 0, INT_MAX, &errstr);
 | 
				
			||||||
	if (errstr == NULL) {
 | 
						if (errstr == NULL) {
 | 
				
			||||||
		fs->wp = window_pane_at_index(fs->w, idx);
 | 
							fs->wp = window_pane_at_index(fs->w, idx);
 | 
				
			||||||
		if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
							if (fs->wp != NULL)
 | 
				
			||||||
			return (0);
 | 
								return (0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Try as a description. */
 | 
						/* Try as a description. */
 | 
				
			||||||
	fs->wp = window_find_string(fs->w, pane);
 | 
						fs->wp = window_find_string(fs->w, pane);
 | 
				
			||||||
	if (fs->wp != NULL && !window_pane_outside(fs->wp))
 | 
						if (fs->wp != NULL)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (-1);
 | 
						return (-1);
 | 
				
			||||||
@@ -689,9 +689,7 @@ cmd_find_valid_state(struct cmd_find_state *fs)
 | 
				
			|||||||
	if (fs->w != fs->wl->window)
 | 
						if (fs->w != fs->wl->window)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!window_has_pane(fs->w, fs->wp))
 | 
						return (window_has_pane(fs->w, fs->wp));
 | 
				
			||||||
		return (0);
 | 
					 | 
				
			||||||
	return (!window_pane_outside(fs->wp));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Copy a state. */
 | 
					/* 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)
 | 
						if (cmd_find_from_window(fs, wp->window) != 0)
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	if (window_pane_outside(wp)) {
 | 
					 | 
				
			||||||
		cmd_find_clear_state(fs, 0);
 | 
					 | 
				
			||||||
		return (-1);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fs->wp = wp;
 | 
						fs->wp = wp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cmd_find_log_state(__func__, fs);
 | 
						cmd_find_log_state(__func__, fs);
 | 
				
			||||||
@@ -1016,7 +1010,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmdq_item *item,
 | 
				
			|||||||
		switch (type) {
 | 
							switch (type) {
 | 
				
			||||||
		case CMD_FIND_PANE:
 | 
							case CMD_FIND_PANE:
 | 
				
			||||||
			fs->wp = cmd_mouse_pane(m, &fs->s, &fs->wl);
 | 
								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;
 | 
									fs->w = fs->wl->window;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case CMD_FIND_WINDOW:
 | 
							case CMD_FIND_WINDOW:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								resize.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								resize.c
									
									
									
									
									
								
							@@ -159,6 +159,8 @@ recalculate_sizes(void)
 | 
				
			|||||||
			if (w->active == wp)
 | 
								if (w->active == wp)
 | 
				
			||||||
			       break;
 | 
								       break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (w->active == w->last)
 | 
				
			||||||
 | 
								w->last = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		server_redraw_window(w);
 | 
							server_redraw_window(w);
 | 
				
			||||||
		notify_window("window-layout-changed", 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_reset_mode(struct window_pane *);
 | 
				
			||||||
void		 window_pane_key(struct window_pane *, struct client *,
 | 
					void		 window_pane_key(struct window_pane *, struct client *,
 | 
				
			||||||
		     struct session *, key_code, struct mouse_event *);
 | 
							     struct session *, key_code, struct mouse_event *);
 | 
				
			||||||
int		 window_pane_outside(struct window_pane *);
 | 
					 | 
				
			||||||
int		 window_pane_visible(struct window_pane *);
 | 
					int		 window_pane_visible(struct window_pane *);
 | 
				
			||||||
u_int		 window_pane_search(struct window_pane *, const char *);
 | 
					u_int		 window_pane_search(struct window_pane *, const char *);
 | 
				
			||||||
const char	*window_printable_flags(struct winlink *);
 | 
					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
 | 
					void
 | 
				
			||||||
window_lost_pane(struct window *w, struct window_pane *wp)
 | 
					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)
 | 
						if (wp == marked_pane.wp)
 | 
				
			||||||
		server_clear_marked();
 | 
							server_clear_marked();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1279,23 +1281,18 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
window_pane_outside(struct window_pane *wp)
 | 
					window_pane_visible(struct window_pane *wp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct window	*w = wp->window;
 | 
						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)
 | 
						if (wp->layout_cell == NULL)
 | 
				
			||||||
		return (0);
 | 
							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
 | 
					u_int
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user