From 17f18e064f479c1b13feb49f400ec7340fc480d8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 17 Jan 2026 16:54:13 +0100 Subject: [PATCH] Mouse: Move the delta division by 120 to mouse.c to properly accumulate smaller deltas with high-precision host mice on Windows hosts. --- src/device/mouse.c | 42 ++++++++++++++++++++++++++++----- src/qt/qt_winrawinputfilter.cpp | 4 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/device/mouse.c b/src/device/mouse.c index d4ef4c873..5cc94d116 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -34,6 +34,12 @@ #include <86box/plat.h> #include <86box/plat_unused.h> +#ifdef _WIN32 +#define WHEEL_DELTA 120 +#else +#define WHEEL_DELTA 1 +#endif + typedef struct mouse_t { const device_t *device; } mouse_t; @@ -510,16 +516,28 @@ mouse_subtract_z(int *delta_z, int min, int max, int invert) { int z = ATOMIC_LOAD(mouse_z); int real_z = invert ? -z : z; + min *= WHEEL_DELTA; + max *= WHEEL_DELTA; +#if WHEEL_DELTA > 1 + if ((real_z > -WHEEL_DELTA) && (real_z < WHEEL_DELTA)) { + *delta_z = 0; + return; + } else +#endif if (real_z > max) { - *delta_z = max; + *delta_z = max / WHEEL_DELTA; real_z -= max; } else if (real_z < min) { - *delta_z = min; + *delta_z = min / WHEEL_DELTA; real_z += ABS(min); } else { - *delta_z = real_z; + *delta_z = real_z / WHEEL_DELTA; +#if WHEEL_DELTA > 1 + real_z -= ((real_z / WHEEL_DELTA) * WHEEL_DELTA); +#else real_z = 0; +#endif } ATOMIC_STORE(mouse_z, invert ? -real_z : real_z); @@ -530,16 +548,28 @@ mouse_subtract_w(int *delta_w, int min, int max, int invert) { int w = ATOMIC_LOAD(mouse_w); int real_w = invert ? -w : w; + min *= WHEEL_DELTA; + max *= WHEEL_DELTA; +#if WHEEL_DELTA > 1 + if ((real_w > -WHEEL_DELTA) && (real_w < WHEEL_DELTA)) { + *delta_w = 0; + return; + } else +#endif if (real_w > max) { - *delta_w = max; + *delta_w = max / WHEEL_DELTA; real_w -= max; } else if (real_w < min) { - *delta_w = min; + *delta_w = min / WHEEL_DELTA; real_w += ABS(min); } else { - *delta_w = real_w; + *delta_w = real_w / WHEEL_DELTA; +#if WHEEL_DELTA > 1 + real_w -= ((real_w / WHEEL_DELTA) * WHEEL_DELTA); +#else real_w = 0; +#endif } ATOMIC_STORE(mouse_w, invert ? -real_w : real_w); diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index d40f4cdd6..5332cacbb 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -526,13 +526,13 @@ WindowsRawInputFilter::mouse_handle(RAWMOUSE *raw) mouse_set_buttons_ex(b); if (state.usButtonFlags & RI_MOUSE_WHEEL) { - delta_z = (SHORT) state.usButtonData / 120; + delta_z = (SHORT) state.usButtonData; mouse_set_z(delta_z); } else delta_z = 0; if (state.usButtonFlags & RI_MOUSE_HWHEEL) { - delta_w = (SHORT) state.usButtonData / 120; + delta_w = (SHORT) state.usButtonData; mouse_set_w(delta_w); } else delta_w = 0;