From a94e41854ad5360913d8200f2029eab15354e291 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sun, 1 Sep 2013 10:20:17 -0400 Subject: [PATCH] WinRT: added touch input event support for Windows 8/RT devices --- src/video/winrt/SDL_winrtmouse.cpp | 72 ++++++++++++++++++------------ 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/src/video/winrt/SDL_winrtmouse.cpp b/src/video/winrt/SDL_winrtmouse.cpp index 4b200db32..d639210a5 100644 --- a/src/video/winrt/SDL_winrtmouse.cpp +++ b/src/video/winrt/SDL_winrtmouse.cpp @@ -157,10 +157,8 @@ WINRT_InitMouse(_THIS) SDL_SetDefaultCursor(WINRT_CreateDefaultCursor()); #endif -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP /* Init touch: */ SDL_AddTouch(WINRT_TouchID, ""); -#endif } void @@ -378,6 +376,23 @@ WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt) // return ""; //} +static bool +WINRT_IsTouchEvent(Windows::UI::Input::PointerPoint ^pointerPoint) +{ +#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + return true; +#else + using namespace Windows::Devices::Input; + switch (pointerPoint->PointerDevice->PointerDeviceType) { + case PointerDeviceType::Touch: + case PointerDeviceType::Pen: + return true; + default: + return false; + } +#endif +} + void WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) { @@ -391,15 +406,14 @@ WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPo SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y); } -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - // TODO, WinRT: make touch input work with Windows 8/RT, seeing if touches can be distinguished from mouse input. - SDL_SendTouchMotion( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - transformedPoint.X, - transformedPoint.Y, - pointerPoint->Properties->Pressure); -#endif + if (WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendTouchMotion( + WINRT_TouchID, + (SDL_FingerID) pointerPoint->PointerId, + transformedPoint.X, + transformedPoint.Y, + pointerPoint->Properties->Pressure); + } } void @@ -430,15 +444,15 @@ void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::P WINRT_LeftFingerDown = 0; } -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - SDL_SendTouch( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - SDL_FALSE, - transformedPoint.X, - transformedPoint.Y, - pointerPoint->Properties->Pressure); -#endif + if (WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendTouch( + WINRT_TouchID, + (SDL_FingerID) pointerPoint->PointerId, + SDL_FALSE, + transformedPoint.X, + transformedPoint.Y, + pointerPoint->Properties->Pressure); + } } void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) @@ -461,15 +475,15 @@ void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::Po WINRT_LeftFingerDown = pointerPoint->PointerId; } -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - SDL_SendTouch( - WINRT_TouchID, - (SDL_FingerID) pointerPoint->PointerId, - SDL_TRUE, - transformedPoint.X, - transformedPoint.Y, - pointerPoint->Properties->Pressure); -#endif + if (WINRT_IsTouchEvent(pointerPoint)) { + SDL_SendTouch( + WINRT_TouchID, + (SDL_FingerID) pointerPoint->PointerId, + SDL_TRUE, + transformedPoint.X, + transformedPoint.Y, + pointerPoint->Properties->Pressure); + } } #endif /* SDL_VIDEO_DRIVER_WINRT */