Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
WinRT: experimental and preliminary support for XAML-based overlays o…
…n Windows 8/RT The XAML support here is still rudimentary. Bugs do exist. You've been warned. XAML support in Windows Phone 8 is not yet available (in SDL/WinRT).
- Loading branch information
Showing
with
415 additions
and 48 deletions.
- +8 −0 VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj
- +3 −0 VisualC-WinRT/SDL/SDL_VS2012-WinRT.vcxproj.filters
- +14 −0 include/SDL_system.h
- +4 −4 src/core/winrt/SDL_winrtapp.cpp
- +162 −0 src/core/winrt/SDL_winrtxaml.cpp
- +79 −25 src/render/direct3d11/SDL_render_d3d11.cpp
- +96 −2 src/video/winrt/SDL_winrtevents.cpp
- +7 −4 src/video/winrt/SDL_winrtevents_c.h
- +15 −10 src/video/winrt/SDL_winrtmouse.cpp
- +27 −3 src/video/winrt/SDL_winrtvideo.cpp
@@ -0,0 +1,162 @@ | ||
/* | ||
Simple DirectMedia Layer | ||
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org> | ||
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 <agile.h> | ||
#include <Windows.h> | ||
|
||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
#include <windows.ui.xaml.media.dxinterop.h> | ||
#endif | ||
|
||
|
||
/* SDL includes */ | ||
#include "SDL.h" | ||
//#include "SDL_error.h" | ||
//#include "SDL_log.h" | ||
//#include "SDL_main.h" | ||
//#include "SDL_system.h" | ||
#include "../../video/winrt/SDL_winrtevents_c.h" | ||
|
||
|
||
/* External globals: */ | ||
extern SDL_Window * WINRT_GlobalSDLWindow; | ||
|
||
|
||
/* Internal globals: */ | ||
SDL_bool WINRT_XAMLWasEnabled = SDL_FALSE; | ||
int (*WINRT_XAMLAppMainFunction)(int, char **) = NULL; | ||
|
||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative = NULL; | ||
static Windows::Foundation::EventRegistrationToken WINRT_XAMLAppEventToken; | ||
#endif | ||
|
||
|
||
/* | ||
* Input event handlers (XAML) | ||
*/ | ||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
|
||
static void | ||
WINRT_OnPointerPressedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args) | ||
{ | ||
WINRT_ProcessPointerPressedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr)); | ||
} | ||
|
||
static void | ||
WINRT_OnPointerReleasedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args) | ||
{ | ||
WINRT_ProcessPointerReleasedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr)); | ||
} | ||
|
||
static void | ||
WINRT_OnPointerWheelChangedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args) | ||
{ | ||
WINRT_ProcessPointerWheelChangedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr)); | ||
} | ||
|
||
static void | ||
WINRT_OnPointerMovedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args) | ||
{ | ||
WINRT_ProcessPointerMovedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr)); | ||
} | ||
|
||
#endif // WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
|
||
|
||
/* | ||
* XAML-to-SDL Rendering Callback | ||
*/ | ||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
|
||
static void | ||
WINRT_OnRenderViaXAML(_In_ Platform::Object^ sender, _In_ Platform::Object^ args) | ||
{ | ||
WINRT_CycleXAMLThread(); | ||
} | ||
|
||
#endif // WINAPI_FAMILY == WINAPI_FAMILY_APP | ||
|
||
|
||
/* | ||
* SDL + XAML Initialization | ||
*/ | ||
|
||
extern "C" int | ||
SDL_WinRTInitXAMLApp(Platform::Object ^backgroundPanel, int (*mainFunction)(int, char **)) | ||
{ | ||
#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP | ||
return SDL_SetError("XAML support is not yet available in Windows Phone."); | ||
#else | ||
// Declare C++/CX namespaces: | ||
using namespace Platform; | ||
using namespace Windows::Foundation; | ||
using namespace Windows::UI::Core; | ||
using namespace Windows::UI::Xaml; | ||
using namespace Windows::UI::Xaml::Controls; | ||
using namespace Windows::UI::Xaml::Input; | ||
using namespace Windows::UI::Xaml::Media; | ||
|
||
// Make sure we have a valid XAML element (to draw onto): | ||
if ( ! backgroundPanel) { | ||
return SDL_SetError("'backgroundPanel' can't be NULL"); | ||
} | ||
|
||
SwapChainBackgroundPanel ^swapChainBackgroundPanel = dynamic_cast<SwapChainBackgroundPanel ^>(backgroundPanel); | ||
if ( ! swapChainBackgroundPanel) { | ||
return SDL_SetError("An unknown or unsupported type of XAML control was specified."); | ||
} | ||
|
||
// Setup event handlers: | ||
swapChainBackgroundPanel->PointerPressed += ref new PointerEventHandler(WINRT_OnPointerPressedViaXAML); | ||
swapChainBackgroundPanel->PointerReleased += ref new PointerEventHandler(WINRT_OnPointerReleasedViaXAML); | ||
swapChainBackgroundPanel->PointerWheelChanged += ref new PointerEventHandler(WINRT_OnPointerWheelChangedViaXAML); | ||
swapChainBackgroundPanel->PointerMoved += ref new PointerEventHandler(WINRT_OnPointerMovedViaXAML); | ||
|
||
// Setup for rendering: | ||
IInspectable *panelInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(swapChainBackgroundPanel); | ||
panelInspectable->QueryInterface(__uuidof(ISwapChainBackgroundPanelNative), (void **)&WINRT_GlobalSwapChainBackgroundPanelNative); | ||
|
||
WINRT_XAMLAppEventToken = CompositionTarget::Rendering::add(ref new EventHandler<Object^>(WINRT_OnRenderViaXAML)); | ||
|
||
// Make sure the app is ready to call the SDL-centric main() function: | ||
WINRT_XAMLAppMainFunction = mainFunction; | ||
SDL_SetMainReady(); | ||
|
||
// Make sure video-init knows that we're initializing XAML: | ||
SDL_bool oldXAMLWasEnabledValue = WINRT_XAMLWasEnabled; | ||
WINRT_XAMLWasEnabled = SDL_TRUE; | ||
|
||
// Make sure video modes are detected now, while we still have access to the WinRT | ||
// CoreWindow. WinRT will not allow the app's CoreWindow to be accessed via the | ||
// SDL/WinRT thread. | ||
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { | ||
// SDL_InitSubSystem will, on error, set the SDL error. Let that propogate to | ||
// the caller to here: | ||
WINRT_XAMLWasEnabled = oldXAMLWasEnabledValue; | ||
return -1; | ||
} | ||
|
||
// All done, for now. | ||
return 0; | ||
#endif // WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP / else | ||
} |
Oops, something went wrong.