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:
45
src/window.c
45
src/window.c
@@ -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
|
||||
|
Reference in New Issue
Block a user