Mouse: Move the delta division by 120 to mouse.c to properly accumulate smaller deltas with high-precision host mice on Windows hosts.

This commit is contained in:
OBattler
2026-01-17 16:54:13 +01:00
parent b3b6943055
commit 17f18e064f
2 changed files with 38 additions and 8 deletions

View File

@@ -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);

View File

@@ -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;