summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-11-05 21:09:23 +0100
committerBram Moolenaar <Bram@vim.org>2019-11-05 21:09:23 +0100
commitae20f340adc8c96aeec5cff5ef4f2129035ffca4 (patch)
tree1053beba1daad179dfb22958fbfe86f9a633e93e
parente5a3272d32ad52f905ef3e66991871dbef2245e7 (diff)
downloadvim-git-ae20f340adc8c96aeec5cff5ef4f2129035ffca4.tar.gz
patch 8.1.2257: MS-Windows GUI: scroll wheel always uses current windowv8.1.2257
Problem: MS-Windows GUI: scroll wheel always uses current window. Solution: Add the 'scrollfocus' option for MS-Windows.
-rw-r--r--runtime/doc/options.txt9
-rw-r--r--src/gui_w32.c74
-rw-r--r--src/option.h3
-rw-r--r--src/optiondefs.h7
-rw-r--r--src/version.c2
5 files changed, 57 insertions, 38 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 805a0520a..123fd33b3 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 3cf782cab..02d2e096b 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 3ee997913..1154aa85e 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 a1d37f834..608593beb 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 182352dc6..3a8e7ab0b 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,