diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-04-11 16:24:15 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-04-12 05:02:05 +0800 |
commit | 53668a5815099f432a5ecebad1d2982ae6813fe6 (patch) | |
tree | 0b5e1c37347294ef12e65f4315f3bc95c5cccf89 /src/nvim/window.c | |
parent | 10b40440ddbdc979a47335790988966b4e9fb6f1 (diff) | |
download | rneovim-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.c | 40 |
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; + } } /* |