changeset 26117:d4d9c7c55a5f v8.2.3591

patch 8.2.3591: no event is triggered when closing a window Commit: https://github.com/vim/vim/commit/23beefed73aadb243fb67cf944e3d60fe8c038bb Author: naohiro ono <obcat@icloud.com> Date: Sat Nov 13 12:38:49 2021 +0000 patch 8.2.3591: no event is triggered when closing a window Problem: No event is triggered when closing a window. Solution: Add the WinClosed event. (Naohiro Ono, closes https://github.com/vim/vim/issues/9110)
author Bram Moolenaar <Bram@vim.org>
date Sat, 13 Nov 2021 13:45:03 +0100
parents 9007076c18da
children 83ae5b517920
files runtime/doc/autocmd.txt src/autocmd.c src/testdir/test_autocmd.vim src/version.c src/vim.h src/window.c
diffstat 6 files changed, 41 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -348,6 +348,7 @@ Name			triggered by ~
 
 |WinNew|		after creating a new window
 |TabNew|		after creating a new tab page
+|WinClosed|		after closing a window
 |TabClosed|		after closing a tab page
 |WinEnter|		after entering another window
 |WinLeave|		before leaving a window
@@ -1280,6 +1281,12 @@ VimResume			When the Vim instance is res
 VimSuspend			When the Vim instance is suspended.  Only when
 				CTRL-Z was typed inside Vim, not when the
 				SIGSTOP or SIGTSTP signal was sent to Vim.
+							*WinClosed*
+WinClosed			After closing a window.  The pattern is
+				matched against the |window-ID|.  Both
+				<amatch> and <afile> are set to the
+				|window-ID|.  Non-recursive (event cannot
+				trigger itself).
 							*WinEnter*
 WinEnter			After entering another window.  Not done for
 				the first window, when Vim has just started.
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -186,6 +186,7 @@ static struct event_name
     {"VimLeave",	EVENT_VIMLEAVE},
     {"VimLeavePre",	EVENT_VIMLEAVEPRE},
     {"WinNew",		EVENT_WINNEW},
+    {"WinClosed",	EVENT_WINCLOSED},
     {"WinEnter",	EVENT_WINENTER},
     {"WinLeave",	EVENT_WINLEAVE},
     {"VimResized",	EVENT_VIMRESIZED},
@@ -2042,7 +2043,8 @@ apply_autocmds_group(
 		|| event == EVENT_OPTIONSET
 		|| event == EVENT_QUICKFIXCMDPOST
 		|| event == EVENT_DIRCHANGED
-		|| event == EVENT_MODECHANGED)
+		|| event == EVENT_MODECHANGED
+		|| event == EVENT_WINCLOSED)
 	{
 	    fname = vim_strsave(fname);
 	    autocmd_fname_full = TRUE; // don't expand it later
index 8161183dc8447e718d2d344789686e777e5bd2ed..9eb718f9da4c6de08a925432b3702b9690a4f597
GIT binary patch
literal 87212
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
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3591,
+/**/
     3590,
 /**/
     3589,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1379,6 +1379,7 @@ enum auto_event
     EVENT_WINENTER,		// after entering a window
     EVENT_WINLEAVE,		// before leaving a window
     EVENT_WINNEW,		// when entering a new window
+    EVENT_WINCLOSED,		// after closing a window
     EVENT_VIMSUSPEND,		// before Vim is suspended
     EVENT_VIMRESUME,		// after Vim is resumed
 
--- a/src/window.c
+++ b/src/window.c
@@ -19,6 +19,7 @@ static void win_exchange(long);
 static void win_rotate(int, int);
 static void win_totop(int size, int flags);
 static void win_equal_rec(win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height);
+static void trigger_winclosed(win_T *win);
 static win_T *win_free_mem(win_T *win, int *dirp, tabpage_T *tp);
 static frame_T *win_altframe(win_T *win, tabpage_T *tp);
 static tabpage_T *alt_tabpage(void);
@@ -2566,6 +2567,13 @@ win_close(win_T *win, int free_buf)
     if (popup_win_closed(win) && !win_valid(win))
 	return FAIL;
 #endif
+
+    // Trigger WinClosed just before starting to free window-related resources.
+    trigger_winclosed(win);
+    // autocmd may have freed the window already.
+    if (!win_valid_any_tab(win))
+	return OK;
+
     win_close_buffer(win, free_buf ? DOBUF_UNLOAD : 0, TRUE);
 
     if (only_one_window() && win_valid(win) && win->w_buffer == NULL
@@ -2710,6 +2718,20 @@ win_close(win_T *win, int free_buf)
     return OK;
 }
 
+    static void
+trigger_winclosed(win_T *win)
+{
+    static int	recursive = FALSE;
+    char_u	winid[NUMBUFLEN];
+
+    if (recursive)
+	return;
+    recursive = TRUE;
+    vim_snprintf((char *)winid, sizeof(winid), "%i", win->w_id);
+    apply_autocmds(EVENT_WINCLOSED, winid, winid, FALSE, win->w_buffer);
+    recursive = FALSE;
+}
+
 /*
  * Close window "win" in tab page "tp", which is not the current tab page.
  * This may be the last window in that tab page and result in closing the tab,
@@ -2731,6 +2753,12 @@ win_close_othertab(win_T *win, int free_
 					       && win->w_buffer->b_locked > 0))
 	return; // window is already being closed
 
+    // Trigger WinClosed just before starting to free window-related resources.
+    trigger_winclosed(win);
+    // autocmd may have freed the window already.
+    if (!win_valid_any_tab(win))
+	return;
+
     if (win->w_buffer != NULL)
 	// Close the link to the buffer.
 	close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0,