patch 9.1.0001: when closing window, wincmd p may fail

Commit: 
https://github.com/vim/vim/commit/bf44b69d1f91d9778ae1887128c63d35d9a3d19b
Author: Sean Dewar <[email protected]>
Date:   Wed Jan 3 18:52:52 2024 +0100

    patch 9.1.0001: when closing window, wincmd p may fail
    
    Avoid `prevwin == curwin` when closing `curwin`
    
    Problem:  When closing the current window (or when moving it to a tabpage), 
the
              previous window may refer to the new current window
              (`winnr() == winnr('#')`) if that window is selected as the
              new current window.
    
    Solution: Set `prevwin = NULL` when switching away from an invalid `curwin` 
and
              the target window was the `prevwin`.
              (Sean Dewar)
    
    related: #4537
    closes: #13762
    
    Signed-off-by: Sean Dewar <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index 818fef039..6b7dccbb0 100644
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -131,6 +131,64 @@ func Test_window_quit()
   bw Xa Xb
 endfunc
 
+func Test_window_curwin_not_prevwin()
+  botright split
+  call assert_equal(2, winnr())
+  call assert_equal(1, winnr('#'))
+  quit
+  call assert_equal(1, winnr())
+  call assert_equal(0, winnr('#'))
+
+  botright split
+  botright split
+  call assert_equal(3, winnr())
+  call assert_equal(2, winnr('#'))
+  1quit
+  call assert_equal(2, winnr())
+  call assert_equal(1, winnr('#'))
+
+  botright split
+  call assert_equal(1, tabpagenr())
+  call assert_equal(3, winnr())
+  call assert_equal(2, winnr('#'))
+  wincmd T
+  call assert_equal(2, tabpagenr())
+  call assert_equal(1, winnr())
+  call assert_equal(0, winnr('#'))
+  tabfirst
+  call assert_equal(1, tabpagenr())
+  call assert_equal(2, winnr())
+  call assert_equal(0, winnr('#'))
+
+  tabonly
+  botright split
+  wincmd t
+  wincmd p
+  call assert_equal(3, winnr())
+  call assert_equal(1, winnr('#'))
+  quit
+  call assert_equal(2, winnr())
+  call assert_equal(1, winnr('#'))
+
+  botright split
+  wincmd t
+  wincmd p
+  call assert_equal(1, tabpagenr())
+  call assert_equal(3, winnr())
+  call assert_equal(1, winnr('#'))
+  wincmd T
+  call assert_equal(2, tabpagenr())
+  call assert_equal(1, winnr())
+  call assert_equal(0, winnr('#'))
+  tabfirst
+  call assert_equal(1, tabpagenr())
+  call assert_equal(2, winnr())
+  call assert_equal(1, winnr('#'))
+
+  tabonly
+  only
+endfunc
+
 func Test_window_horizontal_split()
   call assert_equal(1, winnr('$'))
   3wincmd s
diff --git a/src/version.c b/src/version.c
index 1fc040ed1..c4e7fa3db 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1,
 /**/
     0
 };
diff --git a/src/window.c b/src/window.c
index 9f8065712..54e17be2d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5381,11 +5381,15 @@ win_enter_ext(win_T *wp, int flags)
     // may have to copy the buffer options when 'cpo' contains 'S'
     if (wp->w_buffer != curbuf)
        buf_copy_options(wp->w_buffer, BCO_ENTER | BCO_NOHELP);
+
     if (curwin_invalid == 0)
     {
        prevwin = curwin;       // remember for CTRL-W p
        curwin->w_redr_status = TRUE;
     }
+    else if (wp == prevwin)
+       prevwin = NULL;         // don't want it to be the new curwin
+
     curwin = wp;
     curbuf = wp->w_buffer;
     check_cursor();

-- 
-- 
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 on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rL5lf-00B7nt-6N%40256bit.org.

Raspunde prin e-mail lui