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"
53Windows::Foundation::Point
55 Windows::Foundation::Point rawPosition,
56 WINRT_CursorNormalizationType normalization)
58 using namespace Windows::UI::Core;
59 using namespace Windows::Graphics::Display;
66 if (windowData->coreWindow ==
nullptr) {
77 SDL_assert(CoreWindow::GetForCurrentThread() !=
nullptr);
79 CoreWindow ^ nativeWindow = windowData->coreWindow.Get();
80 Windows::Foundation::Point outputPosition;
85#if (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) || (NTDDI_VERSION > NTDDI_WIN8)
86 outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width;
87 outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height;
89 switch (WINRT_DISPLAY_PROPERTY(CurrentOrientation))
91 case DisplayOrientations::Portrait:
92 outputPosition.X = rawPosition.X / nativeWindow->Bounds.Width;
93 outputPosition.Y = rawPosition.Y / nativeWindow->Bounds.Height;
95 case DisplayOrientations::PortraitFlipped:
96 outputPosition.X = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width);
97 outputPosition.Y = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height);
99 case DisplayOrientations::Landscape:
100 outputPosition.X = rawPosition.Y / nativeWindow->Bounds.Height;
101 outputPosition.Y = 1.0f - (rawPosition.X / nativeWindow->Bounds.Width);
103 case DisplayOrientations::LandscapeFlipped:
104 outputPosition.X = 1.0f - (rawPosition.Y / nativeWindow->Bounds.Height);
105 outputPosition.Y = rawPosition.X / nativeWindow->Bounds.Width;
112 if (normalization == TransformToSDLWindowSize) {
113 outputPosition.X *= ((float32)
window->w);
114 outputPosition.Y *= ((float32)
window->h);
117 return outputPosition;
124 return (
int)
floor(arg + 0.5f);
126 return (
int)ceil(arg - 0.5f);
131WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
133 using namespace Windows::UI::Input;
135#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
138 switch (pt->Properties->PointerUpdateKind)
140 case PointerUpdateKind::LeftButtonPressed:
141 case PointerUpdateKind::LeftButtonReleased:
144 case PointerUpdateKind::RightButtonPressed:
145 case PointerUpdateKind::RightButtonReleased:
148 case PointerUpdateKind::MiddleButtonPressed:
149 case PointerUpdateKind::MiddleButtonReleased:
152 case PointerUpdateKind::XButton1Pressed:
153 case PointerUpdateKind::XButton1Released:
156 case PointerUpdateKind::XButton2Pressed:
157 case PointerUpdateKind::XButton2Released:
203WINRT_IsTouchEvent(Windows::UI::Input::PointerPoint ^pointerPoint)
205#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
208 using namespace Windows::Devices::Input;
209 switch (pointerPoint->PointerDevice->PointerDeviceType) {
210 case PointerDeviceType::Touch:
211 case PointerDeviceType::Pen:
219void WINRT_ProcessPointerPressedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
225 Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
227 if ( ! WINRT_IsTouchEvent(pointerPoint)) {
230 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
231 Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, TransformToSDLWindowSize);
239 pointerPoint->Properties->Pressure);
244WINRT_ProcessPointerMovedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
250 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
251 Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, TransformToSDLWindowSize);
253 if ( ! WINRT_IsTouchEvent(pointerPoint)) {
261 pointerPoint->Properties->Pressure);
265void WINRT_ProcessPointerReleasedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
271 Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
273 if (!WINRT_IsTouchEvent(pointerPoint)) {
276 Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(
window, pointerPoint->Position, NormalizeZeroToOne);
284 pointerPoint->Properties->Pressure);
288void WINRT_ProcessPointerEnteredEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
294 if (!WINRT_IsTouchEvent(pointerPoint)) {
299void WINRT_ProcessPointerExitedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
305 if (!WINRT_IsTouchEvent(pointerPoint)) {
311WINRT_ProcessPointerWheelChangedEvent(
SDL_Window *
window, Windows::UI::Input::PointerPoint ^pointerPoint)
317 float motion = (float) pointerPoint->Properties->MouseWheelDelta / WHEEL_DELTA;
322WINRT_ProcessMouseMovedEvent(
SDL_Window *
window, Windows::Devices::Input::MouseEventArgs ^args)
384 const Windows::Foundation::Point mouseDeltaInDIPs((
float)args->MouseDelta.X, (
float)args->MouseDelta.Y);
385 const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(
window, mouseDeltaInDIPs, TransformToSDLWindowSize);
390 _lround(mouseDeltaInSDLWindowCoords.X),
391 _lround(mouseDeltaInSDLWindowCoords.Y));
#define SDL_assert(condition)
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
void SDL_SetMouseFocus(SDL_Window *window)
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
#define SDL_BUTTON_MIDDLE
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
int SDL_AddTouch(SDL_TouchID touchID, SDL_TouchDeviceType type, const char *name)
@ SDL_TOUCH_DEVICE_DIRECT
void WINRT_InitTouch(_THIS)
SDL_bool WINRT_UsingRelativeMouseMode
EGLSurface EGLNativeWindowType * window
The type used to identify a window.