diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 4ff9b87580..51659e290c 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -503,10 +503,8 @@ static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_ } /* SDL_HINT_TOUCH_MOUSE_EVENTS: if not set, discard synthetic mouse events coming from platform layer */ - if (mouse->touch_mouse_events == 0) { - if (mouseID == SDL_TOUCH_MOUSEID) { - return 0; - } + if (!mouse->touch_mouse_events && mouseID == SDL_TOUCH_MOUSEID) { + return 0; } if (mouseID != SDL_TOUCH_MOUSEID && mouse->relative_mode_warp) { @@ -549,31 +547,33 @@ static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_ } } - /* Ignore relative motion when first positioning the mouse */ - if (!mouse->has_position) { - mouse->x = x; - mouse->y = y; - mouse->has_position = SDL_TRUE; - } else if (xrel == 0.0f && yrel == 0.0f) { /* Drop events that don't change state */ -#ifdef DEBUG_MOUSE - SDL_Log("Mouse event didn't change state - dropped!\n"); -#endif - return 0; - } - /* Ignore relative motion positioning the first touch */ if (mouseID == SDL_TOUCH_MOUSEID && !GetButtonState(mouse, SDL_TRUE)) { xrel = 0.0f; yrel = 0.0f; } - /* Update internal mouse coordinates */ - if (!mouse->relative_mode) { + if (mouse->has_position) { + if (xrel == 0.0f && yrel == 0.0f) { /* Drop events that don't change state */ +#ifdef DEBUG_MOUSE + SDL_Log("Mouse event didn't change state - dropped!\n"); +#endif + return 0; + } + + /* Update internal mouse coordinates */ + if (!mouse->relative_mode) { + mouse->x = x; + mouse->y = y; + } else { + mouse->x += xrel; + mouse->y += yrel; + ConstrainMousePosition(mouse, window, &mouse->x, &mouse->y); + } + } else { mouse->x = x; mouse->y = y; - } else { - mouse->x += xrel; - mouse->y += yrel; + mouse->has_position = SDL_TRUE; } mouse->xdelta += xrel;