mirror of
				https://github.com/vim/vim.git
				synced 2025-10-29 09:37:35 -04:00 
			
		
		
		
	patch 9.0.1919: Wrong curswant when clicking on empty line or with vsplits
Problem:  Wrong curswant when clicking on empty line or with vsplits.
Solution: Don't check for ScreenCols[] before the start of the window
          and handle empty line properly.
closes: #13132
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							5790a54166
						
					
				
				
					commit
					03cd697d63
				
			| @@ -2101,11 +2101,11 @@ retnomove: | ||||
|     if (col_from_screen == MAXCOL) | ||||
|     { | ||||
| 	// When clicking after end of line, still need to set correct curswant | ||||
| 	int off_l = LineOffset[prev_row]; | ||||
| 	int off_l = LineOffset[prev_row] + curwin->w_wincol; | ||||
| 	if (ScreenCols[off_l] < MAXCOL) | ||||
| 	{ | ||||
| 	    // Binary search to find last char in line | ||||
| 	    int off_r = off_l + prev_col; | ||||
| 	    int off_r = LineOffset[prev_row] + prev_col; | ||||
| 	    int off_click = off_r; | ||||
| 	    while (off_l < off_r) | ||||
| 	    { | ||||
| @@ -2118,8 +2118,8 @@ retnomove: | ||||
| 	    col = ScreenCols[off_r] + (off_click - off_r); | ||||
| 	} | ||||
| 	else | ||||
| 	    // Shouldn't normally happen | ||||
| 	    col = MAXCOL; | ||||
| 	    // Clicking on an empty line | ||||
| 	    col = prev_col - curwin->w_wincol; | ||||
|     } | ||||
|     else if (col_from_screen >= 0) | ||||
|     { | ||||
|   | ||||
| @@ -4104,6 +4104,39 @@ func Test_normal_click_on_double_width_char() | ||||
|   let &mouse = save_mouse | ||||
| endfunc | ||||
|  | ||||
| func Test_normal_click_on_empty_line() | ||||
|   let save_mouse = &mouse | ||||
|   set mouse=a | ||||
|   botright new | ||||
|   call setline(1, ['', '', '']) | ||||
|   let row = win_screenpos(0)[0] + 2 | ||||
|   20vsplit | ||||
|   redraw | ||||
|  | ||||
|   call test_setmouse(row, 1) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 1], getcurpos()) | ||||
|   call test_setmouse(row, 2) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 2], getcurpos()) | ||||
|   call test_setmouse(row, 10) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 10], getcurpos()) | ||||
|  | ||||
|   call test_setmouse(row, 21 + 1) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 1], getcurpos()) | ||||
|   call test_setmouse(row, 21 + 2) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 2], getcurpos()) | ||||
|   call test_setmouse(row, 21 + 10) | ||||
|   call feedkeys("\<LeftMouse>", 'xt') | ||||
|   call assert_equal([0, 3, 1, 0, 10], getcurpos()) | ||||
|  | ||||
|   bwipe! | ||||
|   let &mouse = save_mouse | ||||
| endfunc | ||||
|  | ||||
| func Test_normal33_g_cmd_nonblank() | ||||
|   " Test that g<End> goes to the last non-blank char and g$ to the last | ||||
|   " visible column | ||||
|   | ||||
| @@ -564,35 +564,38 @@ func Test_virtualedit_mouse() | ||||
|   let save_mouse = &mouse | ||||
|   set mouse=a | ||||
|   set virtualedit=all | ||||
|   new | ||||
|   botright new | ||||
|   let row = win_screenpos(0)[0] | ||||
|   20vsplit | ||||
|   wincmd p | ||||
|  | ||||
|   call setline(1, ["text\tword"]) | ||||
|   redraw | ||||
|   call test_setmouse(1, 4) | ||||
|   call test_setmouse(row, 21 + 4) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 4, 0, 4], getcurpos()) | ||||
|   call test_setmouse(1, 5) | ||||
|   call test_setmouse(row, 21 + 5) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 5, 0, 5], getcurpos()) | ||||
|   call test_setmouse(1, 6) | ||||
|   call test_setmouse(row, 21 + 6) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 5, 1, 6], getcurpos()) | ||||
|   call test_setmouse(1, 7) | ||||
|   call test_setmouse(row, 21 + 7) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 5, 2, 7], getcurpos()) | ||||
|   call test_setmouse(1, 8) | ||||
|   call test_setmouse(row, 21 + 8) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 5, 3, 8], getcurpos()) | ||||
|   call test_setmouse(1, 9) | ||||
|   call test_setmouse(row, 21 + 9) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 6, 0, 9], getcurpos()) | ||||
|   call test_setmouse(1, 12) | ||||
|   call test_setmouse(row, 21 + 12) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 9, 0, 12], getcurpos()) | ||||
|   call test_setmouse(1, 13) | ||||
|   call test_setmouse(row, 21 + 13) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 10, 0, 13], getcurpos()) | ||||
|   call test_setmouse(1, 15) | ||||
|   call test_setmouse(row, 21 + 15) | ||||
|   call feedkeys("\<LeftMouse>", "xt") | ||||
|   call assert_equal([0, 1, 10, 2, 15], getcurpos()) | ||||
|  | ||||
|   | ||||
| @@ -699,6 +699,8 @@ static char *(features[]) = | ||||
|  | ||||
| static int included_patches[] = | ||||
| {   /* Add new patch number below this line */ | ||||
| /**/ | ||||
|     1919, | ||||
| /**/ | ||||
|     1918, | ||||
| /**/ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user