diff options
-rw-r--r-- | runtime/doc/options.txt | 9 | ||||
-rw-r--r-- | src/gui_w32.c | 74 | ||||
-rw-r--r-- | src/option.h | 3 | ||||
-rw-r--r-- | src/optiondefs.h | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 57 insertions, 38 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 805a0520aa..123fd33b3d 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -6282,6 +6282,15 @@ A jump table for the options with a short description can be found at |Q_op|. file. This means that ":split | edit file" results in two windows with scroll-binding, but ":split file" does not. + *'scrollfocus'* *'scf'* *'noscrollfocus'* *'noscf'* +'scrollfocus' 'scf' boolean (default off) + global + {only for MS-Windows GUI} + When using the scroll wheel and this option is set, the window under + the mouse pointer is scrolled. With this option off the current + window is scrolled. + Systems other than MS-Windows behave like this option is on. + *'scrolljump'* *'sj'* 'scrolljump' 'sj' number (default 1) global diff --git a/src/gui_w32.c b/src/gui_w32.c index 3cf782cab0..02d2e096b5 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -4234,60 +4234,58 @@ init_mouse_wheel(void) } -/* Intellimouse wheel handler */ +/* + * Intellimouse wheel handler. + * Treat a mouse wheel event as if it were a scroll request. + */ static void _OnMouseWheel( HWND hwnd, short zDelta) { -/* Treat a mouse wheel event as if it were a scroll request */ int i; int size; HWND hwndCtl; + win_T *wp; - if (curwin->w_scrollbars[SBAR_RIGHT].id != 0) - { - hwndCtl = curwin->w_scrollbars[SBAR_RIGHT].id; - size = curwin->w_scrollbars[SBAR_RIGHT].size; - } - else if (curwin->w_scrollbars[SBAR_LEFT].id != 0) - { - hwndCtl = curwin->w_scrollbars[SBAR_LEFT].id; - size = curwin->w_scrollbars[SBAR_LEFT].size; - } - else - return; - - size = curwin->w_height; if (mouse_scroll_lines == 0) init_mouse_wheel(); -#ifdef FEAT_TEXT_PROP - { - win_T *wp = gui_mouse_window(FIND_POPUP); + wp = gui_mouse_window(FIND_POPUP); - if (wp != NULL && popup_is_popup(wp)) - { - cmdarg_T cap; - oparg_T oa; - - // Mouse hovers over popup window, scroll it if possible. - mouse_row = wp->w_winrow; - mouse_col = wp->w_wincol; - vim_memset(&cap, 0, sizeof(cap)); - cap.arg = zDelta < 0 ? MSCR_UP : MSCR_DOWN; - cap.cmdchar = zDelta < 0 ? K_MOUSEUP : K_MOUSEDOWN; - clear_oparg(&oa); - cap.oap = &oa; - nv_mousescroll(&cap); - update_screen(0); - setcursor(); - out_flush(); - return; - } +#ifdef FEAT_TEXT_PROP + if (wp != NULL && popup_is_popup(wp)) + { + cmdarg_T cap; + oparg_T oa; + + // Mouse hovers over popup window, scroll it if possible. + mouse_row = wp->w_winrow; + mouse_col = wp->w_wincol; + vim_memset(&cap, 0, sizeof(cap)); + cap.arg = zDelta < 0 ? MSCR_UP : MSCR_DOWN; + cap.cmdchar = zDelta < 0 ? K_MOUSEUP : K_MOUSEDOWN; + clear_oparg(&oa); + cap.oap = &oa; + nv_mousescroll(&cap); + update_screen(0); + setcursor(); + out_flush(); + return; } #endif + if (wp == NULL || !p_scf) + wp = curwin; + + if (wp->w_scrollbars[SBAR_RIGHT].id != 0) + hwndCtl = wp->w_scrollbars[SBAR_RIGHT].id; + else if (wp->w_scrollbars[SBAR_LEFT].id != 0) + hwndCtl = wp->w_scrollbars[SBAR_LEFT].id; + else + return; + size = wp->w_height; + mch_disable_flush(); if (mouse_scroll_lines > 0 && mouse_scroll_lines < (size > 2 ? size - 2 : 1)) diff --git a/src/option.h b/src/option.h index 3ee9979133..1154aa85e4 100644 --- a/src/option.h +++ b/src/option.h @@ -814,6 +814,9 @@ EXTERN char_u *p_ruf; // 'rulerformat' EXTERN char_u *p_pp; // 'packpath' EXTERN char_u *p_rtp; // 'runtimepath' EXTERN long p_sj; // 'scrolljump' +#if defined(MSWIN) && defined(FEAT_GUI) +EXTERN int p_scf; // 'scrollfocus' +#endif EXTERN long p_so; // 'scrolloff' EXTERN char_u *p_sbo; // 'scrollopt' EXTERN char_u *p_sections; // 'sections' diff --git a/src/optiondefs.h b/src/optiondefs.h index a1d37f8341..608593beb6 100644 --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -2148,6 +2148,13 @@ static struct vimoption options[] = {"scrollbind", "scb", P_BOOL|P_VI_DEF, (char_u *)VAR_WIN, PV_SCBIND, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, + {"scrollfocus", "scf", P_BOOL|P_VI_DEF, +#if defined(MSWIN) && defined(FEAT_GUI) + (char_u *)&p_scf, PV_NONE, +#else + (char_u *)NULL, PV_NONE, +#endif + {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, {"scrolljump", "sj", P_NUM|P_VI_DEF|P_VIM, (char_u *)&p_sj, PV_NONE, {(char_u *)1L, (char_u *)0L} SCTX_INIT}, diff --git a/src/version.c b/src/version.c index 182352dc68..3a8e7ab0b0 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2257, +/**/ 2256, /**/ 2255, |