WinRT: made simulated-mouse (via touch) input work on Windows Phone in Portrait mode
authorDavid Ludwig <dludwig@pobox.com>
Wed, 28 Aug 2013 16:14:27 -0400
changeset 8511 326b43e1276b
parent 8510 b828c4cc5cd8
child 8512 5b345a756965
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.
src/core/winrt/SDL_winrtapp.cpp
src/core/winrt/SDL_winrtapp.h
src/video/winrt/SDL_winrtevents_c.h
src/video/winrt/SDL_winrtmouse.cpp
--- a/src/core/winrt/SDL_winrtapp.cpp	Wed Aug 28 15:27:01 2013 -0400
+++ b/src/core/winrt/SDL_winrtapp.cpp	Wed Aug 28 16:14:27 2013 -0400
@@ -412,31 +412,61 @@
     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::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ 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::OnMouseMoved(MouseDevice^ mouseDevice, MouseEventArgs^ args)
 {
     WINRT_ProcessMouseMovedEvent(WINRT_GlobalSDLWindow, args);
 }
 
-void SDL_WinRTApp::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args)
-{
-    WINRT_ProcessPointerMovedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
-}
-
 void SDL_WinRTApp::OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
 {
     WINRT_ProcessKeyDownEvent(args);
--- a/src/core/winrt/SDL_winrtapp.h	Wed Aug 28 15:27:01 2013 -0400
+++ b/src/core/winrt/SDL_winrtapp.h	Wed Aug 28 16:14:27 2013 -0400
@@ -15,7 +15,6 @@
 internal:
     // SDL-specific methods
     void PumpEvents();
-    Windows::Foundation::Point TransformCursor(Windows::Foundation::Point rawPosition);
 
 protected:
     // Event Handlers.
--- a/src/video/winrt/SDL_winrtevents_c.h	Wed Aug 28 15:27:01 2013 -0400
+++ b/src/video/winrt/SDL_winrtevents_c.h	Wed Aug 28 16:14:27 2013 -0400
@@ -54,6 +54,8 @@
 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();
--- a/src/video/winrt/SDL_winrtmouse.cpp	Wed Aug 28 15:27:01 2013 -0400
+++ b/src/video/winrt/SDL_winrtmouse.cpp	Wed Aug 28 16:14:27 2013 -0400
@@ -160,8 +160,8 @@
 }
 
 // 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 @@
     // 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 @@
         _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 @@
         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 @@
 
 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_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);
     }
 }