# HG changeset patch # User Bram Moolenaar # Date 1670405404 -3600 # Node ID 992bfd3aee3f1af4109fcce2b7128164b36a5bb7 # Parent 15c80d8bc5153db3bdcf9322dc4c90e87fdf2284 patch 9.0.1025: WinScrolled is not triggered when filler lines change Commit: https://github.com/vim/vim/commit/3fc84dc2c7efecd7c14ce341cd777475058936fd Author: zeertzjq Date: Wed Dec 7 09:17:59 2022 +0000 patch 9.0.1025: WinScrolled is not triggered when filler lines change Problem: WinScrolled is not triggered when filler lines change. Solution: Add "topfill" to the values that WinScrolled triggers on. (closes #11668) diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt --- a/runtime/doc/windows.txt +++ b/runtime/doc/windows.txt @@ -657,9 +657,9 @@ The information provided by |WinScrolled 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 diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -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 diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -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, "\") + 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\") + 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, "\") + 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\") + 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 " and are set to it. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1025, +/**/ 1024, /**/ 1023, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -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)