fix(events): skip WinScrolled for newly-created float windows (#21333)

Unlike split windows, creating a new floating window does not cause
other windows to resize, so it doesn't make much sense to trigger
WinScrolled or WinResized when creating a new floating window.
This commit is contained in:
zeertzjq 2022-12-10 06:50:03 +08:00 committed by GitHub
parent 8b84a10db7
commit 7faf8a45e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 6 deletions

View File

@ -5405,6 +5405,18 @@ static int check_window_scroll_resize(int *size_count, win_T **first_scroll_win,
int tot_skipcol = 0; int tot_skipcol = 0;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
// Skip floating windows that do not have a snapshot (usually becuase they are newly-created),
// as unlike split windows, creating floating windows do not cause other windows to resize.
if (wp->w_floating && wp->w_last_topline == 0) {
wp->w_last_topline = wp->w_topline;
wp->w_last_topfill = wp->w_topfill;
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;
continue;
}
const bool size_changed = wp->w_last_width != wp->w_width const bool size_changed = wp->w_last_width != wp->w_width
|| wp->w_last_height != wp->w_height; || wp->w_last_height != wp->w_height;
if (size_changed) { if (size_changed) {

View File

@ -287,6 +287,15 @@ describe('WinScrolled', function()
it('is triggered by mouse scrolling in unfocused floating window #18222', function() it('is triggered by mouse scrolling in unfocused floating window #18222', function()
local screen = Screen.new(80, 24) local screen = Screen.new(80, 24)
screen:attach() screen:attach()
exec([[
let g:scrolled = 0
autocmd WinScrolled * let g:scrolled += 1
autocmd WinScrolled * let g:amatch = expand('<amatch>')
autocmd WinScrolled * let g:v_event = deepcopy(v:event)
]])
eq(0, eval('g:scrolled'))
local buf = meths.create_buf(true, true) local buf = meths.create_buf(true, true)
meths.buf_set_lines(buf, 0, -1, false, {'a', 'b', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'}) meths.buf_set_lines(buf, 0, -1, false, {'a', 'b', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'})
local win = meths.open_win(buf, false, { local win = meths.open_win(buf, false, {
@ -298,12 +307,7 @@ describe('WinScrolled', function()
style = 'minimal' style = 'minimal'
}) })
local winid_str = tostring(win.id) local winid_str = tostring(win.id)
exec([[ -- WinScrolled should not be triggered when creating a new floating window
let g:scrolled = 0
autocmd WinScrolled * let g:scrolled += 1
autocmd WinScrolled * let g:amatch = expand('<amatch>')
autocmd WinScrolled * let g:v_event = deepcopy(v:event)
]])
eq(0, eval('g:scrolled')) eq(0, eval('g:scrolled'))
meths.input_mouse('wheel', 'down', '', 0, 3, 3) meths.input_mouse('wheel', 'down', '', 0, 3, 3)