1
0
forked from aniani/vim

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)
This commit is contained in:
zeertzjq
2023-06-04 19:29:22 +01:00
committed by Bram Moolenaar
parent 58e1e01045
commit 55daae3921
3 changed files with 23 additions and 4 deletions

View File

@@ -344,7 +344,8 @@ update_topline(void)
check_topline = TRUE; check_topline = TRUE;
else if (check_top_offset()) else if (check_top_offset())
check_topline = TRUE; 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; colnr_T vcol;
@@ -1459,7 +1460,8 @@ textpos2screenpos(
#ifdef FEAT_DIFF #ifdef FEAT_DIFF
// Add filler lines above this buffer line. // 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 #endif
colnr_T off = win_col_off(wp); colnr_T off = win_col_off(wp);
@@ -1479,7 +1481,7 @@ textpos2screenpos(
col += off; col += off;
width = wp->w_width - off + win_col_off2(wp); width = wp->w_width - off + win_col_off2(wp);
if (pos->lnum == wp->w_topline) if (lnum == wp->w_topline)
col -= wp->w_skipcol; col -= wp->w_skipcol;
// long line wrapping, adjust row // 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 if (curwin->w_topline == prev_topline
|| curwin->w_skipcol != prev_skipcol) || curwin->w_skipcol != prev_skipcol)
// need to redraw because wl_size of the topline may now be invalid // need to redraw because wl_size of the topline may now be invalid

View File

@@ -132,13 +132,14 @@ func Test_screenpos()
1split 1split
normal G$ normal G$
redraw redraw
" w_skipcol should be subtracted
call assert_equal({'row': winrow + 0, call assert_equal({'row': winrow + 0,
\ 'col': wincol + 20 - 1, \ 'col': wincol + 20 - 1,
\ 'curscol': wincol + 20 - 1, \ 'curscol': wincol + 20 - 1,
\ 'endcol': wincol + 20 - 1}, \ 'endcol': wincol + 20 - 1},
\ screenpos(win_getid(), line('.'), col('.'))) \ screenpos(win_getid(), line('.'), col('.')))
" w_skipcol should be subtracted " w_leftcol should be subtracted
setlocal nowrap setlocal nowrap
normal 050zl$ normal 050zl$
call assert_equal({'row': winrow + 0, call assert_equal({'row': winrow + 0,
@@ -203,6 +204,19 @@ func Test_screenpos_diff()
windo diffthis windo diffthis
wincmd w wincmd w
call assert_equal(#{col: 3, row: 7, endcol: 3, curscol: 3}, screenpos(0, 4, 1)) 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 windo diffoff
bwipe! bwipe!

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1607,
/**/ /**/
1606, 1606,
/**/ /**/