diff options
author | Sean Dewar <seandewar@users.noreply.github.com> | 2021-12-31 09:32:04 +0000 |
---|---|---|
committer | Sean Dewar <seandewar@users.noreply.github.com> | 2022-02-23 00:09:27 +0000 |
commit | 2deffb5ea8e2fc8dec2cc805dbed849ad6afa4b4 (patch) | |
tree | 98c0782b322e9e50028d645a8e26bc69f51794b9 /src | |
parent | 30c9c8815b531e0130ebeb9358bc6d3947a6128a (diff) | |
download | rneovim-2deffb5ea8e2fc8dec2cc805dbed849ad6afa4b4.tar.gz rneovim-2deffb5ea8e2fc8dec2cc805dbed849ad6afa4b4.tar.bz2 rneovim-2deffb5ea8e2fc8dec2cc805dbed849ad6afa4b4.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/autocmd.c | 3 | ||||
-rw-r--r-- | src/nvim/window.c | 5 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 9117dde089..cdaa120644 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -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); diff --git a/src/nvim/window.c b/src/nvim/window.c index 43667377c5..549dd18e4f 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -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) { |