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.
main
David Ludwig 2013-08-28 16:14:27 -04:00
parent 31235b4b99
commit 13c87e712b
4 changed files with 83 additions and 74 deletions

View File

@ -412,31 +412,61 @@ void SDL_WinRTApp::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
m_windowClosed = true; 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) 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); WINRT_ProcessPointerPressedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
} }
void SDL_WinRTApp::OnPointerReleased(CoreWindow^ sender, PointerEventArgs^ args) 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); WINRT_ProcessPointerReleasedEvent(WINRT_GlobalSDLWindow, args->CurrentPoint);
} }
void SDL_WinRTApp::OnPointerWheelChanged(CoreWindow^ sender, PointerEventArgs^ args) 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); 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) void SDL_WinRTApp::OnMouseMoved(MouseDevice^ mouseDevice, MouseEventArgs^ args)
{ {
WINRT_ProcessMouseMovedEvent(WINRT_GlobalSDLWindow, 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) void SDL_WinRTApp::OnKeyDown(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args)
{ {
WINRT_ProcessKeyDownEvent(args); WINRT_ProcessKeyDownEvent(args);

View File

@ -15,7 +15,6 @@ public:
internal: internal:
// SDL-specific methods // SDL-specific methods
void PumpEvents(); void PumpEvents();
Windows::Foundation::Point TransformCursor(Windows::Foundation::Point rawPosition);
protected: protected:
// Event Handlers. // Event Handlers.

View File

@ -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_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint);
extern void WINRT_ProcessPointerReleasedEvent(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 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 */ /* XAML Thread Management */
extern void WINRT_CycleXAMLThread(); extern void WINRT_CycleXAMLThread();

View File

@ -160,8 +160,8 @@ WINRT_QuitMouse(_THIS)
} }
// Applies necessary geometric transformations to raw cursor positions: // Applies necessary geometric transformations to raw cursor positions:
static Windows::Foundation::Point Windows::Foundation::Point
TransformCursor(SDL_Window * window, Windows::Foundation::Point rawPosition) WINRT_TransformCursorPosition(SDL_Window * window, Windows::Foundation::Point rawPosition)
{ {
if (!window) { if (!window) {
return rawPosition; return rawPosition;
@ -247,7 +247,7 @@ WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::Mouse
// to SDL window coordinates. // to SDL window coordinates.
// //
const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y); 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( SDL_SendMouseMotion(
window, window,
0, 0,
@ -256,11 +256,14 @@ WINRT_ProcessMouseMovedEvent(SDL_Window * window, Windows::Devices::Input::Mouse
_lround(mouseDeltaInSDLWindowCoords.Y)); _lround(mouseDeltaInSDLWindowCoords.Y));
} }
static Uint8 Uint8
WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt) WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
{ {
using namespace Windows::UI::Input; using namespace Windows::UI::Input;
#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
return SDL_BUTTON_LEFT;
#else
switch (pt->Properties->PointerUpdateKind) switch (pt->Properties->PointerUpdateKind)
{ {
case PointerUpdateKind::LeftButtonPressed: case PointerUpdateKind::LeftButtonPressed:
@ -286,80 +289,59 @@ WINRT_GetSDLButtonForPointerPoint(Windows::UI::Input::PointerPoint ^pt)
default: default:
break; break;
} }
#endif
return 0; return 0;
} }
static const char * //const char *
WINRT_ConvertPointerUpdateKindToString(Windows::UI::Input::PointerUpdateKind kind) //WINRT_ConvertPointerUpdateKindToString(Windows::UI::Input::PointerUpdateKind kind)
{ //{
using namespace Windows::UI::Input; // using namespace Windows::UI::Input;
//
switch (kind) // switch (kind)
{ // {
case PointerUpdateKind::Other: // case PointerUpdateKind::Other:
return "Other"; // return "Other";
case PointerUpdateKind::LeftButtonPressed: // case PointerUpdateKind::LeftButtonPressed:
return "LeftButtonPressed"; // return "LeftButtonPressed";
case PointerUpdateKind::LeftButtonReleased: // case PointerUpdateKind::LeftButtonReleased:
return "LeftButtonReleased"; // return "LeftButtonReleased";
case PointerUpdateKind::RightButtonPressed: // case PointerUpdateKind::RightButtonPressed:
return "RightButtonPressed"; // return "RightButtonPressed";
case PointerUpdateKind::RightButtonReleased: // case PointerUpdateKind::RightButtonReleased:
return "RightButtonReleased"; // return "RightButtonReleased";
case PointerUpdateKind::MiddleButtonPressed: // case PointerUpdateKind::MiddleButtonPressed:
return "MiddleButtonPressed"; // return "MiddleButtonPressed";
case PointerUpdateKind::MiddleButtonReleased: // case PointerUpdateKind::MiddleButtonReleased:
return "MiddleButtonReleased"; // return "MiddleButtonReleased";
case PointerUpdateKind::XButton1Pressed: // case PointerUpdateKind::XButton1Pressed:
return "XButton1Pressed"; // return "XButton1Pressed";
case PointerUpdateKind::XButton1Released: // case PointerUpdateKind::XButton1Released:
return "XButton1Released"; // return "XButton1Released";
case PointerUpdateKind::XButton2Pressed: // case PointerUpdateKind::XButton2Pressed:
return "XButton2Pressed"; // return "XButton2Pressed";
case PointerUpdateKind::XButton2Released: // case PointerUpdateKind::XButton2Released:
return "XButton2Released"; // return "XButton2Released";
} // }
//
return ""; // 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));
}
void void
WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) 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) { if (!window || WINRT_UseRelativeMouseMode) {
return; 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); SDL_SendMouseMotion(window, 0, 0, (int)transformedPoint.X, (int)transformedPoint.Y);
} }
void void
WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Input::PointerPoint ^pointerPoint) 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) { if (!window) {
return; 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) 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) { if (!window) {
return; 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) 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) { if (!window) {
return; return;
} }
Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint); Uint8 button = WINRT_GetSDLButtonForPointerPoint(pointerPoint);
if (button) { 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); SDL_SendMouseButton(window, 0, SDL_PRESSED, button);
} }
} }