]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4868: when closing help window autocmds triggered for wrong window v8.2.4868
authorLemonBoy <thatlemon@gmail.com>
Wed, 4 May 2022 21:13:47 +0000 (22:13 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 4 May 2022 21:13:47 +0000 (22:13 +0100)
Problem:    When closing help window autocmds triggered for the wrong window.
Solution:   Figure out the new current window earlier. (closes #10348)

src/testdir/test_help.vim
src/version.c
src/window.c

index 5c46de4ee3127af138130542171540a82338998d..ff06b0f2ab72b7a939f3662ebaf61aed4e92abf8 100644 (file)
@@ -12,6 +12,30 @@ func Test_help_restore_snapshot()
   helpclose
 endfunc
 
+func Test_help_restore_snapshot_split()
+  " Squeeze the unnamed buffer, Xfoo and the help one side-by-side and focus
+  " the first one before calling :help.
+  let bnr = bufnr()
+  botright vsp Xfoo
+  wincmd h
+  help
+  wincmd L
+  let g:did_bufenter = v:false
+  augroup T
+    au!
+    au BufEnter Xfoo let g:did_bufenter = v:true
+  augroup END
+  helpclose
+  augroup! T
+  " We're back to the unnamed buffer.
+  call assert_equal(bnr, bufnr())
+  " No BufEnter was triggered for Xfoo.
+  call assert_equal(v:false, g:did_bufenter)
+
+  close!
+  bwipe!
+endfunc
+
 func Test_help_errors()
   call assert_fails('help doesnotexist', 'E149:')
   call assert_fails('help!', 'E478:')
index d04a226688360a6cc2af949d475abf8aa9297a5d..ca9fae212dd10946de6193ceebdd01ee25fc763f 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4868,
 /**/
     4867,
 /**/
index c9526a1d660ff5be8bfa98a5154c5de17acc268b..fc004032c4f802ab4c5d186a60e610bb2818b084 100644 (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