summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-07-21 18:04:56 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-21 18:04:56 +0200
commit189663bdac1156237c49925f77bd197c1bdea12c (patch)
tree3d8aae555cf828d371f727d182e64a6a38c9d763
parent11d7e62f1d29fdd7a88b86131b7bbb853f29fe8b (diff)
downloadvim-git-189663bdac1156237c49925f77bd197c1bdea12c.tar.gz
patch 8.2.3193: screenpos() is wrong when 'display' is "lastline"v8.2.3193
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)
-rw-r--r--src/move.c8
-rw-r--r--src/testdir/test_cursor_func.vim16
-rw-r--r--src/version.c2
3 files changed, 22 insertions, 4 deletions
diff --git a/src/move.c b/src/move.c
index ed220f76c..21e2a5d46 100644
--- 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
index bded15e36..b94305916 100644
--- 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\<C-Y>\<C-Y>"
+ 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
index cd2069353..9533c88f7 100644
--- 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,