0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
zeertzjq
2022-12-07 09:17:59 +00:00
committed by Bram Moolenaar
parent 86b4816766
commit 3fc84dc2c7
5 changed files with 111 additions and 15 deletions

View 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 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): with the key "all". Example value for |v:event| (|Vim9| syntax):
{ {
all: {width: 0, height: 2, 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, topline: 0, skipcol: 0}, 1003: {width: 0, height: -1, leftcol: 0, skipcol: 0, topline: 0, topfill: 0},
1006: {width: 0, height: 1, leftcol: 0, topline: 1, skipcol: 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 Note that the "all" entry has the absolute values of the individual windows

View File

@@ -3618,6 +3618,9 @@ struct window_S
// five 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 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_leftcol; // last known value for w_leftcol
colnr_T w_last_skipcol; // last known value for w_skipcol colnr_T w_last_skipcol; // last known value for w_skipcol
int w_last_width; // last known value for w_width int w_last_width; // last known value for w_width

View File

@@ -393,8 +393,8 @@ func Test_WinScrolled()
let event = readfile('XscrollEvent')[0]->json_decode() let event = readfile('XscrollEvent')[0]->json_decode()
call assert_equal({ call assert_equal({
\ 'all': {'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, 'width': 0, 'height': 0, 'skipcol': 0} \ '1000': {'leftcol': -1, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
\ }, event) \ }, event)
" Scroll up/down in Normal mode. " Scroll up/down in Normal mode.
@@ -403,8 +403,8 @@ func Test_WinScrolled()
let event = readfile('XscrollEvent')[0]->json_decode() let event = readfile('XscrollEvent')[0]->json_decode()
call assert_equal({ call assert_equal({
\ 'all': {'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, 'width': 0, 'height': 0, 'skipcol': 0} \ '1000': {'leftcol': 0, 'topline': -1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
\ }, event) \ }, event)
" Scroll up/down in Insert mode. " Scroll up/down in Insert mode.
@@ -414,8 +414,8 @@ func Test_WinScrolled()
let event = readfile('XscrollEvent')[0]->json_decode() let event = readfile('XscrollEvent')[0]->json_decode()
call assert_equal({ call assert_equal({
\ 'all': {'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, 'width': 0, 'height': 0, 'skipcol': 0} \ '1000': {'leftcol': 0, 'topline': -1, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
\ }, event) \ }, event)
" Scroll the window horizontally to focus the last letter of the third line " 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() let event = readfile('XscrollEvent')[0]->json_decode()
call assert_equal({ call assert_equal({
\ 'all': {'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, 'width': 0, 'height': 0, 'skipcol': 0} \ '1000': {'leftcol': -5, 'topline': 0, 'topfill': 0, 'width': 0, 'height': 0, 'skipcol': 0}
\ }, event) \ }, event)
" Ensure the command was triggered for the specified window ID. " Ensure the command was triggered for the specified window ID.
@@ -582,6 +582,66 @@ func Test_WinScrolled_long_wrapped()
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc 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() func Test_WinClosed()
" Test that the pattern is matched against the closed window's ID, and both " Test that the pattern is matched against the closed window's ID, and both
" <amatch> and <afile> are set to it. " <amatch> and <afile> are set to it.

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1025,
/**/ /**/
1024, 1024,
/**/ /**/

View File

@@ -2855,6 +2855,9 @@ snapshot_windows_scroll_size(void)
FOR_ALL_WINDOWS(wp) FOR_ALL_WINDOWS(wp)
{ {
wp->w_last_topline = wp->w_topline; 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_leftcol = wp->w_leftcol;
wp->w_last_skipcol = wp->w_skipcol; wp->w_last_skipcol = wp->w_skipcol;
wp->w_last_width = wp->w_width; wp->w_last_width = wp->w_width;
@@ -2886,6 +2889,9 @@ make_win_info_dict(
int width, int width,
int height, int height,
int topline, int topline,
# ifdef FEAT_DIFF
int topfill,
# endif
int leftcol, int leftcol,
int skipcol) int skipcol)
{ {
@@ -2910,6 +2916,13 @@ make_win_info_dict(
tv.vval.v_number = topline; tv.vval.v_number = topline;
if (dict_add_tv(d, "topline", &tv) == FAIL) if (dict_add_tv(d, "topline", &tv) == FAIL)
break; 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; tv.vval.v_number = leftcol;
if (dict_add_tv(d, "leftcol", &tv) == FAIL) if (dict_add_tv(d, "leftcol", &tv) == FAIL)
break; break;
@@ -2958,6 +2971,9 @@ check_window_scroll_resize(
int tot_width = 0; int tot_width = 0;
int tot_height = 0; int tot_height = 0;
int tot_topline = 0; int tot_topline = 0;
# ifdef FEAT_DIFF
int tot_topfill = 0;
# endif
int tot_leftcol = 0; int tot_leftcol = 0;
int tot_skipcol = 0; int tot_skipcol = 0;
#endif #endif
@@ -2995,6 +3011,9 @@ check_window_scroll_resize(
} }
int scroll_changed = wp->w_last_topline != wp->w_topline 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_leftcol != wp->w_leftcol
|| wp->w_last_skipcol != wp->w_skipcol; || wp->w_last_skipcol != wp->w_skipcol;
if (scroll_changed) if (scroll_changed)
@@ -3011,10 +3030,16 @@ check_window_scroll_resize(
int width = wp->w_width - wp->w_last_width; int width = wp->w_width - wp->w_last_width;
int height = wp->w_height - wp->w_last_height; int height = wp->w_height - wp->w_last_height;
int topline = wp->w_topline - wp->w_last_topline; 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 leftcol = wp->w_leftcol - wp->w_last_leftcol;
int skipcol = wp->w_skipcol - wp->w_last_skipcol; int skipcol = wp->w_skipcol - wp->w_last_skipcol;
dict_T *d = make_win_info_dict(width, height, dict_T *d = make_win_info_dict(width, height, topline,
topline, leftcol, skipcol); #ifdef FEAT_DIFF
topfill,
#endif
leftcol, skipcol);
if (d == NULL) if (d == NULL)
break; break;
char winid[NUMBUFLEN]; char winid[NUMBUFLEN];
@@ -3029,6 +3054,9 @@ check_window_scroll_resize(
tot_width += abs(width); tot_width += abs(width);
tot_height += abs(height); tot_height += abs(height);
tot_topline += abs(topline); tot_topline += abs(topline);
#ifdef FEAT_DIFF
tot_topfill += abs(topfill);
#endif
tot_leftcol += abs(leftcol); tot_leftcol += abs(leftcol);
tot_skipcol += abs(skipcol); tot_skipcol += abs(skipcol);
} }
@@ -3038,8 +3066,11 @@ check_window_scroll_resize(
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
if (v_event != NULL) if (v_event != NULL)
{ {
dict_T *alldict = make_win_info_dict(tot_width, tot_height, dict_T *alldict = make_win_info_dict(tot_width, tot_height, tot_topline,
tot_topline, tot_leftcol, tot_skipcol); # ifdef FEAT_DIFF
tot_topfill,
# endif
tot_leftcol, tot_skipcol);
if (alldict != NULL) if (alldict != NULL)
{ {
if (dict_add_dict(v_event, "all", alldict) == FAIL) if (dict_add_dict(v_event, "all", alldict) == FAIL)