1
0
forked from aniani/vim

patch 8.2.1966: popup becomes current window after closing a terminal window

Problem:    Popup becomes current window after closing a terminal window.
Solution:   When restoring the window after executing autocommands, check that
            the window ID is still the same.  (Naruhiko Nishino,
            closes #7272)
This commit is contained in:
Bram Moolenaar
2020-11-07 16:58:59 +01:00
parent 46f479c756
commit cbcd9cbd77
6 changed files with 62 additions and 22 deletions

View File

@@ -1433,9 +1433,9 @@ aucmd_prepbuf(
// window. Expect a few side effects...
win = curwin;
aco->save_curwin = curwin;
aco->save_curwin_id = curwin->w_id;
aco->save_curbuf = curbuf;
aco->save_prevwin = prevwin;
aco->save_prevwin_id = prevwin == NULL ? 0 : prevwin->w_id;
if (win != NULL)
{
// There is a window for "buf" in the current tab page, make it the
@@ -1481,7 +1481,7 @@ aucmd_prepbuf(
curwin = aucmd_win;
}
curbuf = buf;
aco->new_curwin = curwin;
aco->new_curwin_id = curwin->w_id;
set_bufref(&aco->new_curbuf, curbuf);
}
@@ -1493,7 +1493,8 @@ aucmd_prepbuf(
aucmd_restbuf(
aco_save_T *aco) // structure holding saved values
{
int dummy;
int dummy;
win_T *save_curwin;
if (aco->use_aucmd_win)
{
@@ -1533,8 +1534,9 @@ win_found:
(void)win_comp_pos(); // recompute window positions
unblock_autocmds();
if (win_valid(aco->save_curwin))
curwin = aco->save_curwin;
save_curwin = win_find_by_id(aco->save_curwin_id);
if (save_curwin != NULL)
curwin = save_curwin;
else
// Hmm, original window disappeared. Just use the first one.
curwin = firstwin;
@@ -1543,9 +1545,7 @@ win_found:
// May need to restore insert mode for a prompt buffer.
entering_window(curwin);
#endif
if (win_valid(aco->save_prevwin))
prevwin = aco->save_prevwin;
prevwin = win_find_by_id(aco->save_prevwin_id);
#ifdef FEAT_EVAL
vars_clear(&aucmd_win->w_vars->dv_hashtab); // free all w: variables
hash_init(&aucmd_win->w_vars->dv_hashtab); // re-use the hashtab
@@ -1571,13 +1571,15 @@ win_found:
}
else
{
// restore curwin
if (win_valid(aco->save_curwin))
// Restore curwin. Use the window ID, a window may have been closed
// and the memory re-used for another one.
save_curwin = win_find_by_id(aco->save_curwin_id);
if (save_curwin != NULL)
{
// Restore the buffer which was previously edited by curwin, if
// it was changed, we are still the same window and the buffer is
// valid.
if (curwin == aco->new_curwin
if (curwin->w_id == aco->new_curwin_id
&& curbuf != aco->new_curbuf.br_buf
&& bufref_valid(&aco->new_curbuf)
&& aco->new_curbuf.br_buf->b_ml.ml_mfp != NULL)
@@ -1592,10 +1594,9 @@ win_found:
++curbuf->b_nwindows;
}
curwin = aco->save_curwin;
curwin = save_curwin;
curbuf = curwin->w_buffer;
if (win_valid(aco->save_prevwin))
prevwin = aco->save_prevwin;
prevwin = win_find_by_id(aco->save_prevwin_id);
// In case the autocommand moves the cursor to a position that
// does not exist in curbuf.
check_cursor();