mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		
							
								
								
									
										30
									
								
								cmd-find.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								cmd-find.c
									
									
									
									
									
								
							| @@ -657,7 +657,7 @@ cmd_find_get_pane(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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			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)); | ||||||
| @@ -694,7 +694,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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			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)); | ||||||
| @@ -726,7 +726,9 @@ 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 || fs->wp->window != fs->w) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
|  | 			return (-1); | ||||||
|  | 		if (fs->wp->window != fs->w) | ||||||
| 			return (-1); | 			return (-1); | ||||||
| 		return (0); | 		return (0); | ||||||
| 	} | 	} | ||||||
| @@ -736,25 +738,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)) | ||||||
|  | 			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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			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) | 		if (fs->wp == NULL || window_pane_outside(fs->wp)) | ||||||
| 			return (-1); | 			return (-1); | ||||||
| 		return (0); | 		return (0); | ||||||
| 	} | 	} | ||||||
| @@ -770,7 +774,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) | 		if (fs->wp != NULL && !window_pane_outside(fs->wp)) | ||||||
| 			return (0); | 			return (0); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -778,13 +782,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) | 		if (fs->wp != NULL && !window_pane_outside(fs->wp)) | ||||||
| 			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) | 	if (fs->wp != NULL && !window_pane_outside(fs->wp)) | ||||||
| 		return (0); | 		return (0); | ||||||
|  |  | ||||||
| 	return (-1); | 	return (-1); | ||||||
| @@ -836,7 +840,7 @@ cmd_find_valid_state(struct cmd_find_state *fs) | |||||||
|  |  | ||||||
| 	if (!window_has_pane(fs->w, fs->wp)) | 	if (!window_has_pane(fs->w, fs->wp)) | ||||||
| 		return (0); | 		return (0); | ||||||
| 	return (window_pane_visible(fs->wp)); | 	return (!window_pane_outside(fs->wp)); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Copy a state. */ | /* Copy a state. */ | ||||||
| @@ -944,6 +948,8 @@ 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)) | ||||||
|  | 		return (-1); | ||||||
| 	fs->wp = wp; | 	fs->wp = wp; | ||||||
|  |  | ||||||
| 	cmd_find_log_state(__func__, fs); | 	cmd_find_log_state(__func__, fs); | ||||||
| @@ -1011,7 +1017,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_find_state *current, | |||||||
| 		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) | 			if (fs->wp != NULL && !window_pane_outside(fs->wp)) | ||||||
| 				fs->w = fs->wl->window; | 				fs->w = fs->wl->window; | ||||||
| 			break; | 			break; | ||||||
| 		case CMD_FIND_WINDOW: | 		case CMD_FIND_WINDOW: | ||||||
|   | |||||||
| @@ -63,7 +63,6 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) | |||||||
| 	const char		*style; | 	const char		*style; | ||||||
|  |  | ||||||
| 	if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) { | 	if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) { | ||||||
|  |  | ||||||
| 		if (wl->window->last == NULL) { | 		if (wl->window->last == NULL) { | ||||||
| 			cmdq_error(item, "no last pane"); | 			cmdq_error(item, "no last pane"); | ||||||
| 			return (CMD_RETURN_ERROR); | 			return (CMD_RETURN_ERROR); | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -2128,6 +2128,7 @@ 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 *); | ||||||
| char		*window_pane_search(struct window_pane *, const char *, | char		*window_pane_search(struct window_pane *, const char *, | ||||||
| 		     u_int *); | 		     u_int *); | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								window.c
									
									
									
									
									
								
							| @@ -1200,17 +1200,23 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s, | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| window_pane_visible(struct window_pane *wp) | window_pane_outside(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); | ||||||
| 	if (wp->xoff >= w->sx || wp->yoff >= w->sy) | 	return (!window_pane_outside(wp)); | ||||||
| 		return (0); |  | ||||||
| 	if (wp->xoff + wp->sx > w->sx || wp->yoff + wp->sy > w->sy) |  | ||||||
| 		return (0); |  | ||||||
| 	return (1); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| char * | char * | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thomas Adam
					Thomas Adam