aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/window.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-11 16:24:15 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-04-12 05:02:05 +0800
commit53668a5815099f432a5ecebad1d2982ae6813fe6 (patch)
tree0b5e1c37347294ef12e65f4315f3bc95c5cccf89 /src/nvim/window.c
parent10b40440ddbdc979a47335790988966b4e9fb6f1 (diff)
downloadrneovim-53668a5815099f432a5ecebad1d2982ae6813fe6.tar.gz
rneovim-53668a5815099f432a5ecebad1d2982ae6813fe6.tar.bz2
rneovim-53668a5815099f432a5ecebad1d2982ae6813fe6.zip
vim-patch:8.2.4713: plugins cannot track text scrolling
Problem: Plugins cannot track text scrolling. Solution: Add the WinScrolled event. (closes vim/vim#10102) https://github.com/vim/vim/commit/0937182d49fa8db50cec42785f22f1031760a0bd Skip User event in autocmd.txt, not needed unless #10689 is reverted.
Diffstat (limited to 'src/nvim/window.c')
-rw-r--r--src/nvim/window.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 9aa2f947cb..08cdfa4ebe 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -2851,7 +2851,7 @@ static void do_autocmd_winclosed(win_T *win)
}
recursive = true;
char_u winid[NUMBUFLEN];
- vim_snprintf((char *)winid, sizeof(winid), "%i", win->handle);
+ vim_snprintf((char *)winid, sizeof(winid), "%d", win->handle);
apply_autocmds(EVENT_WINCLOSED, winid, winid, false, win->w_buffer);
recursive = false;
}
@@ -5246,25 +5246,31 @@ void shell_new_columns(void)
win_reconfig_floats(); // The size of floats might change
}
-/// Check if "wp" has scrolled since last time it was checked
-/// @param wp the window to check
-bool win_did_scroll(win_T *wp)
+/// Trigger WinScrolled autocmd if window has scrolled.
+void may_trigger_winscrolled(win_T *wp)
{
- return (curwin->w_last_topline != curwin->w_topline
- || curwin->w_last_leftcol != curwin->w_leftcol
- || curwin->w_last_width != curwin->w_width
- || curwin->w_last_height != curwin->w_height);
-}
+ static bool recursive = false;
-/// Trigger WinScrolled autocmd
-void do_autocmd_winscrolled(win_T *wp)
-{
- apply_autocmds(EVENT_WINSCROLLED, NULL, NULL, false, curbuf);
+ if (recursive || !has_event(EVENT_WINSCROLLED)) {
+ return;
+ }
+
+ if (wp->w_last_topline != wp->w_topline
+ || wp->w_last_leftcol != wp->w_leftcol
+ || wp->w_last_width != wp->w_width
+ || wp->w_last_height != wp->w_height) {
+ char_u winid[NUMBUFLEN];
+ vim_snprintf((char *)winid, sizeof(winid), "%d", wp->handle);
- wp->w_last_topline = wp->w_topline;
- wp->w_last_leftcol = wp->w_leftcol;
- wp->w_last_width = wp->w_width;
- wp->w_last_height = wp->w_height;
+ recursive = true;
+ apply_autocmds(EVENT_WINSCROLLED, winid, winid, false, wp->w_buffer);
+ recursive = false;
+
+ wp->w_last_topline = wp->w_topline;
+ wp->w_last_leftcol = wp->w_leftcol;
+ wp->w_last_width = wp->w_width;
+ wp->w_last_height = wp->w_height;
+ }
}
/*