From bfd5a134739748f11bbfc49e9cae5a043781d5d4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 12 Aug 2017 20:25:49 -0700 Subject: [PATCH] Fixed bug 2931 - Large relative mouse motion jumps when using touch input --- src/events/SDL_mouse.c | 22 ++++++++++++++++++---- src/events/SDL_mouse_c.h | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 3b9d184354680..42d142ab3ab48 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -173,6 +173,7 @@ SDL_SetMouseFocus(SDL_Window * window) } mouse->focus = window; + mouse->has_position = SDL_FALSE; if (mouse->focus) { SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_ENTER, 0, 0); @@ -223,10 +224,10 @@ SDL_UpdateMouseFocus(SDL_Window * window, int x, int y, Uint32 buttonstate) if (window != mouse->focus) { #ifdef DEBUG_MOUSE - printf("Mouse entered window, synthesizing focus gain & move event\n"); + printf("Mouse entered window, synthesizing focus gain & move event\n"); #endif - SDL_SetMouseFocus(window); - SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y); + SDL_SetMouseFocus(window); + SDL_PrivateSendMouseMotion(window, mouse->mouseID, 0, x, y); } return SDL_TRUE; } @@ -271,7 +272,7 @@ SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relativ return 0; } - if (mouse->relative_mode_warp) { + if (mouseID != SDL_TOUCH_MOUSEID && mouse->relative_mode_warp) { int center_x = 0, center_y = 0; SDL_GetWindowSize(window, ¢er_x, ¢er_y); center_x /= 2; @@ -309,6 +310,19 @@ SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relativ return 0; } + /* Ignore relative motion when first positioning the mouse */ + if (!mouse->has_position) { + xrel = 0; + yrel = 0; + mouse->has_position = SDL_TRUE; + } + + /* Ignore relative motion positioning the first touch */ + if (mouseID == SDL_TOUCH_MOUSEID && !mouse->buttonstate) { + xrel = 0; + yrel = 0; + } + /* Update internal mouse coordinates */ if (!mouse->relative_mode) { mouse->x = x; diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h index 947fbecbf53c4..c6ba729c1024f 100644 --- a/src/events/SDL_mouse_c.h +++ b/src/events/SDL_mouse_c.h @@ -81,6 +81,7 @@ typedef struct int ydelta; int last_x, last_y; /* the last reported x and y coordinates */ Uint32 buttonstate; + SDL_bool has_position; SDL_bool relative_mode; SDL_bool relative_mode_warp; float normal_speed_scale;