fix(api): win_set_config autocmds crash when moving win to other tabpage

Problem: win_enter autocommands can close new_curwin, crashing if it was the
last window in its tabpage after removing win, or can close parent, crashing
when attempting to split it later.

Solution: remove win first, check that parent is valid after win_enter.

NOTE: This isn't actually quite right, as this means win is not in the window
list or even has a frame when triggering enter autocommands (so it's not
considered valid in the tabpage). This is addressed in later commits.
This commit is contained in:
Sean Dewar
2024-02-04 00:42:36 +00:00
committed by Sean Dewar
parent a69c720639
commit bcb70eeac4
2 changed files with 27 additions and 1 deletions

View File

@@ -1663,6 +1663,27 @@ describe('API/win', function()
},
}, fn.winlayout())
end)
it('closing new curwin when moving window to other tabpage works', function()
command('split | tabnew')
local w = api.nvim_get_current_win()
local t = api.nvim_get_current_tabpage()
command('tabfirst | autocmd WinEnter * ++once quit')
api.nvim_win_set_config(0, { win = w, split = 'left' })
-- New tabpage is now the only one, as WinEnter closed the new curwin in the original.
eq(t, api.nvim_get_current_tabpage())
eq({ t }, api.nvim_list_tabpages())
end)
it('closing split parent when moving window to other tabpage aborts', function()
command('split | tabnew')
local w = api.nvim_get_current_win()
command('tabfirst | autocmd WinEnter * call nvim_win_close(' .. w .. ', 1)')
eq(
'Window to split was closed',
pcall_err(api.nvim_win_set_config, 0, { win = w, split = 'left' })
)
end)
end)
describe('get_config', function()