diff --git a/src/nvim/window.c b/src/nvim/window.c index 3f0f1318ed..cae8632417 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -3249,13 +3249,6 @@ bool win_close_othertab(win_T *win, int free_buf, tabpage_T *tp, bool force) } } - if (ui_has(kUIMultigrid)) { - ui_call_win_close(win->w_grid_alloc.handle); - } - if (win->w_floating) { - ui_comp_remove_grid(&win->w_grid_alloc); - } - bufref_T bufref; set_bufref(&bufref, win->w_buffer); @@ -3308,6 +3301,13 @@ bool win_close_othertab(win_T *win, int free_buf, tabpage_T *tp, bool force) } } + if (ui_has(kUIMultigrid)) { + ui_call_win_close(win->w_grid_alloc.handle); + } + if (win->w_floating) { + ui_comp_remove_grid(&win->w_grid_alloc); + } + // About to free the window. Remember its final buffer for terminal_check_size/TabClosed, // which may have changed since the last set_bufref. (e.g: close_buffer autocmds) set_bufref(&bufref, win->w_buffer); diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 10b203e03a..658bd1ac23 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -10460,12 +10460,22 @@ describe('float window', function() it('no crash when closing a floating window from a non-current tab', function() local buf = api.nvim_create_buf(false, true) local win = api.nvim_open_win(buf, false, { relative = 'editor', width = 5, height = 5, row = 0, col = 0 }) - exec_lua(function() + local triggered = exec_lua(function() vim.cmd.tabnew() vim.api.nvim_win_call(win, vim.cmd.redraw) + local triggered = false + vim.api.nvim_create_autocmd('BufHidden', { + once = true, + buf = buf, + callback = function() + vim.api.nvim_win_call(win, vim.cmd.redraw) + triggered = true + end, + }) + vim.api.nvim_win_close(win, true) + return triggered end) - api.nvim_win_close(win, true) - assert_alive() + eq(true, triggered) end) it(':sleep cursor placement #22639', function()