소스 검색

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.
David Ludwig 11 년 전
부모
커밋
e64e3d8c27
1개의 변경된 파일26개의 추가작업 그리고 22개의 파일을 삭제
  1. 26 22
      src/video/winrt/SDL_winrtpointerinput.cpp

+ 26 - 22
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,