From 1d5082d815c2b0508f3dc657d87b9bdf418d444e Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Wed, 28 Aug 2013 16:51:07 -0400 Subject: [PATCH] WinRT: corrected SDL_MOUSE* coordinates in non-Portrait modes Thanks to Pierre-Yves Gueniffey for proper pointer geometry transform code! --- .../SDL/SDL_VS2012-WinPhone.vcxproj | 1 + .../SDL/SDL_VS2012-WinPhone.vcxproj.filters | 3 ++ VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj | 1 + .../SDL/SDL_VS2012-WinRT.vcxproj.filters | 3 ++ src/video/winrt/SDL_winrtmouse.cpp | 44 ++++++++++++++++++- src/video/winrt/SDL_winrtvideo.cpp | 9 +--- src/video/winrt/SDL_winrtvideo_cpp.h | 41 +++++++++++++++++ 7 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 src/video/winrt/SDL_winrtvideo_cpp.h diff --git a/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj b/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj index 9ed2b0ce7e462..1db16b019a72e 100644 --- a/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj +++ b/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj @@ -247,6 +247,7 @@ + diff --git a/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj.filters b/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj.filters index 4f6a1b35d7bf3..4c726d7a33fd9 100644 --- a/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj.filters +++ b/VisualC-WinPhone/SDL/SDL_VS2012-WinPhone.vcxproj.filters @@ -333,6 +333,9 @@ Source Files + + Source Files + diff --git a/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj b/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj index d662e6942f16c..97286011f5527 100644 --- a/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj +++ b/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj @@ -294,6 +294,7 @@ + diff --git a/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj.filters b/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj.filters index 4d4fee55d0d6a..847d900e0ee0e 100644 --- a/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj.filters +++ b/VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj.filters @@ -599,6 +599,9 @@ Source Files + + Source Files + diff --git a/src/video/winrt/SDL_winrtmouse.cpp b/src/video/winrt/SDL_winrtmouse.cpp index 40530bf09b221..fb6f5af721629 100644 --- a/src/video/winrt/SDL_winrtmouse.cpp +++ b/src/video/winrt/SDL_winrtmouse.cpp @@ -42,6 +42,7 @@ extern "C" { } #include "../../core/winrt/SDL_winrtapp.h" +#include "SDL_winrtvideo_cpp.h" #include "SDL_winrtmouse.h" @@ -163,13 +164,54 @@ WINRT_QuitMouse(_THIS) Windows::Foundation::Point WINRT_TransformCursorPosition(SDL_Window * window, Windows::Foundation::Point rawPosition) { + using namespace Windows::Graphics::Display; + if (!window) { return rawPosition; } - CoreWindow ^ nativeWindow = CoreWindow::GetForCurrentThread(); + + SDL_WindowData * windowData = (SDL_WindowData *) window->driverdata; + if (windowData->coreWindow == nullptr) { + // For some reason, the window isn't associated with a CoreWindow. + // This might end up being the case as XAML support is extended. + // For now, if there's no CoreWindow attached to the SDL_Window, + // don't do any transforms. + return rawPosition; + } + + // The CoreWindow can only be accessed on certain thread(s). + SDL_assert(CoreWindow::GetForCurrentThread() != nullptr); + + CoreWindow ^ nativeWindow = windowData->coreWindow.Get(); Windows::Foundation::Point outputPosition; + +#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP outputPosition.X = rawPosition.X * (((float32)window->w) / nativeWindow->Bounds.Width); outputPosition.Y = rawPosition.Y * (((float32)window->h) / nativeWindow->Bounds.Height); +#else + switch (DisplayProperties::CurrentOrientation) + { + case DisplayOrientations::Portrait: + outputPosition.X = rawPosition.X * (((float32)window->w) / nativeWindow->Bounds.Width); + outputPosition.Y = rawPosition.Y * (((float32)window->h) / nativeWindow->Bounds.Height); + break; + case DisplayOrientations::PortraitFlipped: + outputPosition.X = (float32)window->w - rawPosition.X * (((float32)window->w) / nativeWindow->Bounds.Width); + outputPosition.Y = (float32)window->h - rawPosition.Y * (((float32)window->h) / nativeWindow->Bounds.Height); + break; + case DisplayOrientations::Landscape: + outputPosition.X = rawPosition.Y * (((float32)window->w) / nativeWindow->Bounds.Height); + outputPosition.Y = (float32)window->h - rawPosition.X * (((float32)window->h) / nativeWindow->Bounds.Width); + break; + case DisplayOrientations::LandscapeFlipped: + outputPosition.X = (float32)window->w - rawPosition.Y * (((float32)window->w) / nativeWindow->Bounds.Height); + outputPosition.Y = rawPosition.X * (((float32)window->h) / nativeWindow->Bounds.Width); + break; + default: + break; + } +#endif + return outputPosition; } diff --git a/src/video/winrt/SDL_winrtvideo.cpp b/src/video/winrt/SDL_winrtvideo.cpp index 940798bab8859..621b2edaab327 100644 --- a/src/video/winrt/SDL_winrtvideo.cpp +++ b/src/video/winrt/SDL_winrtvideo.cpp @@ -45,6 +45,7 @@ extern "C" { } #include "../../core/winrt/SDL_winrtapp.h" +#include "SDL_winrtvideo_cpp.h" #include "SDL_winrtevents_c.h" #include "SDL_winrtmouse.h" #include "SDL_main.h" @@ -67,14 +68,6 @@ static void WINRT_DestroyWindow(_THIS, SDL_Window * window); static SDL_bool WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info); -/* Internal window data */ -struct SDL_WindowData -{ - SDL_Window *sdlWindow; - Platform::Agile coreWindow; -}; - - /* The global, WinRT, SDL Window. For now, SDL/WinRT only supports one window (due to platform limitations of WinRT. diff --git a/src/video/winrt/SDL_winrtvideo_cpp.h b/src/video/winrt/SDL_winrtvideo_cpp.h new file mode 100644 index 0000000000000..eb4d788fa374e --- /dev/null +++ b/src/video/winrt/SDL_winrtvideo_cpp.h @@ -0,0 +1,41 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* Windows includes: */ +#include +#ifdef __cplusplus_winrt +#include +#endif + +/* SDL includes: */ +#include "SDL_events.h" + + +#ifdef __cplusplus_winrt + +/* Internal window data */ +struct SDL_WindowData +{ + SDL_Window *sdlWindow; + Platform::Agile coreWindow; +}; + +#endif // ifdef __cplusplus_winrt