patch 9.1.1916: WinEnter autocommand confuses Vim when closing tabpage

Commit: 
https://github.com/vim/vim/commit/61b73b89a3114b4bf62ffbedc8d0d3aa321bdcd5
Author: Christian Brabandt <[email protected]>
Date:   Sat Nov 15 17:30:58 2025 +0000

    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 <[email protected]>

diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 6957c2a9b..96b076b5e 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index f501001bb..df95ec506 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1916,
 /**/
     1915,
 /**/
diff --git a/src/window.c b/src/window.c
index 7ff228280..28c68800c 100644
--- a/src/window.c
+++ b/src/window.c
@@ -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;
 

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1vKKKe-004wz3-54%40256bit.org.

Raspunde prin e-mail lui