SDL  2.0
SDL_winrtapp_xaml.cpp File Reference
#include <agile.h>
#include <Windows.h>
#include <windows.ui.xaml.media.dxinterop.h>
#include "../../SDL_internal.h"
#include "SDL.h"
#include "../../video/winrt/SDL_winrtevents_c.h"
#include "../../video/winrt/SDL_winrtvideo_cpp.h"
#include "SDL_winrtapp_common.h"
#include "SDL_winrtapp_xaml.h"
+ Include dependency graph for SDL_winrtapp_xaml.cpp:

Go to the source code of this file.

Functions

static void WINRT_OnPointerPressedViaXAML (Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
 
static void WINRT_OnPointerMovedViaXAML (Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
 
static void WINRT_OnPointerReleasedViaXAML (Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
 
static void WINRT_OnPointerWheelChangedViaXAML (Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
 
static void WINRT_OnRenderViaXAML (_In_ Platform::Object^ sender, _In_ Platform::Object^ args)
 
int SDL_WinRTInitXAMLApp (int(*mainFunction)(int, char **), void *backgroundPanelAsIInspectable)
 

Variables

SDL_bool WINRT_XAMLWasEnabled = SDL_FALSE
 
ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative = NULL
 
static Windows::Foundation::EventRegistrationToken WINRT_XAMLAppEventToken
 

Function Documentation

◆ SDL_WinRTInitXAMLApp()

int SDL_WinRTInitXAMLApp ( int(*)(int, char **)  mainFunction,
void backgroundPanelAsIInspectable 
)

Definition at line 102 of file SDL_winrtapp_xaml.cpp.

References SDL_INIT_VIDEO, SDL_InitSubSystem, SDL_SetError, SDL_SetMainReady, SDL_TRUE, WINRT_GlobalSwapChainBackgroundPanelNative, WINRT_OnPointerMovedViaXAML(), WINRT_OnPointerPressedViaXAML(), WINRT_OnPointerReleasedViaXAML(), WINRT_OnPointerWheelChangedViaXAML(), WINRT_OnRenderViaXAML(), WINRT_SDLAppEntryPoint, WINRT_XAMLAppEventToken, and WINRT_XAMLWasEnabled.

Referenced by SDL_WinRTRunApp().

103 {
104 #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
105  return SDL_SetError("XAML support is not yet available in Windows Phone.");
106 #else
107  // Declare C++/CX namespaces:
108  using namespace Platform;
109  using namespace Windows::Foundation;
110  using namespace Windows::UI::Core;
111  using namespace Windows::UI::Xaml;
112  using namespace Windows::UI::Xaml::Controls;
113  using namespace Windows::UI::Xaml::Input;
114  using namespace Windows::UI::Xaml::Media;
115 
116  // Make sure we have a valid XAML element (to draw onto):
117  if ( ! backgroundPanelAsIInspectable) {
118  return SDL_SetError("'backgroundPanelAsIInspectable' can't be NULL");
119  }
120 
121  Platform::Object ^ backgroundPanel = reinterpret_cast<Object ^>((IInspectable *) backgroundPanelAsIInspectable);
122  SwapChainBackgroundPanel ^swapChainBackgroundPanel = dynamic_cast<SwapChainBackgroundPanel ^>(backgroundPanel);
123  if ( ! swapChainBackgroundPanel) {
124  return SDL_SetError("An unknown or unsupported type of XAML control was specified.");
125  }
126 
127  // Setup event handlers:
128  swapChainBackgroundPanel->PointerPressed += ref new PointerEventHandler(WINRT_OnPointerPressedViaXAML);
129  swapChainBackgroundPanel->PointerReleased += ref new PointerEventHandler(WINRT_OnPointerReleasedViaXAML);
130  swapChainBackgroundPanel->PointerWheelChanged += ref new PointerEventHandler(WINRT_OnPointerWheelChangedViaXAML);
131  swapChainBackgroundPanel->PointerMoved += ref new PointerEventHandler(WINRT_OnPointerMovedViaXAML);
132 
133  // Setup for rendering:
134  IInspectable *panelInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(swapChainBackgroundPanel);
135  panelInspectable->QueryInterface(__uuidof(ISwapChainBackgroundPanelNative), (void **)&WINRT_GlobalSwapChainBackgroundPanelNative);
136 
137  WINRT_XAMLAppEventToken = CompositionTarget::Rendering::add(ref new EventHandler<Object^>(WINRT_OnRenderViaXAML));
138 
139  // Make sure the app is ready to call the SDL-centric main() function:
140  WINRT_SDLAppEntryPoint = mainFunction;
142 
143  // Make sure video-init knows that we're initializing XAML:
144  SDL_bool oldXAMLWasEnabledValue = WINRT_XAMLWasEnabled;
146 
147  // Make sure video modes are detected now, while we still have access to the WinRT
148  // CoreWindow. WinRT will not allow the app's CoreWindow to be accessed via the
149  // SDL/WinRT thread.
151  // SDL_InitSubSystem will, on error, set the SDL error. Let that propogate to
152  // the caller to here:
153  WINRT_XAMLWasEnabled = oldXAMLWasEnabledValue;
154  return -1;
155  }
156 
157  // All done, for now.
158  return 0;
159 #endif // WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP / else
160 }
#define SDL_SetMainReady
GLenum GLint ref
#define SDL_InitSubSystem
static void WINRT_OnPointerReleasedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
static void WINRT_OnPointerWheelChangedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
static Windows::Foundation::EventRegistrationToken WINRT_XAMLAppEventToken
static void WINRT_OnPointerMovedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)
ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative
static void WINRT_OnRenderViaXAML(_In_ Platform::Object^ sender, _In_ Platform::Object^ args)
SDL_bool
Definition: SDL_stdinc.h:139
#define SDL_SetError
SDL_bool WINRT_XAMLWasEnabled
int(* WINRT_SDLAppEntryPoint)(int, char **)
#define SDL_INIT_VIDEO
Definition: SDL.h:78
static void WINRT_OnPointerPressedViaXAML(Platform::Object^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs^ args)

◆ WINRT_OnPointerMovedViaXAML()

static void WINRT_OnPointerMovedViaXAML ( Platform::Object^  sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^  args 
)
static

Definition at line 63 of file SDL_winrtapp_xaml.cpp.

References WINRT_GlobalSDLWindow.

Referenced by SDL_WinRTInitXAMLApp().

64 {
65  WINRT_ProcessPointerMovedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr));
66 }
SDL_Window * WINRT_GlobalSDLWindow

◆ WINRT_OnPointerPressedViaXAML()

static void WINRT_OnPointerPressedViaXAML ( Platform::Object^  sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^  args 
)
static

Definition at line 57 of file SDL_winrtapp_xaml.cpp.

References WINRT_GlobalSDLWindow.

Referenced by SDL_WinRTInitXAMLApp().

58 {
59  WINRT_ProcessPointerPressedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr));
60 }
SDL_Window * WINRT_GlobalSDLWindow

◆ WINRT_OnPointerReleasedViaXAML()

static void WINRT_OnPointerReleasedViaXAML ( Platform::Object^  sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^  args 
)
static

Definition at line 69 of file SDL_winrtapp_xaml.cpp.

References WINRT_GlobalSDLWindow.

Referenced by SDL_WinRTInitXAMLApp().

70 {
71  WINRT_ProcessPointerReleasedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr));
72 }
SDL_Window * WINRT_GlobalSDLWindow

◆ WINRT_OnPointerWheelChangedViaXAML()

static void WINRT_OnPointerWheelChangedViaXAML ( Platform::Object^  sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^  args 
)
static

Definition at line 75 of file SDL_winrtapp_xaml.cpp.

References WINRT_GlobalSDLWindow.

Referenced by SDL_WinRTInitXAMLApp().

76 {
77  WINRT_ProcessPointerWheelChangedEvent(WINRT_GlobalSDLWindow, args->GetCurrentPoint(nullptr));
78 }
SDL_Window * WINRT_GlobalSDLWindow

◆ WINRT_OnRenderViaXAML()

static void WINRT_OnRenderViaXAML ( _In_ Platform::Object^  sender,
_In_ Platform::Object^  args 
)
static

Definition at line 89 of file SDL_winrtapp_xaml.cpp.

Referenced by SDL_WinRTInitXAMLApp().

90 {
91  WINRT_CycleXAMLThread();
92 }

Variable Documentation

◆ WINRT_GlobalSwapChainBackgroundPanelNative

ISwapChainBackgroundPanelNative* WINRT_GlobalSwapChainBackgroundPanelNative = NULL

Definition at line 46 of file SDL_winrtapp_xaml.cpp.

Referenced by SDL_WinRTInitXAMLApp().

◆ WINRT_XAMLAppEventToken

Windows::Foundation::EventRegistrationToken WINRT_XAMLAppEventToken
static

Definition at line 47 of file SDL_winrtapp_xaml.cpp.

Referenced by SDL_WinRTInitXAMLApp().

◆ WINRT_XAMLWasEnabled

SDL_bool WINRT_XAMLWasEnabled = SDL_FALSE

Definition at line 42 of file SDL_winrtapp_xaml.cpp.

Referenced by SDL_WinRTInitXAMLApp().