From da239edfb975a281740a72d0656d820a84f5d5be Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sun, 25 Nov 2012 23:27:12 -0500 Subject: [PATCH] WinRT: fixed incorrect cursor positions when using non-native screen resolutions --- src/video/windowsrt/SDL_WinRTApp.cpp | 16 +++++++++++++++- src/video/windowsrt/SDL_WinRTApp.h | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/video/windowsrt/SDL_WinRTApp.cpp b/src/video/windowsrt/SDL_WinRTApp.cpp index 15ee94973..87a5f0367 100644 --- a/src/video/windowsrt/SDL_WinRTApp.cpp +++ b/src/video/windowsrt/SDL_WinRTApp.cpp @@ -167,11 +167,25 @@ void SDL_WinRTApp::OnPointerReleased(CoreWindow^ sender, PointerEventArgs^ args) } } +// Applies necessary geometric transformations to raw cursor positions: +Point SDL_WinRTApp::TransformCursor(Point rawPosition) +{ + if ( ! m_sdlWindowData || ! m_sdlWindowData->sdlWindow ) { + return rawPosition; + } + CoreWindow ^ nativeWindow = CoreWindow::GetForCurrentThread(); + Point outputPosition; + outputPosition.X = rawPosition.X * (((float32)m_sdlWindowData->sdlWindow->w) / nativeWindow->Bounds.Width); + outputPosition.Y = rawPosition.Y * (((float32)m_sdlWindowData->sdlWindow->h) / nativeWindow->Bounds.Height); + return outputPosition; +} + void SDL_WinRTApp::OnPointerMoved(CoreWindow^ sender, PointerEventArgs^ args) { if (m_sdlWindowData) { - SDL_SendMouseMotion(m_sdlWindowData->sdlWindow, 0, (int)args->CurrentPoint->Position.X, (int)args->CurrentPoint->Position.Y); + Point transformedPoint = TransformCursor(args->CurrentPoint->Position); + SDL_SendMouseMotion(m_sdlWindowData->sdlWindow, 0, (int)transformedPoint.X, (int)transformedPoint.Y); } } diff --git a/src/video/windowsrt/SDL_WinRTApp.h b/src/video/windowsrt/SDL_WinRTApp.h index 48c1b7713..f00417327 100644 --- a/src/video/windowsrt/SDL_WinRTApp.h +++ b/src/video/windowsrt/SDL_WinRTApp.h @@ -28,6 +28,7 @@ ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFramewo void SetSDLWindowData(const SDL_WindowData * windowData); void UpdateWindowFramebuffer(SDL_Surface * surface, SDL_Rect * rects, int numrects); void ResizeMainTexture(int w, int h); + Windows::Foundation::Point TransformCursor(Windows::Foundation::Point rawPosition); protected: // Event Handlers.