From aad1e35162623e191341ef6d85230c281645d0bc Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Sat, 15 Mar 2025 14:34:08 -0500
Subject: [PATCH] mouse: Allow use of integer coordinates with fractional wheel
events
SDL 2.0.18 added preciseX/Y to mouse wheel events, which we cannot
emulate in sdl2-compat without a mechanism to control integer position
and scroll deltas separately.
---
src/events/SDL_mouse.c | 12 ++++++++----
src/events/SDL_mouse_c.h | 2 +-
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index c891fdd956fdb..8212431b96c56 100644
--- a/src/events/SDL_mouse.c
+++ b/src/events/SDL_mouse.c
@@ -238,7 +238,11 @@ static void SDLCALL SDL_MouseIntegerModeChanged(void *userdata, const char *name
{
SDL_Mouse *mouse = (SDL_Mouse *)userdata;
- mouse->integer_mode = SDL_GetStringBoolean(hint, false);
+ if (hint && *hint) {
+ mouse->integer_mode = (Uint8)SDL_atoi(hint);
+ } else {
+ mouse->integer_mode = 0;
+ }
}
// Public functions
@@ -735,7 +739,7 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL
y *= mouse->normal_speed_scale;
}
}
- if (mouse->integer_mode) {
+ if (mouse->integer_mode >= 1) {
// Accumulate the fractional relative motion and only process the integer portion
mouse->xrel_frac = SDL_modff(mouse->xrel_frac + x, &x);
mouse->yrel_frac = SDL_modff(mouse->yrel_frac + y, &y);
@@ -746,7 +750,7 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL
y = (mouse->last_y + yrel);
ConstrainMousePosition(mouse, window, &x, &y);
} else {
- if (mouse->integer_mode) {
+ if (mouse->integer_mode >= 1) {
// Discard the fractional component from absolute coordinates
x = SDL_truncf(x);
y = SDL_truncf(y);
@@ -1024,7 +1028,7 @@ void SDL_SendMouseWheel(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseI
}
// Accumulate fractional wheel motion if integer mode is enabled
- if (mouse->integer_mode) {
+ if (mouse->integer_mode >= 2) {
mouse->wheel_x_frac = SDL_modff(mouse->wheel_x_frac + x, &x);
mouse->wheel_y_frac = SDL_modff(mouse->wheel_y_frac + y, &y);
}
diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h
index b2518b8879eb4..36539eb5ea60b 100644
--- a/src/events/SDL_mouse_c.h
+++ b/src/events/SDL_mouse_c.h
@@ -108,7 +108,7 @@ typedef struct
float wheel_y_frac;
double click_motion_x;
double click_motion_y;
- bool integer_mode;
+ Uint8 integer_mode;
bool has_position;
bool relative_mode;
bool relative_mode_warp_motion;