# HG changeset patch # User Bram Moolenaar # Date 1626884105 -7200 # Node ID 7a254d0705e249cb063535e4a51ab424e8786b9d # Parent 0eb4d41d54951c031b8b7b013348bb8a291c2bb3 patch 8.2.3193: screenpos() is wrong when 'display' is "lastline" Commit: https://github.com/vim/vim/commit/189663bdac1156237c49925f77bd197c1bdea12c Author: Bram Moolenaar Date: Wed Jul 21 18:04:56 2021 +0200 patch 8.2.3193: screenpos() is wrong when 'display' is "lastline" Problem: screenpos() is wrong when the last line is partially visible and 'display' is "lastline". Solution: Also compute the position for a partially visible line. (closes #8599) diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -1229,7 +1229,7 @@ textpos2screenpos( int rowoff = 0; colnr_T coloff = 0; - if (pos->lnum >= wp->w_topline && pos->lnum < wp->w_botline) + if (pos->lnum >= wp->w_topline && pos->lnum <= wp->w_botline) { colnr_T off; colnr_T col; @@ -1256,11 +1256,11 @@ textpos2screenpos( col -= wp->w_leftcol; if (col >= wp->w_width) col = -1; - if (col >= 0) + if (col >= 0 && row + rowoff <= wp->w_height) coloff = col - scol + wp->w_wincol + 1; else - // character is left or right of the window - row = scol = ccol = ecol = 0; + // character is left, right or below of the window + row = rowoff = scol = ccol = ecol = 0; } *rowp = W_WINROW(wp) + row + rowoff; *scolp = scol + coloff; diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -101,9 +101,25 @@ func Test_screenpos() \ 'col': wincol + 9, \ 'curscol': wincol + 9, \ 'endcol': wincol + 9}, screenpos(winid, 2, 22)) + + let wininfo = getwininfo(winid)[0] + call setline(3, ['x']->repeat(wininfo.height)) + call setline(line('$') + 1, 'x'->repeat(wininfo.width * 3)) + setlocal nonumber display=lastline so=0 + exe "normal G\\" + redraw + call assert_equal({'row': winrow + wininfo.height - 1, + \ 'col': wincol + 7, + \ 'curscol': wincol + 7, + \ 'endcol': wincol + 7}, winid->screenpos(line('$'), 8)) + call assert_equal({'row': winrow - 1, 'col': 0, 'curscol': 0, 'endcol': 0}, + \ winid->screenpos(line('$'), 22)) + close call assert_equal({}, screenpos(999, 1, 1)) + bwipe! + set display& call assert_equal({'col': 1, 'row': 1, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1)) nmenu WinBar.TEST : diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3193, +/**/ 3192, /**/ 3191,