diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 1d9fc8a4102c1..6a52e3ac54ef3 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -794,7 +794,6 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL ConstrainMousePosition(mouse, window, &x, &y); } else { ConstrainMousePosition(mouse, window, &x, &y); - if (mouse->has_position) { xrel = x - mouse->last_x; yrel = y - mouse->last_y; @@ -814,25 +813,30 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL yrel = 0.0f; } - if (mouse->has_position) { - // Update internal mouse coordinates - if (!mouse->relative_mode) { + { // modify internal state + if (relative) { + if (mouse->has_position) { + mouse->x += xrel; + mouse->y += yrel; + ConstrainMousePosition(mouse, window, &mouse->x, &mouse->y); + } else { + mouse->x = x; + mouse->y = y; + } + mouse->last_x = mouse->x; + mouse->last_y = mouse->y; + mouse->x_accu += xrel; + mouse->y_accu += yrel; + } else { + // Use unclamped values if we're getting events outside the window mouse->x = x; mouse->y = y; - } else { - mouse->x += xrel; - mouse->y += yrel; - ConstrainMousePosition(mouse, window, &mouse->x, &mouse->y); + mouse->last_x = x; + mouse->last_y = y; } - } else { - mouse->x = x; - mouse->y = y; mouse->has_position = true; } - mouse->xdelta += xrel; - mouse->ydelta += yrel; - // Move the mouse cursor, if needed if (mouse->cursor_shown && !mouse->relative_mode && mouse->MoveCursor && mouse->cur_cursor) { @@ -841,6 +845,7 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL // Post the event, if desired if (SDL_EventEnabled(SDL_EVENT_MOUSE_MOTION)) { + if (!relative && !mouse->relative_mode_warp_motion && mouse->focus && (mouse->focus->flags & SDL_WINDOW_MOUSE_RELATIVE_MODE)) return; SDL_Event event; event.type = SDL_EVENT_MOUSE_MOTION; event.common.timestamp = timestamp; @@ -855,14 +860,6 @@ static void SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL event.motion.yrel = yrel; SDL_PushEvent(&event); } - if (relative) { - mouse->last_x = mouse->x; - mouse->last_y = mouse->y; - } else { - // Use unclamped values if we're getting events outside the window - mouse->last_x = x; - mouse->last_y = y; - } } static SDL_MouseInputSource *GetMouseInputSource(SDL_Mouse *mouse, SDL_MouseID mouseID, bool down, Uint8 button) @@ -1178,13 +1175,13 @@ SDL_MouseButtonFlags SDL_GetRelativeMouseState(float *x, float *y) SDL_Mouse *mouse = SDL_GetMouse(); if (x) { - *x = mouse->xdelta; + *x = mouse->x_accu; } if (y) { - *y = mouse->ydelta; + *y = mouse->y_accu; } - mouse->xdelta = 0.0f; - mouse->ydelta = 0.0f; + mouse->x_accu = 0.0f; + mouse->y_accu = 0.0f; return SDL_GetMouseButtonState(mouse, SDL_GLOBAL_MOUSE_ID, true); } diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h index 993e2ae160bfa..9c324b4e74490 100644 --- a/src/events/SDL_mouse_c.h +++ b/src/events/SDL_mouse_c.h @@ -86,8 +86,8 @@ typedef struct SDL_Window *focus; float x; float y; - float xdelta; - float ydelta; + float x_accu; + float y_accu; float last_x, last_y; // the last reported x and y coordinates bool has_position; bool relative_mode;