patch 9.1.1916: WinEnter autocommand confuses Vim when closing tabpage

Problem:  WinEnter autocommand may confuse Vim when closing tabpage
          (hokorobi)
Solution: Verify that curwin did not change in close_others()

fixes: #18722
closes: #18733

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2025-11-15 17:30:58 +00:00
parent fb8ebf1ee0
commit 61b73b89a3
3 changed files with 34 additions and 0 deletions

View File

@ -5537,4 +5537,27 @@ func Test_VimResized_and_window_width_not_equalized()
call StopVimInTerminal(buf)
endfunc
func Test_win_tabclose_autocmd()
defer CleanUpTestAuGroup()
new
augroup testing
au WinClosed * wincmd p
augroup END
tabnew
new
new
call assert_equal(2, tabpagenr('$'))
try
tabclose
catch
" should not happen
call assert_report("closing tabpage failed")
endtry
call assert_equal(1, tabpagenr('$'))
bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1916,
/**/
1915,
/**/

View File

@ -4403,6 +4403,7 @@ close_others(
{
win_T *wp;
win_T *nextwp;
win_T *old_curwin = curwin;
int r;
if (one_window())
@ -4416,6 +4417,14 @@ close_others(
for (wp = firstwin; win_valid(wp); wp = nextwp)
{
nextwp = wp->w_next;
// autocommands messed this one up
if (old_curwin != curwin && win_valid(old_curwin))
{
curwin = old_curwin;
curbuf = curwin->w_buffer;
}
if (wp == curwin) // don't close current window
continue;