diff --git a/src/nvim/window.c b/src/nvim/window.c index 1db79abd40..d110329ddf 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -3215,13 +3215,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); @@ -3274,6 +3267,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 436ad5bee0..f42dd9b593 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -10526,12 +10526,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()