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 <seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index 818fef0..6b7dccb 100644
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -131,6 +131,64 @@
   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