0
0
mirror of https://github.com/vim/vim.git synced 2025-07-24 10:45:12 -04:00

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>
This commit is contained in:
Sean Dewar 2024-01-03 18:52:52 +01:00 committed by Christian Brabandt
parent b5352931b3
commit bf44b69d1f
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
3 changed files with 64 additions and 0 deletions

View File

@ -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

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1,
/**/
0
};

View File

@ -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();