summaryrefslogtreecommitdiffstats
path: root/src/gui_w32.c
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2022-05-07 12:25:40 +0100
committerBram Moolenaar <Bram@vim.org>2022-05-07 12:25:40 +0100
commitc27747e6ddcbda7d1d3b39867898f746dc4db471 (patch)
tree0ba88dccf18f52a745e746de249f8a7de752b060 /src/gui_w32.c
parent8e4b76da1d7e987d43ca960dfbc372d1c617466f (diff)
patch 8.2.4902: mouse wheel scrolling is inconsistentv8.2.4902
Problem: Mouse wheel scrolling is inconsistent. Solution: Use the MS-Winows system setting. (closes #10368)
Diffstat (limited to 'src/gui_w32.c')
-rw-r--r--src/gui_w32.c65
1 files changed, 30 insertions, 35 deletions
diff --git a/src/gui_w32.c b/src/gui_w32.c
index c6a8b6d6e7..7bca9e7aca 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -230,6 +230,10 @@ gui_mch_set_rendering_options(char_u *s)
# define SPI_GETWHEELSCROLLCHARS 0x006C
#endif
+#ifndef SPI_SETWHEELSCROLLCHARS
+# define SPI_SETWHEELSCROLLCHARS 0x006D
+#endif
+
#ifdef PROTO
/*
* Define a few things for generating prototypes. This is just to avoid
@@ -4117,18 +4121,32 @@ gui_mswin_get_menu_height(
/*
* Setup for the Intellimouse
*/
- static void
-init_mouse_wheel(void)
+ static long
+mouse_vertical_scroll_step(void)
{
- // Reasonable default values.
- mouse_scroll_lines = 3;
- mouse_scroll_chars = 3;
+ UINT val;
+ if (SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &val, 0))
+ return (val != WHEEL_PAGESCROLL) ? (long)val : -1;
+ return 3; // Safe default;
+}
- // if NT 4.0+ (or Win98) get scroll lines directly from system
- SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &mouse_scroll_lines, 0);
- SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &mouse_scroll_chars, 0);
+ static long
+mouse_horizontal_scroll_step(void)
+{
+ UINT val;
+ if (SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &val, 0))
+ return (long)val;
+ return 3; // Safe default;
}
+ static void
+init_mouse_wheel(void)
+{
+ // Get the default values for the horizontal and vertical scroll steps from
+ // the system.
+ mouse_set_vert_scroll_step(mouse_vertical_scroll_step());
+ mouse_set_hor_scroll_step(mouse_horizontal_scroll_step());
+}
/*
* Intellimouse wheel handler.
@@ -4137,16 +4155,10 @@ init_mouse_wheel(void)
static void
_OnMouseWheel(HWND hwnd, short zDelta, LPARAM param, int horizontal)
{
- int i;
- int amount;
int button;
win_T *wp;
int modifiers, kbd_modifiers;
- // Initializes mouse_scroll_chars too.
- if (mouse_scroll_lines == 0)
- init_mouse_wheel();
-
wp = gui_mouse_window(FIND_POPUP);
#ifdef FEAT_PROP_POPUP
@@ -4185,23 +4197,9 @@ _OnMouseWheel(HWND hwnd, short zDelta, LPARAM param, int horizontal)
// Translate the scroll event into an event that Vim can process so that
// the user has a chance to map the scrollwheel buttons.
if (horizontal)
- {
button = zDelta >= 0 ? MOUSE_6 : MOUSE_7;
- if (mouse_scroll_chars > 0
- && mouse_scroll_chars < MAX(wp->w_width - 2, 1))
- amount = mouse_scroll_chars;
- else
- amount = MAX(wp->w_width - 2, 1);
- }
else
- {
button = zDelta >= 0 ? MOUSE_4 : MOUSE_5;
- if (mouse_scroll_lines > 0
- && mouse_scroll_lines < MAX(wp->w_height - 2, 1))
- amount = mouse_scroll_lines;
- else
- amount = MAX(wp->w_height - 2, 1);
- }
kbd_modifiers = get_active_modifiers();
@@ -4213,8 +4211,7 @@ _OnMouseWheel(HWND hwnd, short zDelta, LPARAM param, int horizontal)
modifiers |= MOUSE_ALT;
mch_disable_flush();
- for (i = amount; i > 0; --i)
- gui_send_mouse_event(button, GET_X_LPARAM(param), GET_Y_LPARAM(param),
+ gui_send_mouse_event(button, GET_X_LPARAM(param), GET_Y_LPARAM(param),
FALSE, kbd_modifiers);
mch_enable_flush();
gui_may_flush();
@@ -4296,12 +4293,10 @@ _OnSettingChange(UINT param)
switch (param)
{
case SPI_SETWHEELSCROLLLINES:
- SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
- &mouse_scroll_lines, 0);
+ mouse_set_vert_scroll_step(mouse_vertical_scroll_step());
break;
- case SPI_GETWHEELSCROLLCHARS:
- SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0,
- &mouse_scroll_chars, 0);
+ case SPI_SETWHEELSCROLLCHARS:
+ mouse_set_hor_scroll_step(mouse_horizontal_scroll_step());
break;
case SPI_SETNONCLIENTMETRICS:
set_tabline_font();