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.

(cherry picked from commit aad1e35162)
This commit is contained in:
Cameron Gutman
2025-03-15 14:34:08 -05:00
committed by Sam Lantinga
parent 0799237d74
commit 3e34720851
2 changed files with 9 additions and 5 deletions

View File

@@ -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
@@ -730,7 +734,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);
@@ -741,7 +745,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);
@@ -1019,7 +1023,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);
}

View File

@@ -104,7 +104,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;