changeset 18526:334b1f897f3a v8.1.2257

patch 8.1.2257: MS-Windows GUI: scroll wheel always uses current window Commit: https://github.com/vim/vim/commit/ae20f340adc8c96aeec5cff5ef4f2129035ffca4 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Nov 5 21:09:23 2019 +0100 patch 8.1.2257: MS-Windows GUI: scroll wheel always uses current window Problem: MS-Windows GUI: scroll wheel always uses current window. Solution: Add the 'scrollfocus' option for MS-Windows.
author Bram Moolenaar <Bram@vim.org>
date Tue, 05 Nov 2019 21:15:04 +0100
parents 99adbfe3dde3
children edccc0b13ac3
files runtime/doc/options.txt src/gui_w32.c src/option.h src/optiondefs.h src/version.c
diffstat 5 files changed, 60 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -6282,6 +6282,15 @@ A jump table for the options with a shor
 	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
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -4234,59 +4234,57 @@ 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;
-
-    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;
+    win_T *wp;
+
     if (mouse_scroll_lines == 0)
 	init_mouse_wheel();
 
+    wp = gui_mouse_window(FIND_POPUP);
+
 #ifdef FEAT_TEXT_PROP
-    {
-	win_T *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;
-	}
-    }
-#endif
+    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
--- 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'
--- 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},
--- 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,