21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_WINRT
33 #include "../SDL_sysvideo.h"
34 #include "../../events/SDL_events_c.h"
35 #include "../../events/SDL_mouse_c.h"
36 #include "../../events/SDL_touch_c.h"
41 static unsigned int WINRT_LeftFingerDown = 0;
54 Windows::Foundation::Point
56 Windows::Foundation::Point rawPosition,
57 WINRT_CursorNormalizationType normalization)
59 using namespace Windows::UI::Core;
60 using namespace Windows::Graphics::Display;
67 if (windowData->coreWindow ==
nullptr) {
78 SDL_assert(CoreWindow::GetForCurrentThread() !=
nullptr);
80 CoreWindow ^ nativeWindow = windowData->coreWindow.Get();
81 Windows::Foundation::Point outputPosition;
86 #if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) || (NTDDI_VERSION > NTDDI_WIN8)
87 outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width;
88 outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height;
90 switch (WINRT_DISPLAY_PROPERTY(CurrentOrientation))
92 case DisplayOrientations::Portrait:
93 outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width;
94 outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height;
96 case DisplayOrientations::PortraitFlipped:
97 outputPosition.X = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width);
98 outputPosition.Y = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height);
100 case DisplayOrientations::Landscape:
101 outputPosition.X = rawPosition.Y / nativeWindow->Bounds.Height;
102 outputPosition.Y = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width);
104 case DisplayOrientations::LandscapeFlipped:
105 outputPosition.X = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height);
106 outputPosition.Y = rawPosition.X / nativeWindow->Bounds.Width;
113 if (normalization == TransformToSDLWindowSize) {
114 outputPosition.X *= ((float32)
window->w);
115 outputPosition.Y *= ((float32)
window->h);
118 return outputPosition;
125 return (
int)
floor(arg + 0.5
f);
127 return (
int)ceil(arg - 0.5
f);
132 WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
134 using namespace Windows::UI::Input;
136 #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
139 switch (pt->Properties->PointerUpdateKind)
141 case PointerUpdateKind::LeftButtonPressed:
142 case PointerUpdateKind::LeftButtonReleased:
145 case PointerUpdateKind::RightButtonPressed:
146 case PointerUpdateKind::RightButtonReleased:
149 case PointerUpdateKind::MiddleButtonPressed:
150 case PointerUpdateKind::MiddleButtonReleased:
153 case PointerUpdateKind::XButton1Pressed:
154 case PointerUpdateKind::XButton1Released:
157 case PointerUpdateKind::XButton2Pressed:
158 case PointerUpdateKind::XButton2Released:
204 WINRT_IsTouchEvent(Windows::UI::Input::PointerPoint ^pointerPoint)
206 #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
209 using namespace Windows::Devices::Input;
210 switch (pointerPoint->PointerDevice->PointerDeviceType) {
211 case PointerDeviceType::Touch:
212 case PointerDeviceType::Pen:
220 void WINRT_ProcessPointerPressedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
226 Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
228 if ( ! WINRT_IsTouchEvent(pointerPoint)) {
231 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
232 Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, TransformToSDLWindowSize);
234 if (!WINRT_LeftFingerDown) {
240 WINRT_LeftFingerDown = pointerPoint->PointerId;
249 pointerPoint->Properties->Pressure);
254 WINRT_ProcessPointerMovedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
260 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
261 Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, TransformToSDLWindowSize);
263 if ( ! WINRT_IsTouchEvent(pointerPoint)) {
266 if (pointerPoint->PointerId == WINRT_LeftFingerDown) {
275 pointerPoint->Properties->Pressure);
279 void WINRT_ProcessPointerReleasedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
285 Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
287 if (!WINRT_IsTouchEvent(pointerPoint)) {
290 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
292 if (WINRT_LeftFingerDown == pointerPoint->PointerId) {
296 WINRT_LeftFingerDown = 0;
305 pointerPoint->Properties->Pressure);
309 void WINRT_ProcessPointerEnteredEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
315 if (!WINRT_IsTouchEvent(pointerPoint)) {
320 void WINRT_ProcessPointerExitedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
326 if (!WINRT_IsTouchEvent(pointerPoint)) {
332 WINRT_ProcessPointerWheelChangedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
338 float motion = (float) pointerPoint->Properties->MouseWheelDelta / WHEEL_DELTA;
343 WINRT_ProcessMouseMovedEvent(
SDL_Window *
window, Windows::Devices::Input::MouseEventArgs ^args)
405 const Windows::Foundation::Point mouseDeltaInDIPs((
float)args->MouseDelta.X, (
float)args->MouseDelta.Y);
406 const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(
window, mouseDeltaInDIPs, TransformToSDLWindowSize);
411 _lround(mouseDeltaInSDLWindowCoords.X),
412 _lround(mouseDeltaInSDLWindowCoords.Y));
415 #endif // SDL_VIDEO_DRIVER_WINRT