From 13c87e712b86a70e4e77a3f824508464a19e097f Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Wed, 28 Aug 2013 16:14:27 -0400 Subject: [PATCH] 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 | 38 +++++++++- src/core/winrt/SDL_winrtapp.h | 1 - src/video/winrt/SDL_winrtevents_c.h | 2 + src/video/winrt/SDL_winrtmouse.cpp | 114 +++++++++++----------------- 4 files changed, 82 insertions(+), 73 deletions(-) diff --git a/src/core/winrt/SDL_winrtapp.cpp b/src/core/winrt/SDL_winrtapp.cpp index de62b410f3d85..aecab9a62d62a 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 5136643ca81d9..93fd61ade8801 100644 --- a/src/core/winrt/SDL_winrtapp.h +++ b/src/core/winrt/SDL_winrtapp.h @@ -15,7 +15,6 @@ ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFramewo 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 6038a7c9f7f89..b8f132fd50e24 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 841a28cc2ed7b..40530bf09b221 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); } }