]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3193: screenpos() is wrong when 'display' is "lastline" v8.2.3193
authorBram Moolenaar <Bram@vim.org>
Wed, 21 Jul 2021 16:04:56 +0000 (18:04 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 21 Jul 2021 16:04:56 +0000 (18:04 +0200)
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)

src/move.c
src/testdir/test_cursor_func.vim
src/version.c

index ed220f76cea310648b8bd734bad19475cf34e964..21e2a5d4660876342e5cebe595ef6f516134f25c 100644 (file)
@@ -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;
index bded15e36a361f403f2eb4e5e2d482d75659997f..b943059162d8020b7eea36fcd9461e052665a17f 100644 (file)
@@ -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 :
index cd2069353b65dc011ae15180dc844ff5eb322367..9533c88f71d8c5461dd7703b515ed9a58d9a4a3e 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3193,
 /**/
     3192,
 /**/