]> granicus.if.org Git - vim/commitdiff
patch 9.0.1025: WinScrolled is not triggered when filler lines change v9.0.1025
authorzeertzjq <zeertzjq@outlook.com>
Wed, 7 Dec 2022 09:17:59 +0000 (09:17 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 7 Dec 2022 09:17:59 +0000 (09:17 +0000)
Problem:    WinScrolled is not triggered when filler lines change.
Solution:   Add "topfill" to the values that WinScrolled triggers on.
            (closes #11668)

runtime/doc/windows.txt
src/structs.h
src/testdir/test_autocmd.vim
src/version.c
src/window.c

index a6cb8b3b12b803e1752ce382898a2b6ab2a8717f..924a932507d1d0339ef8cd418a4dbeed5022663c 100644 (file)
@@ -657,9 +657,9 @@ The information provided by |WinScrolled| is a dictionary for each window that
 has changes, using the window ID as the key, and a total count of the changes
 with the key "all".  Example value for |v:event| (|Vim9| syntax):
        {
-          all: {width: 0, height: 2, leftcol: 0, topline: 1, skipcol: 0},
-          1003: {width: 0, height: -1, leftcol: 0, topline: 0, skipcol: 0},
-          1006: {width: 0, height: 1, leftcol: 0, topline: 1, skipcol: 0},
+          all: {width: 0, height: 2, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
+          1003: {width: 0, height: -1, leftcol: 0, skipcol: 0, topline: 0, topfill: 0},
+          1006: {width: 0, height: 1, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
        }
 
 Note that the "all" entry has the absolute values of the individual windows
index 824de455689a963a068fc955cd348b16e0f113a7..cefe6557fc58383cb7532910009fa17d0db1babe 100644 (file)
@@ -3618,6 +3618,9 @@ struct window_S
 
     // five fields that are only used when there is a WinScrolled autocommand
     linenr_T   w_last_topline;     // last known value for w_topline
+#ifdef FEAT_DIFF
+    linenr_T   w_last_topfill;     // last known value for w_topfill
+#endif
     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
index 2df70b4df7393b4b13ea72179e191d6293583719..8103382fbf19cc1fb60bdee43c57d5b1a55283f3 100644 (file)
@@ -393,8 +393,8 @@ func Test_WinScrolled()
 
   let event = readfile('XscrollEvent')[0]->json_decode()
   call assert_equal({
-        \ 'all': {'leftcol': 1, 'topline': 0, 'width': 0, 'height': 0, 'skipcol': 0},
-        \ '1000': {'leftcol': -1, 'topline': 0, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ 'all': {'leftcol': 1, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': -1, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
         \ }, event)
 
   " Scroll up/down in Normal mode.
@@ -403,8 +403,8 @@ func Test_WinScrolled()
 
   let event = readfile('XscrollEvent')[0]->json_decode()
   call assert_equal({
-        \ 'all': {'leftcol': 0, 'topline': 1, 'width': 0, 'height': 0, 'skipcol': 0},
-        \ '1000': {'leftcol': 0, 'topline': -1, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ 'all': {'leftcol': 0, 'topline': 1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': -1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
         \ }, event)
 
   " Scroll up/down in Insert mode.
@@ -414,8 +414,8 @@ func Test_WinScrolled()
 
   let event = readfile('XscrollEvent')[0]->json_decode()
   call assert_equal({
-        \ 'all': {'leftcol': 0, 'topline': 1, 'width': 0, 'height': 0, 'skipcol': 0},
-        \ '1000': {'leftcol': 0, 'topline': -1, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ 'all': {'leftcol': 0, 'topline': 1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': -1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
         \ }, event)
 
   " Scroll the window horizontally to focus the last letter of the third line
@@ -427,8 +427,8 @@ func Test_WinScrolled()
 
   let event = readfile('XscrollEvent')[0]->json_decode()
   call assert_equal({
-        \ 'all': {'leftcol': 5, 'topline': 0, 'width': 0, 'height': 0, 'skipcol': 0},
-        \ '1000': {'leftcol': -5, 'topline': 0, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ 'all': {'leftcol': 5, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': -5, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
         \ }, event)
 
   " Ensure the command was triggered for the specified window ID.
@@ -582,6 +582,66 @@ func Test_WinScrolled_long_wrapped()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_WinScrolled_diff()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    set diffopt+=foldcolumn:0
+    call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
+    vnew
+    call setline(1, ['d', 'e', 'f', 'g', 'h', 'i'])
+    windo diffthis
+    func WriteScrollEvent()
+      call writefile([json_encode(v:event)], 'XscrollEvent')
+    endfunc
+    au WinScrolled * call WriteScrollEvent()
+  END
+  call writefile(lines, 'Xtest_winscrolled_diff', 'D')
+  let buf = RunVimInTerminal('-S Xtest_winscrolled_diff', {'rows': 8})
+
+  call term_sendkeys(buf, "\<C-E>")
+  call WaitForAssert({-> assert_match('^d', term_getline(buf, 3))}, 1000)
+
+  let event = readfile('XscrollEvent')[0]->json_decode()
+  call assert_equal({
+        \ 'all': {'leftcol': 0, 'topline': 1, 'topfill': 1, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': 1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1001': {'leftcol': 0, 'topline': 0, 'topfill': -1, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ }, event)
+
+  call term_sendkeys(buf, "2\<C-E>")
+  call WaitForAssert({-> assert_match('^f', term_getline(buf, 3))}, 1000)
+
+  let event = readfile('XscrollEvent')[0]->json_decode()
+  call assert_equal({
+        \ 'all': {'leftcol': 0, 'topline': 2, 'topfill': 2, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': 2, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1001': {'leftcol': 0, 'topline': 0, 'topfill': -2, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ }, event)
+
+  call term_sendkeys(buf, "\<C-E>")
+  call WaitForAssert({-> assert_match('^g', term_getline(buf, 3))}, 1000)
+
+  let event = readfile('XscrollEvent')[0]->json_decode()
+  call assert_equal({
+        \ 'all': {'leftcol': 0, 'topline': 2, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': 1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1001': {'leftcol': 0, 'topline': 1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ }, event)
+
+  call term_sendkeys(buf, "2\<C-Y>")
+  call WaitForAssert({-> assert_match('^e', term_getline(buf, 3))}, 1000)
+
+  let event = readfile('XscrollEvent')[0]->json_decode()
+  call assert_equal({
+        \ 'all': {'leftcol': 0, 'topline': 3, 'topfill': 1, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1000': {'leftcol': 0, 'topline': -2, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0},
+        \ '1001': {'leftcol': 0, 'topline': -1, 'topfill': 1, 'width': 0, 'height': 0, 'skipcol': 0}
+        \ }, event)
+
+  call StopVimInTerminal(buf)
+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 7360dc2592303841d0d6b88f345da1f9b8382a8b..d29b3cb9b622dee5d015be79315e0d8930e8b4f2 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1025,
 /**/
     1024,
 /**/
index 9a49cad8d1ab890ffbf859041f43fa457508de1b..62b2a3f6fee97e6f95d5d25fe7b17613f2e7b368 100644 (file)
@@ -2855,6 +2855,9 @@ snapshot_windows_scroll_size(void)
     FOR_ALL_WINDOWS(wp)
     {
        wp->w_last_topline = wp->w_topline;
+#ifdef FEAT_DIFF
+       wp->w_last_topfill = wp->w_topfill;
+#endif
        wp->w_last_leftcol = wp->w_leftcol;
        wp->w_last_skipcol = wp->w_skipcol;
        wp->w_last_width = wp->w_width;
@@ -2886,6 +2889,9 @@ make_win_info_dict(
        int width,
        int height,
        int topline,
+# ifdef FEAT_DIFF
+       int topfill,
+# endif
        int leftcol,
        int skipcol)
 {
@@ -2910,6 +2916,13 @@ make_win_info_dict(
        tv.vval.v_number = topline;
        if (dict_add_tv(d, "topline", &tv) == FAIL)
            break;
+#ifdef FEAT_DIFF
+       tv.vval.v_number = topfill;
+#else
+       tv.vval.v_number = 0;
+#endif
+       if (dict_add_tv(d, "topfill", &tv) == FAIL)
+           break;
        tv.vval.v_number = leftcol;
        if (dict_add_tv(d, "leftcol", &tv) == FAIL)
            break;
@@ -2958,6 +2971,9 @@ check_window_scroll_resize(
     int tot_width = 0;
     int tot_height = 0;
     int tot_topline = 0;
+# ifdef FEAT_DIFF
+    int tot_topfill = 0;
+# endif
     int tot_leftcol = 0;
     int tot_skipcol = 0;
 #endif
@@ -2995,6 +3011,9 @@ check_window_scroll_resize(
        }
 
        int scroll_changed = wp->w_last_topline != wp->w_topline
+#ifdef FEAT_DIFF
+                               || wp->w_last_topfill != wp->w_topfill
+#endif
                                || wp->w_last_leftcol != wp->w_leftcol
                                || wp->w_last_skipcol != wp->w_skipcol;
        if (scroll_changed)
@@ -3011,10 +3030,16 @@ check_window_scroll_resize(
            int width = wp->w_width - wp->w_last_width;
            int height = wp->w_height - wp->w_last_height;
            int topline = wp->w_topline - wp->w_last_topline;
+#ifdef FEAT_DIFF
+           int topfill = wp->w_topfill - wp->w_last_topfill;
+#endif
            int leftcol = wp->w_leftcol - wp->w_last_leftcol;
            int skipcol = wp->w_skipcol - wp->w_last_skipcol;
-           dict_T *d = make_win_info_dict(width, height,
-                                                   topline, leftcol, skipcol);
+           dict_T *d = make_win_info_dict(width, height, topline,
+#ifdef FEAT_DIFF
+                                                           topfill,
+#endif
+                                                           leftcol, skipcol);
            if (d == NULL)
                break;
            char winid[NUMBUFLEN];
@@ -3029,6 +3054,9 @@ check_window_scroll_resize(
            tot_width += abs(width);
            tot_height += abs(height);
            tot_topline += abs(topline);
+#ifdef FEAT_DIFF
+           tot_topfill += abs(topfill);
+#endif
            tot_leftcol += abs(leftcol);
            tot_skipcol += abs(skipcol);
        }
@@ -3038,8 +3066,11 @@ check_window_scroll_resize(
 #ifdef FEAT_EVAL
     if (v_event != NULL)
     {
-       dict_T *alldict = make_win_info_dict(tot_width, tot_height,
-                                       tot_topline, tot_leftcol, tot_skipcol);
+       dict_T *alldict = make_win_info_dict(tot_width, tot_height, tot_topline,
+# ifdef FEAT_DIFF
+                                                   tot_topfill,
+# endif
+                                                   tot_leftcol, tot_skipcol);
        if (alldict != NULL)
        {
            if (dict_add_dict(v_event, "all", alldict) == FAIL)