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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
diff --git a/src/video/winrt/SDL_winrtpointerinput.cpp b/src/video/winrt/SDL_winrtpointerinput.cpp
index 962ec3c..9e64138 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,