Commit 13c87e712b86a70e4e77a3f824508464a19e097f

David Ludwig 2013-08-28T16:14:27

WinRT: made simulated-mouse (via touch) input work on Windows Phone in Portrait mode Proper SDL_MOUSE* event support for non-Portrait orientations in Windows Phone is pending.

diff --git a/src/core/winrt/SDL_winrtapp.cpp b/src/core/winrt/SDL_winrtapp.cpp
index de62b41..aecab9a 100644
--- a/src/core/winrt/SDL_winrtapp.cpp
+++ b/src/core/winrt/SDL_winrtapp.cpp
@@ -412,29 +412,59 @@ void SDL_WinRTApp::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
     m_windowClosed = true;
 }
 
+static void
+WINRT_LogPointerEvent(const char * header, Windows::UI::Core::PointerEventArgs ^ args, Windows::Foundation::Point transformedPoint)
+{
+    Windows::UI::Input::PointerPoint ^ pt = args->CurrentPoint;
+    SDL_Log("%s: Position={%f,%f}, Transformed Pos={%f, %f}, MouseWheelDelta=%d, FrameId=%d, PointerId=%d, SDL button=%d\n",
+        header,
+        pt->Position.X, pt->Position.Y,
+        transformedPoint.X, transformedPoint.Y,
+        pt->Properties->MouseWheelDelta,
+        pt->FrameId,
+        pt->PointerId,
+        WINRT_GetSDLButtonForPointerPoint(pt));
+}
+
 void SDL_WinRTApp::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
 {
+#if LOG_POINTER_EVENTS
+    WINRT_LogPointerEvent("pointer pressed", args, WINRT_TransformCursorPosition(WINRT_GlobalSDLWindow, args->CurrentPoint->Position));
+#endif
+
     WINRT_ProcessPointerPressedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
 }
 
 void SDL_WinRTApp::OnPointerReleased(CoreWindow^ sender, PointerEventArgs^ args)
 {
+#if LOG_POINTER_EVENTS
+    WINRT_LogPointerEvent("pointer released", args, WINRT_TransformCursorPosition(WINRT_GlobalSDLWindow, args->CurrentPoint->Position));
+#endif
+
     WINRT_ProcessPointerReleasedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
 }
 
 void SDL_WinRTApp::OnPointerWheelChanged(CoreWindow^ sender, PointerEventArgs^ args)
 {
+#if LOG_POINTER_EVENTS
+    WINRT_LogPointerEvent("pointer wheel changed", args, WINRT_TransformCursorPosition(WINRT_GlobalSDLWindow, args->CurrentPoint->Position));
+#endif
+
     WINRT_ProcessPointerWheelChangedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
 }
 
-void SDL_WinRTApp::OnMouseMoved(MouseDevice^ mouseDevice, MouseEventArgs^ args)
+void SDL_WinRTApp::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args)
 {
-    WINRT_ProcessMouseMovedEvent(WINRT_GlobalSDLWindow, args);
+#if LOG_POINTER_EVENTS
+    WINRT_LogPointerEvent("pointer moved", args, WINRT_TransformCursorPosition(WINRT_GlobalSDLWindow, args->CurrentPoint->Position));
+#endif
+
+    WINRT_ProcessPointerMovedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
 }
 
-void SDL_WinRTApp::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args)
+void SDL_WinRTApp::OnMouseMoved(MouseDevice^ mouseDevice, MouseEventArgs^ args)
 {
-    WINRT_ProcessPointerMovedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
+    WINRT_ProcessMouseMovedEvent(WINRT_GlobalSDLWindow, args);
 }
 
 void SDL_WinRTApp::OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
diff --git a/src/core/winrt/SDL_winrtapp.h b/src/core/winrt/SDL_winrtapp.h
index 5136643..93fd61a 100644
--- a/src/core/winrt/SDL_winrtapp.h
+++ b/src/core/winrt/SDL_winrtapp.h
@@ -15,7 +15,6 @@ public:
 internal:
     // SDL-specific methods
     void PumpEvents();
-    Windows::Foundation::Point TransformCursor(Windows::Foundation::Point rawPosition);
 
 protected:
     // Event Handlers.
diff --git a/src/video/winrt/SDL_winrtevents_c.h b/src/video/winrt/SDL_winrtevents_c.h
index 6038a7c..b8f132f 100644
--- a/src/video/winrt/SDL_winrtevents_c.h
+++ b/src/video/winrt/SDL_winrtevents_c.h
@@ -54,6 +54,8 @@ extern void WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Inpu
 extern void WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint);
 extern void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint);
 extern void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint);
+extern Uint8 WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt);
+extern Windows::Foundation::Point WINRT_TransformCursorPosition(SDL_Window * window, Windows::Foundation::Point rawPosition);
 
 /* XAML Thread Management */
 extern void WINRT_CycleXAMLThread();
diff --git a/src/video/winrt/SDL_winrtmouse.cpp b/src/video/winrt/SDL_winrtmouse.cpp
index 841a28c..40530bf 100644
--- a/src/video/winrt/SDL_winrtmouse.cpp
+++ b/src/video/winrt/SDL_winrtmouse.cpp
@@ -160,8 +160,8 @@ WINRT_QuitMouse(_THIS)
 }
 
 // Applies necessary geometric transformations to raw cursor positions:
-static Windows::Foundation::Point
-TransformCursor(SDL_Window * window, Windows::Foundation::Point rawPosition)
+Windows::Foundation::Point
+WINRT_TransformCursorPosition(SDL_Window * window, Windows::Foundation::Point rawPosition)
 {
     if (!window) {
         return rawPosition;
@@ -247,7 +247,7 @@ WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::Mouse
     // to SDL window coordinates.
     //
     const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y);
-    const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = TransformCursor(window, mouseDeltaInDIPs);
+    const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(window, mouseDeltaInDIPs);
     SDL_SendMouseMotion(
         window,
         0,
@@ -256,11 +256,14 @@ WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::Mouse
         _lround(mouseDeltaInSDLWindowCoords.Y));
 }
 
-static Uint8
+Uint8
 WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
 {
     using namespace Windows::UI::Input;
 
+#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
+    return SDL_BUTTON_LEFT;
+#else
     switch (pt->Properties->PointerUpdateKind)
     {
         case PointerUpdateKind::LeftButtonPressed:
@@ -286,80 +289,59 @@ WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
         default:
             break;
     }
+#endif
 
     return 0;
 }
 
-static const char *
-WINRT_ConvertPointerUpdateKindToString(Windows::UI::Input::PointerUpdateKind kind)
-{
-    using namespace Windows::UI::Input;
-
-    switch (kind)
-    {
-        case PointerUpdateKind::Other:
-            return "Other";
-        case PointerUpdateKind::LeftButtonPressed:
-            return "LeftButtonPressed";
-        case PointerUpdateKind::LeftButtonReleased:
-            return "LeftButtonReleased";
-        case PointerUpdateKind::RightButtonPressed:
-            return "RightButtonPressed";
-        case PointerUpdateKind::RightButtonReleased:
-            return "RightButtonReleased";
-        case PointerUpdateKind::MiddleButtonPressed:
-            return "MiddleButtonPressed";
-        case PointerUpdateKind::MiddleButtonReleased:
-            return "MiddleButtonReleased";
-        case PointerUpdateKind::XButton1Pressed:
-            return "XButton1Pressed";
-        case PointerUpdateKind::XButton1Released:
-            return "XButton1Released";
-        case PointerUpdateKind::XButton2Pressed:
-            return "XButton2Pressed";
-        case PointerUpdateKind::XButton2Released:
-            return "XButton2Released";
-    }
-
-    return "";
-}
-
-static void
-WINRT_LogPointerEvent(const char * header, PointerEventArgs ^ args, Windows::Foundation::Point transformedPoint)
-{
-    Windows::UI::Input::PointerPoint ^ pt = args->CurrentPoint;
-    SDL_Log("%s: Position={%f,%f}, Transformed Pos={%f, %f}, MouseWheelDelta=%d, FrameId=%d, PointerId=%d, PointerUpdateKind=%s\n",
-        header,
-        pt->Position.X, pt->Position.Y,
-        transformedPoint.X, transformedPoint.Y,
-        pt->Properties->MouseWheelDelta,
-        pt->FrameId,
-        pt->PointerId,
-        WINRT_ConvertPointerUpdateKindToString(args->CurrentPoint->Properties->PointerUpdateKind));
-}
+//const char *
+//WINRT_ConvertPointerUpdateKindToString(Windows::UI::Input::PointerUpdateKind kind)
+//{
+//    using namespace Windows::UI::Input;
+//
+//    switch (kind)
+//    {
+//        case PointerUpdateKind::Other:
+//            return "Other";
+//        case PointerUpdateKind::LeftButtonPressed:
+//            return "LeftButtonPressed";
+//        case PointerUpdateKind::LeftButtonReleased:
+//            return "LeftButtonReleased";
+//        case PointerUpdateKind::RightButtonPressed:
+//            return "RightButtonPressed";
+//        case PointerUpdateKind::RightButtonReleased:
+//            return "RightButtonReleased";
+//        case PointerUpdateKind::MiddleButtonPressed:
+//            return "MiddleButtonPressed";
+//        case PointerUpdateKind::MiddleButtonReleased:
+//            return "MiddleButtonReleased";
+//        case PointerUpdateKind::XButton1Pressed:
+//            return "XButton1Pressed";
+//        case PointerUpdateKind::XButton1Released:
+//            return "XButton1Released";
+//        case PointerUpdateKind::XButton2Pressed:
+//            return "XButton2Pressed";
+//        case PointerUpdateKind::XButton2Released:
+//            return "XButton2Released";
+//    }
+//
+//    return "";
+//}
 
 void
 WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint)
 {
-#if LOG_POINTER_EVENTS
-    WINRT_LogPointerEvent("pointer moved", args, TransformCursor(pointerPoint->Position));
-#endif
-
     if (!window || WINRT_UseRelativeMouseMode) {
         return;
     }
 
-    Windows::Foundation::Point transformedPoint = TransformCursor(window, pointerPoint->Position);
+    Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position);
     SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
 }
 
 void
 WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint)
 {
-#if LOG_POINTER_EVENTS
-    WINRT_LogPointerEvent("wheel changed", args, TransformCursor(pointerPoint->Position));
-#endif
-
     if (!window) {
         return;
     }
@@ -371,10 +353,6 @@ WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::Po
 
 void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint)
 {
-#if LOG_POINTER_EVENTS
-    WINRT_LogPointerEvent("mouse up", args, TransformCursor(args->CurrentPoint->Position));
-#endif
-
     if (!window) {
         return;
     }
@@ -387,16 +365,16 @@ void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::P
 
 void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint)
 {
-#if LOG_POINTER_EVENTS
-    WINRT_LogPointerEvent("mouse down", args, TransformCursor(args->CurrentPoint->Position));
-#endif
-
     if (!window) {
         return;
     }
 
     Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
     if (button) {
+#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
+        Windows::Foundation::Point transformedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position);
+        SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
+#endif
         SDL_SendMouseButton(window, 0, SDL_PRESSED, button);
     }
 }