mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	When moving up or down in copy mode, save the cursor position and size of the
last line with content (width != 0) and use it to determine if the cursor should be at the end of the line. Fixes problem of the cursor always jumping to the end of the line when scrolling past a blank line.
This commit is contained in:
		@@ -97,6 +97,9 @@ struct window_copy_mode_data {
 | 
			
		||||
	u_int		cx;
 | 
			
		||||
	u_int		cy;
 | 
			
		||||
 | 
			
		||||
	u_int		lastcx; /* position in last line with content */
 | 
			
		||||
	u_int		lastsx; /* size of last line with content */
 | 
			
		||||
 | 
			
		||||
	enum window_copy_input_type inputtype;
 | 
			
		||||
	const char     *inputprompt;
 | 
			
		||||
	char   	       *inputstr;
 | 
			
		||||
@@ -119,6 +122,9 @@ window_copy_init(struct window_pane *wp)
 | 
			
		||||
	data->cx = wp->base.cx;
 | 
			
		||||
	data->cy = wp->base.cy;
 | 
			
		||||
 | 
			
		||||
	data->lastcx = 0;
 | 
			
		||||
	data->lastsx = 0;
 | 
			
		||||
 | 
			
		||||
	data->inputtype = WINDOW_COPY_OFF;
 | 
			
		||||
	data->inputprompt = NULL;
 | 
			
		||||
	data->inputstr = xstrdup("");
 | 
			
		||||
@@ -1045,7 +1051,12 @@ window_copy_cursor_up(struct window_pane *wp)
 | 
			
		||||
 | 
			
		||||
	oy = screen_hsize(&wp->base) + data->cy - data->oy;
 | 
			
		||||
	ox = window_copy_find_length(wp, oy);
 | 
			
		||||
	if (ox != 0) {
 | 
			
		||||
		data->lastcx = data->cx;
 | 
			
		||||
		data->lastsx = ox;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data->cx = data->lastcx;
 | 
			
		||||
	if (data->cy == 0)
 | 
			
		||||
		window_copy_scroll_down(wp, 1);
 | 
			
		||||
	else {
 | 
			
		||||
@@ -1056,8 +1067,7 @@ window_copy_cursor_up(struct window_pane *wp)
 | 
			
		||||
 | 
			
		||||
	py = screen_hsize(&wp->base) + data->cy - data->oy;
 | 
			
		||||
	px = window_copy_find_length(wp, py);
 | 
			
		||||
 | 
			
		||||
	if (data->cx >= px || data->cx >= ox)
 | 
			
		||||
	if (data->cx >= data->lastsx || data->cx > px)
 | 
			
		||||
		window_copy_cursor_end_of_line(wp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1070,7 +1080,12 @@ window_copy_cursor_down(struct window_pane *wp)
 | 
			
		||||
 | 
			
		||||
	oy = screen_hsize(&wp->base) + data->cy - data->oy;
 | 
			
		||||
	ox = window_copy_find_length(wp, oy);
 | 
			
		||||
	if (ox != 0) {
 | 
			
		||||
		data->lastcx = data->cx;
 | 
			
		||||
		data->lastsx = ox;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data->cx = data->lastcx;
 | 
			
		||||
	if (data->cy == screen_size_y(s) - 1)
 | 
			
		||||
		window_copy_scroll_up(wp, 1);
 | 
			
		||||
	else {
 | 
			
		||||
@@ -1081,8 +1096,7 @@ window_copy_cursor_down(struct window_pane *wp)
 | 
			
		||||
 | 
			
		||||
	py = screen_hsize(&wp->base) + data->cy - data->oy;
 | 
			
		||||
	px = window_copy_find_length(wp, py);
 | 
			
		||||
 | 
			
		||||
	if (data->cx >= px || data->cx >= ox)
 | 
			
		||||
	if (data->cx >= data->lastsx || data->cx > px)
 | 
			
		||||
		window_copy_cursor_end_of_line(wp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user