0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.4868: when closing help window autocmds triggered for wrong window

Problem:    When closing help window autocmds triggered for the wrong window.
Solution:   Figure out the new current window earlier. (closes #10348)
This commit is contained in:
LemonBoy
2022-05-04 22:13:47 +01:00
committed by Bram Moolenaar
parent ac402f4d64
commit 2a2707d033
3 changed files with 71 additions and 0 deletions

View File

@@ -57,6 +57,7 @@ static void clear_snapshot(tabpage_T *tp, int idx);
static void clear_snapshot_rec(frame_T *fr);
static int check_snapshot_rec(frame_T *sn, frame_T *fr);
static win_T *restore_snapshot_rec(frame_T *sn, frame_T *fr);
static win_T *get_snapshot_curwin(int idx);
static int frame_check_height(frame_T *topfrp, int height);
static int frame_check_width(frame_T *topfrp, int width);
@@ -2667,6 +2668,16 @@ win_close(win_T *win, int free_buf)
// the screen space.
wp = win_free_mem(win, &dir, NULL);
if (help_window)
{
// Closing the help window moves the cursor back to the current window
// of the snapshot.
win_T *prev_win = get_snapshot_curwin(SNAP_HELP_IDX);
if (win_valid(prev_win))
wp = prev_win;
}
// Make sure curwin isn't invalid. It can cause severe trouble when
// printing an error message. For win_equal() curbuf needs to be valid
// too.
@@ -6860,6 +6871,40 @@ clear_snapshot_rec(frame_T *fr)
}
}
/*
* Traverse a snapshot to find the previous curwin.
*/
static win_T *
get_snapshot_curwin_rec(frame_T *ft)
{
win_T *wp;
if (ft->fr_next != NULL)
{
if ((wp = get_snapshot_curwin_rec(ft->fr_next)) != NULL)
return wp;
}
if (ft->fr_child != NULL)
{
if ((wp = get_snapshot_curwin_rec(ft->fr_child)) != NULL)
return wp;
}
return ft->fr_win;
}
/*
* Return the current window stored in the snapshot or NULL.
*/
static win_T *
get_snapshot_curwin(int idx)
{
if (curtab->tp_snapshot[idx] == NULL)
return NULL;
return get_snapshot_curwin_rec(curtab->tp_snapshot[idx]);
}
/*
* Restore a previously created snapshot, if there is any.
* This is only done if the screen size didn't change and the window layout is