From e64e3d8c2786c79fa0063be9361bd7dfc38066ab Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sun, 27 Oct 2013 14:31:57 -0400 Subject: [PATCH] WinRT: fixed two bugs regarding mouse events The first bug had mouse motion events not getting sent out on non-touch devices, if and when a mouse button wasn't pressed. The second bug caused virtual mouse motion events to get sent out-of-order on touch devices: the motion event would get sent after the touch occurred, rather than before. --- src/video/winrt/SDL_winrtpointerinput.cpp | 48 ++++++++++++----------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/video/winrt/SDL_winrtpointerinput.cpp b/src/video/winrt/SDL_winrtpointerinput.cpp index 962ec3cbd07d2..9e64138a516a1 100644 --- a/src/video/winrt/SDL_winrtpointerinput.cpp +++ b/src/video/winrt/SDL_winrtpointerinput.cpp @@ -209,20 +209,20 @@ void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::Po } Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position); + Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - if (!WINRT_LeftFingerDown) { - Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - if (button) { -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y); -#endif - SDL_SendMouseButton(window, 0, SDL_PRESSED, button); - } + if (!WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendMouseButton(window, 0, SDL_PRESSED, button); + } else { + if (!WINRT_LeftFingerDown) { + if (button) { + SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y); + SDL_SendMouseButton(window, 0, SDL_PRESSED, button); + } - WINRT_LeftFingerDown = pointerPoint->PointerId; - } + WINRT_LeftFingerDown = pointerPoint->PointerId; + } - if (WINRT_IsTouchEvent(pointerPoint)) { SDL_SendTouch( WINRT_TouchID, (SDL_FingerID) pointerPoint->PointerId, @@ -242,11 +242,13 @@ WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPo Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position); - if (pointerPoint->PointerId == WINRT_LeftFingerDown) { + if (!WINRT_IsTouchEvent(pointerPoint)) { SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y); - } + } else if (pointerPoint->PointerId == WINRT_LeftFingerDown) { + if (pointerPoint->PointerId == WINRT_LeftFingerDown) { + SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y); + } - if (WINRT_IsTouchEvent(pointerPoint)) { SDL_SendTouchMotion( WINRT_TouchID, (SDL_FingerID) pointerPoint->PointerId, @@ -263,16 +265,18 @@ void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::P } Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position); + Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - if (WINRT_LeftFingerDown == pointerPoint->PointerId) { - Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); - if (button) { - SDL_SendMouseButton(window, 0, SDL_RELEASED, button); + if (!WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendMouseButton(window, 0, SDL_RELEASED, button); + } else { + if (WINRT_LeftFingerDown == pointerPoint->PointerId) { + if (button) { + SDL_SendMouseButton(window, 0, SDL_RELEASED, button); + } + WINRT_LeftFingerDown = 0; } - WINRT_LeftFingerDown = 0; - } - - if (WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendTouch( WINRT_TouchID, (SDL_FingerID) pointerPoint->PointerId,