mirror of
https://github.com/neovim/neovim.git
synced 2025-09-19 01:38:16 +00:00
fix(aucmd_win): ensure aucmd_win stays floating
Nvim uses a floating window for the autocmd window, but in certain situations, it can be made non-floating (`:wincmd J`), which can cause issues due to the previous setup and cleanup logic for a non-floating aucmd_win being removed from aucmd_prepbuf and aucmd_restbuf. This can cause glitchiness and crashes due to the aucmd_win's frame being invalid after closing its tabpage, for example. Ensure aucmd_win cannot be made non-floating. The only place this happens is in win_split_ins if new_wp != NULL.
This commit is contained in:
@@ -1147,6 +1147,7 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf)
|
||||
globaldir = NULL;
|
||||
|
||||
block_autocmds(); // We don't want BufEnter/WinEnter autocommands.
|
||||
make_snapshot(SNAP_AUCMD_IDX);
|
||||
if (need_append) {
|
||||
win_append(lastwin, aucmd_win);
|
||||
pmap_put(handle_T)(&window_handles, aucmd_win->handle, aucmd_win);
|
||||
@@ -1212,6 +1213,8 @@ win_found:
|
||||
close_tabpage(curtab);
|
||||
}
|
||||
|
||||
restore_snapshot(SNAP_AUCMD_IDX, false);
|
||||
win_comp_pos(); // recompute window positions
|
||||
unblock_autocmds();
|
||||
|
||||
win_T *const save_curwin = win_find_by_handle(aco->save_curwin_handle);
|
||||
|
@@ -958,6 +958,11 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
|
||||
int wmh1;
|
||||
bool did_set_fraction = false;
|
||||
|
||||
// aucmd_win should always remain floating
|
||||
if (new_wp != NULL && new_wp == aucmd_win) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
if (flags & WSP_TOP) {
|
||||
oldwin = firstwin;
|
||||
} else if (flags & WSP_BOT || curwin->w_floating) {
|
||||
|
Reference in New Issue
Block a user