mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +00:00 
			
		
		
		
	When swapping pane positions, swap the PANE_HIDDEN flag as well, otherwise tmux
crashes when trying to find the new active pane. While here, nuke an unused pane flag. Fixes PR 6160, reported by and a slightly different version of diff tested by ralf.horstmann at gmx.de.
This commit is contained in:
		@@ -60,6 +60,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct window_pane	*wp, *wp2;
 | 
			
		||||
	u_int			 sx, sy, xoff, yoff;
 | 
			
		||||
	int			 flags;
 | 
			
		||||
 | 
			
		||||
	if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
 | 
			
		||||
		return (-1);
 | 
			
		||||
@@ -72,13 +73,18 @@ cmd_rotate_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
 | 
			
		||||
		xoff = wp->xoff; yoff = wp->yoff;
 | 
			
		||||
		sx = wp->sx; sy = wp->sy;	
 | 
			
		||||
		flags = w->flags;
 | 
			
		||||
		TAILQ_FOREACH(wp, &w->panes, entry) {
 | 
			
		||||
			if ((wp2 = TAILQ_NEXT(wp, entry)) == NULL)
 | 
			
		||||
				break;
 | 
			
		||||
			wp->xoff = wp2->xoff; wp->yoff = wp2->yoff;
 | 
			
		||||
			wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
			wp->flags |= wp2->flags & PANE_HIDDEN;
 | 
			
		||||
			window_pane_resize(wp, wp2->sx, wp2->sy);
 | 
			
		||||
		}
 | 
			
		||||
		wp->xoff = xoff; wp->yoff = yoff;
 | 
			
		||||
		wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
		wp->flags |= flags & PANE_HIDDEN;
 | 
			
		||||
		window_pane_resize(wp, sx, sy);
 | 
			
		||||
 | 
			
		||||
		if ((wp = TAILQ_PREV(w->active, window_panes, entry)) == NULL)
 | 
			
		||||
@@ -91,13 +97,18 @@ cmd_rotate_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
 | 
			
		||||
		xoff = wp->xoff; yoff = wp->yoff;
 | 
			
		||||
		sx = wp->sx; sy = wp->sy;
 | 
			
		||||
		flags = w->flags;
 | 
			
		||||
		TAILQ_FOREACH_REVERSE(wp, &w->panes, window_panes, entry) {
 | 
			
		||||
			if ((wp2 = TAILQ_PREV(wp, window_panes, entry)) == NULL)
 | 
			
		||||
				break;
 | 
			
		||||
			wp->xoff = wp2->xoff; wp->yoff = wp2->yoff;
 | 
			
		||||
			wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
			wp->flags |= wp2->flags & PANE_HIDDEN;
 | 
			
		||||
			window_pane_resize(wp, wp2->sx, wp2->sy);
 | 
			
		||||
		}
 | 
			
		||||
		wp->xoff = xoff; wp->yoff = yoff;
 | 
			
		||||
		wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
		wp->flags |= flags & PANE_HIDDEN;
 | 
			
		||||
		window_pane_resize(wp, sx, sy);
 | 
			
		||||
 | 
			
		||||
		if ((wp = TAILQ_NEXT(w->active, entry)) == NULL)
 | 
			
		||||
 
 | 
			
		||||
@@ -158,6 +158,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	struct window			*w;
 | 
			
		||||
	struct window_pane		*tmp_wp, *src_wp, *dst_wp;
 | 
			
		||||
	u_int				 xx, yy;
 | 
			
		||||
	int				 flags;
 | 
			
		||||
 | 
			
		||||
	if (data == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
@@ -209,10 +210,15 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
 | 
			
		||||
	xx = src_wp->xoff;
 | 
			
		||||
	yy = src_wp->yoff;
 | 
			
		||||
	flags = src_wp->flags;
 | 
			
		||||
 	src_wp->xoff = dst_wp->xoff;
 | 
			
		||||
 	src_wp->yoff = dst_wp->yoff;
 | 
			
		||||
	src_wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
	src_wp->flags |= dst_wp->flags & PANE_HIDDEN;
 | 
			
		||||
 	dst_wp->xoff = xx;
 | 
			
		||||
 	dst_wp->yoff = yy;
 | 
			
		||||
	dst_wp->flags &= ~PANE_HIDDEN;
 | 
			
		||||
	dst_wp->flags |= flags & PANE_HIDDEN;
 | 
			
		||||
 | 
			
		||||
	xx = src_wp->sx;
 | 
			
		||||
	yy = src_wp->sy;
 | 
			
		||||
@@ -220,7 +226,10 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	window_pane_resize(dst_wp, xx, yy);
 | 
			
		||||
 | 
			
		||||
	if (!data->flag_detached) {
 | 
			
		||||
		window_set_active_pane(w, dst_wp);
 | 
			
		||||
		tmp_wp = dst_wp;
 | 
			
		||||
		if (tmp_wp->flags & PANE_HIDDEN)
 | 
			
		||||
			tmp_wp = src_wp;
 | 
			
		||||
		window_set_active_pane(w, tmp_wp);
 | 
			
		||||
		layout_refresh(w, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user