mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Store and restore cursor position when copy mode is resized, from
Anindya Mukherjee.
This commit is contained in:
		@@ -306,8 +306,9 @@ window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx,
 | 
			
		||||
    u_int *cy, int trim)
 | 
			
		||||
{
 | 
			
		||||
	struct screen		*dst;
 | 
			
		||||
	u_int			 sy;
 | 
			
		||||
	const struct grid_line	*gl;
 | 
			
		||||
	u_int			 sy, wx, wy;
 | 
			
		||||
	int			 reflow;
 | 
			
		||||
 | 
			
		||||
	dst = xcalloc(1, sizeof *dst);
 | 
			
		||||
 | 
			
		||||
@@ -324,6 +325,12 @@ window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx,
 | 
			
		||||
	    screen_size_x(src), sy, screen_size_x(hint),
 | 
			
		||||
	    screen_hsize(src) + screen_size_y(src));
 | 
			
		||||
	screen_init(dst, screen_size_x(src), sy, screen_hlimit(src));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Ensure history is on for the backing grid so lines are not deleted
 | 
			
		||||
	 * during resizing.
 | 
			
		||||
	 */
 | 
			
		||||
	dst->grid->flags |= GRID_HISTORY;
 | 
			
		||||
	grid_duplicate_lines(dst->grid, 0, src->grid, 0, sy);
 | 
			
		||||
 | 
			
		||||
	dst->grid->sy = sy - screen_hsize(src);
 | 
			
		||||
@@ -337,8 +344,19 @@ window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx,
 | 
			
		||||
		dst->cy = src->cy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (cx != NULL && cy != NULL) {
 | 
			
		||||
		*cx = dst->cx;
 | 
			
		||||
		*cy = screen_hsize(dst) + dst->cy;
 | 
			
		||||
		reflow = (screen_size_x(hint) != screen_size_x(dst));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		reflow = 0;
 | 
			
		||||
	if (reflow)
 | 
			
		||||
		grid_wrap_position(dst->grid, *cx, *cy, &wx, &wy);
 | 
			
		||||
	screen_resize_cursor(dst, screen_size_x(hint), screen_size_y(hint), 1,
 | 
			
		||||
	    0, cx, cy);
 | 
			
		||||
	    0, 0);
 | 
			
		||||
	if (reflow)
 | 
			
		||||
		grid_unwrap_position(dst->grid, cx, cy, wx, wy);
 | 
			
		||||
 | 
			
		||||
	return (dst);
 | 
			
		||||
}
 | 
			
		||||
@@ -392,13 +410,12 @@ window_copy_init(struct window_mode_entry *wme,
 | 
			
		||||
	data->backing = window_copy_clone_screen(base, &data->screen, &cx, &cy,
 | 
			
		||||
	    wme->swp != wme->wp);
 | 
			
		||||
 | 
			
		||||
	data->cx = cx;
 | 
			
		||||
	if (cy < screen_hsize(data->backing)) {
 | 
			
		||||
		data->cx = cx;
 | 
			
		||||
		data->cy = 0;
 | 
			
		||||
		data->oy = screen_hsize(data->backing) - cy;
 | 
			
		||||
	} else {
 | 
			
		||||
		data->cx = data->backing->cx;
 | 
			
		||||
		data->cy = data->backing->cy;
 | 
			
		||||
		data->cy = cy - screen_hsize(data->backing);
 | 
			
		||||
		data->oy = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -731,16 +748,28 @@ window_copy_resize(struct window_mode_entry *wme, u_int sx, u_int sy)
 | 
			
		||||
{
 | 
			
		||||
	struct window_copy_mode_data	*data = wme->data;
 | 
			
		||||
	struct screen			*s = &data->screen;
 | 
			
		||||
	struct grid			*gd = data->backing->grid;
 | 
			
		||||
	u_int				 cx, cy, wx, wy;
 | 
			
		||||
	int				 reflow;
 | 
			
		||||
 | 
			
		||||
	screen_resize(s, sx, sy, 0);
 | 
			
		||||
	screen_resize_cursor(data->backing, sx, sy, 1, 0, NULL, NULL);
 | 
			
		||||
	cx = data->cx;
 | 
			
		||||
	cy = gd->hsize + data->cy - data->oy;
 | 
			
		||||
	reflow = (gd->sx != sx);
 | 
			
		||||
	if (reflow)
 | 
			
		||||
		grid_wrap_position(gd, cx, cy, &wx, &wy);
 | 
			
		||||
	screen_resize_cursor(data->backing, sx, sy, 1, 0, 0);
 | 
			
		||||
	if (reflow)
 | 
			
		||||
		grid_unwrap_position(gd, &cx, &cy, wx, wy);
 | 
			
		||||
 | 
			
		||||
	if (data->cy > sy - 1)
 | 
			
		||||
		data->cy = sy - 1;
 | 
			
		||||
	if (data->cx > sx)
 | 
			
		||||
		data->cx = sx;
 | 
			
		||||
	if (data->oy > screen_hsize(data->backing))
 | 
			
		||||
		data->oy = screen_hsize(data->backing);
 | 
			
		||||
	data->cx = cx;
 | 
			
		||||
	if (cy < gd->hsize) {
 | 
			
		||||
		data->cy = 0;
 | 
			
		||||
		data->oy = gd->hsize - cy;
 | 
			
		||||
	} else {
 | 
			
		||||
		data->cy = cy - gd->hsize;
 | 
			
		||||
		data->oy = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	window_copy_size_changed(wme);
 | 
			
		||||
	window_copy_redraw_screen(wme);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user