]> granicus.if.org Git - vim/commitdiff
patch 9.0.0304: WinScrolled is not triggered when only skipcol changes v9.0.0304
authorzeertzjq <zeertzjq@outlook.com>
Sun, 28 Aug 2022 18:16:15 +0000 (19:16 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 28 Aug 2022 18:16:15 +0000 (19:16 +0100)
Problem:    WinScrolled is not triggered when only skipcol changes.
Solution:   Add w_last_skipcol and use it. (closes #10998)

src/autocmd.c
src/structs.h
src/testdir/test_autocmd.vim
src/version.c
src/window.c

index cc9d99d5377ca3b88a9b2d93f6b133c2f250c79d..2e3026217a8f13e4e16d2c2ba99d92c259f576a0 100644 (file)
@@ -1249,6 +1249,7 @@ do_autocmd_event(
                {
                    curwin->w_last_topline = curwin->w_topline;
                    curwin->w_last_leftcol = curwin->w_leftcol;
+                   curwin->w_last_skipcol = curwin->w_skipcol;
                    curwin->w_last_width = curwin->w_width;
                    curwin->w_last_height = curwin->w_height;
                }
index 091b886b2f6c2e4ba9e98f9f81d790614261ca3c..490a973d2bd9c25aee3321bfacec256412ed5502 100644 (file)
@@ -3542,9 +3542,10 @@ struct window_S
                                    // window
 #endif
 
-    // four fields that are only used when there is a WinScrolled autocommand
+    // five fields that are only used when there is a WinScrolled autocommand
     linenr_T   w_last_topline;     // last known value for w_topline
     colnr_T    w_last_leftcol;     // last known value for w_leftcol
+    colnr_T    w_last_skipcol;     // last known value for w_skipcol
     int                w_last_width;       // last known value for w_width
     int                w_last_height;      // last known value for w_height
 
index 189a2bc4642020f3688f7c597fd9a102915fc318..a400b1dab338166a77525c6f3408ec5b0ffc7df5 100644 (file)
@@ -419,6 +419,39 @@ func Test_WinScrolled_close_curwin()
   call delete('Xtestout')
 endfunc
 
+func Test_WinScrolled_long_wrapped()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    set scrolloff=0
+    let height = winheight(0)
+    let width = winwidth(0)
+    let g:scrolled = 0
+    au WinScrolled * let g:scrolled += 1
+    call setline(1, repeat('foo', height * width))
+    call cursor(1, height * width)
+  END
+  call writefile(lines, 'Xtest_winscrolled_long_wrapped')
+  let buf = RunVimInTerminal('-S Xtest_winscrolled_long_wrapped', {'rows': 6})
+
+  call term_sendkeys(buf, ":echo g:scrolled\<CR>")
+  call WaitForAssert({-> assert_match('^0 ', term_getline(buf, 6))}, 1000)
+
+  call term_sendkeys(buf, 'gj')
+  call term_sendkeys(buf, ":echo g:scrolled\<CR>")
+  call WaitForAssert({-> assert_match('^1 ', term_getline(buf, 6))}, 1000)
+
+  call term_sendkeys(buf, '0')
+  call term_sendkeys(buf, ":echo g:scrolled\<CR>")
+  call WaitForAssert({-> assert_match('^2 ', term_getline(buf, 6))}, 1000)
+
+  call term_sendkeys(buf, '$')
+  call term_sendkeys(buf, ":echo g:scrolled\<CR>")
+  call WaitForAssert({-> assert_match('^3 ', term_getline(buf, 6))}, 1000)
+
+  call delete('Xtest_winscrolled_long_wrapped')
+endfunc
+
 func Test_WinClosed()
   " Test that the pattern is matched against the closed window's ID, and both
   " <amatch> and <afile> are set to it.
index bdc26b3afee68314efe4ce181f7ae998dc562fdf..3e1c7d308c23a563ca881e2d4b0e3f7f8587e93a 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    304,
 /**/
     303,
 /**/
index 7c5c7ff69ccda1835418dc11b37eb6446fd03ced..9c4a199836d5876a9ed9f76a995334f967cfeb19 100644 (file)
@@ -2806,6 +2806,7 @@ may_trigger_winscrolled(void)
 
     if (wp->w_last_topline != wp->w_topline
            || wp->w_last_leftcol != wp->w_leftcol
+           || wp->w_last_skipcol != wp->w_skipcol
            || wp->w_last_width != wp->w_width
            || wp->w_last_height != wp->w_height)
     {
@@ -2820,6 +2821,7 @@ may_trigger_winscrolled(void)
        {
            wp->w_last_topline = wp->w_topline;
            wp->w_last_leftcol = wp->w_leftcol;
+           wp->w_last_skipcol = wp->w_skipcol;
            wp->w_last_width = wp->w_width;
            wp->w_last_height = wp->w_height;
        }