changeset 32551:745f1e43106f v9.0.1607

patch 9.0.1607: screenpos() returns wrong row with diff filler lines Commit: https://github.com/vim/vim/commit/55daae392157823dc5434e6be1344f4336bfe96f Author: zeertzjq <zeertzjq@outlook.com> Date: Sun Jun 4 19:29:22 2023 +0100 patch 9.0.1607: screenpos() returns wrong row with diff filler lines Problem: screenpos() returns wrong row with diff filler lines. Solution: Only add filler lines when appropriate. Also don't add the 'smoothscroll' marker when w_skipcol is zero. (closes #12485, closes #12484)
author Bram Moolenaar <Bram@vim.org>
date Sun, 04 Jun 2023 20:30:04 +0200
parents 0bd6f91ccbba
children 0632ef23eb80
files src/move.c src/testdir/test_cursor_func.vim src/version.c
diffstat 3 files changed, 23 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/move.c
+++ b/src/move.c
@@ -344,7 +344,8 @@ update_topline(void)
 		check_topline = TRUE;
 	    else if (check_top_offset())
 		check_topline = TRUE;
-	    else if (curwin->w_cursor.lnum == curwin->w_topline)
+	    else if (curwin->w_skipcol > 0
+				 && curwin->w_cursor.lnum == curwin->w_topline)
 	    {
 		colnr_T vcol;
 
@@ -1459,7 +1460,8 @@ textpos2screenpos(
 
 #ifdef FEAT_DIFF
 	// Add filler lines above this buffer line.
-	row += diff_check_fill(wp, lnum);
+	row += lnum == wp->w_topline ? wp->w_topfill
+				     : diff_check_fill(wp, lnum);
 #endif
 
 	colnr_T	off = win_col_off(wp);
@@ -1479,7 +1481,7 @@ textpos2screenpos(
 	    col += off;
 	    width = wp->w_width - off + win_col_off2(wp);
 
-	    if (pos->lnum == wp->w_topline)
+	    if (lnum == wp->w_topline)
 		col -= wp->w_skipcol;
 
 	    // long line wrapping, adjust row
@@ -1848,6 +1850,7 @@ scrollup(
 	    }
 	}
 
+	// TODO: is comparing w_topline with prev_topline still needed?
 	if (curwin->w_topline == prev_topline
 		|| curwin->w_skipcol != prev_skipcol)
 	    // need to redraw because wl_size of the topline may now be invalid
--- a/src/testdir/test_cursor_func.vim
+++ b/src/testdir/test_cursor_func.vim
@@ -132,13 +132,14 @@ func Test_screenpos()
   1split
   normal G$
   redraw
+  " w_skipcol should be subtracted
   call assert_equal({'row': winrow + 0,
 	\ 'col': wincol + 20 - 1,
 	\ 'curscol': wincol + 20 - 1,
 	\ 'endcol': wincol + 20 - 1},
 	\ screenpos(win_getid(), line('.'), col('.')))
 
-  " w_skipcol should be subtracted
+  " w_leftcol should be subtracted
   setlocal nowrap
   normal 050zl$
   call assert_equal({'row': winrow + 0,
@@ -203,6 +204,19 @@ func Test_screenpos_diff()
   windo diffthis
   wincmd w
   call assert_equal(#{col: 3, row: 7, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
+  call assert_equal(#{col: 3, row: 8, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
+  exe "normal! 3\<C-E>"
+  call assert_equal(#{col: 3, row: 4, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
+  call assert_equal(#{col: 3, row: 5, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
+  exe "normal! \<C-E>"
+  call assert_equal(#{col: 3, row: 3, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
+  call assert_equal(#{col: 3, row: 4, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
+  exe "normal! \<C-E>"
+  call assert_equal(#{col: 3, row: 2, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
+  call assert_equal(#{col: 3, row: 3, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
+  exe "normal! \<C-E>"
+  call assert_equal(#{col: 3, row: 1, endcol: 3, curscol: 3}, screenpos(0, 4, 1))
+  call assert_equal(#{col: 3, row: 2, endcol: 3, curscol: 3}, screenpos(0, 5, 1))
 
   windo diffoff
   bwipe!
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1607,
+/**/
     1606,
 /**/
     1605,