mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 00:24:40 +00:00
Updates SDL to 2.0.5
This commit is contained in:
parent
00a4a21e3f
commit
1e671bfc7a
274 changed files with 11502 additions and 4656 deletions
|
|
@ -40,6 +40,7 @@ using Windows::UI::Core::CoreCursor;
|
|||
#include "SDL_system.h"
|
||||
|
||||
extern "C" {
|
||||
#include "../../thread/SDL_systhread.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../../events/SDL_events_c.h"
|
||||
}
|
||||
|
|
@ -113,7 +114,7 @@ WINRT_CycleXAMLThread()
|
|||
|
||||
_mutex = SDL_CreateMutex();
|
||||
_threadState = ThreadState_Running;
|
||||
_XAMLThread = SDL_CreateThread(WINRT_XAMLThreadMain, "SDL/XAML App Thread", nullptr);
|
||||
_XAMLThread = SDL_CreateThreadInternal(WINRT_XAMLThreadMain, "SDL/XAML App Thread", 0, nullptr);
|
||||
|
||||
SDL_LockMutex(_mutex);
|
||||
while (_threadState != ThreadState_Yielding) {
|
||||
|
|
|
|||
|
|
@ -67,6 +67,13 @@ extern void WINRT_ProcessKeyDownEvent(Windows::UI::Core::KeyEventArgs ^args);
|
|||
extern void WINRT_ProcessKeyUpEvent(Windows::UI::Core::KeyEventArgs ^args);
|
||||
extern void WINRT_ProcessCharacterReceivedEvent(Windows::UI::Core::CharacterReceivedEventArgs ^args);
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WIN10
|
||||
extern SDL_bool WINRT_HasScreenKeyboardSupport(_THIS);
|
||||
extern void WINRT_ShowScreenKeyboard(_THIS, SDL_Window *window);
|
||||
extern void WINRT_HideScreenKeyboard(_THIS, SDL_Window *window);
|
||||
extern SDL_bool WINRT_IsScreenKeyboardShown(_THIS, SDL_Window *window);
|
||||
#endif // NTDDI_VERSION >= ...
|
||||
|
||||
/* XAML Thread Management */
|
||||
extern void WINRT_CycleXAMLThread();
|
||||
|
||||
|
|
|
|||
196
Engine/lib/sdl/src/video/winrt/SDL_winrtgamebar.cpp
Normal file
196
Engine/lib/sdl/src/video/winrt/SDL_winrtgamebar.cpp
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 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.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_WINRT
|
||||
|
||||
/* Windows includes */
|
||||
#include <roapi.h>
|
||||
#include <windows.foundation.h>
|
||||
#include <EventToken.h>
|
||||
|
||||
|
||||
/* SDL includes */
|
||||
extern "C" {
|
||||
#include "SDL_mouse.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
}
|
||||
#include "SDL_winrtvideo_cpp.h"
|
||||
|
||||
|
||||
/* Game Bar events can come in off the main thread. Use the following
|
||||
WinRT CoreDispatcher to deal with them on SDL's thread.
|
||||
*/
|
||||
static Platform::WeakReference WINRT_MainThreadDispatcher;
|
||||
|
||||
|
||||
/* Win10's initial SDK (the 10.0.10240.0 release) does not include references
|
||||
to Game Bar APIs, as the Game Bar was released via Win10 10.0.10586.0.
|
||||
|
||||
Declare its WinRT/COM interface here, to allow compilation with earlier
|
||||
Windows SDKs.
|
||||
*/
|
||||
MIDL_INTERFACE("1DB9A292-CC78-4173-BE45-B61E67283EA7")
|
||||
IGameBarStatics_ : public IInspectable
|
||||
{
|
||||
public:
|
||||
virtual HRESULT STDMETHODCALLTYPE add_VisibilityChanged(
|
||||
__FIEventHandler_1_IInspectable *handler,
|
||||
Windows::Foundation::EventRegistrationToken *token) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE remove_VisibilityChanged(
|
||||
Windows::Foundation::EventRegistrationToken token) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE add_IsInputRedirectedChanged(
|
||||
__FIEventHandler_1_IInspectable *handler,
|
||||
Windows::Foundation::EventRegistrationToken *token) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE remove_IsInputRedirectedChanged(
|
||||
Windows::Foundation::EventRegistrationToken token) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE get_Visible(
|
||||
boolean *value) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE get_IsInputRedirected(
|
||||
boolean *value) = 0;
|
||||
};
|
||||
|
||||
/* Declare the game bar's COM GUID */
|
||||
static GUID IID_IGameBarStatics_ = { MAKELONG(0xA292, 0x1DB9), 0xCC78, 0x4173, { 0xBE, 0x45, 0xB6, 0x1E, 0x67, 0x28, 0x3E, 0xA7 } };
|
||||
|
||||
/* Retrieves a pointer to the game bar, or NULL if it is not available.
|
||||
If a pointer is returned, it's ->Release() method must be called
|
||||
after the caller has finished using it.
|
||||
*/
|
||||
static IGameBarStatics_ *
|
||||
WINRT_GetGameBar()
|
||||
{
|
||||
wchar_t *wClassName = L"Windows.Gaming.UI.GameBar";
|
||||
HSTRING hClassName;
|
||||
IActivationFactory *pActivationFactory = NULL;
|
||||
IGameBarStatics_ *pGameBar = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
hr = ::WindowsCreateString(wClassName, (UINT32)wcslen(wClassName), &hClassName);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
hr = Windows::Foundation::GetActivationFactory(hClassName, &pActivationFactory);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
pActivationFactory->QueryInterface(IID_IGameBarStatics_, (void **) &pGameBar);
|
||||
|
||||
done:
|
||||
if (pActivationFactory) {
|
||||
pActivationFactory->Release();
|
||||
}
|
||||
if (hClassName) {
|
||||
::WindowsDeleteString(hClassName);
|
||||
}
|
||||
return pGameBar;
|
||||
}
|
||||
|
||||
static void
|
||||
WINRT_HandleGameBarIsInputRedirected_MainThread()
|
||||
{
|
||||
IGameBarStatics_ *gameBar;
|
||||
boolean isInputRedirected = 0;
|
||||
if (!WINRT_MainThreadDispatcher) {
|
||||
/* The game bar event handler has been deregistered! */
|
||||
return;
|
||||
}
|
||||
gameBar = WINRT_GetGameBar();
|
||||
if (!gameBar) {
|
||||
/* Shouldn't happen, but just in case... */
|
||||
return;
|
||||
}
|
||||
if (SUCCEEDED(gameBar->get_IsInputRedirected(&isInputRedirected))) {
|
||||
if ( ! isInputRedirected) {
|
||||
/* Input-control is now back to the SDL app. Restore the cursor,
|
||||
in case Windows does not (it does not in either Win10
|
||||
10.0.10240.0 or 10.0.10586.0, maybe later version(s) too.
|
||||
*/
|
||||
SDL_Cursor *cursor = SDL_GetCursor();
|
||||
SDL_SetCursor(cursor);
|
||||
}
|
||||
}
|
||||
gameBar->Release();
|
||||
}
|
||||
|
||||
static void
|
||||
WINRT_HandleGameBarIsInputRedirected_NonMainThread(Platform::Object ^ o1, Platform::Object ^o2)
|
||||
{
|
||||
Windows::UI::Core::CoreDispatcher ^dispatcher = WINRT_MainThreadDispatcher.Resolve<Windows::UI::Core::CoreDispatcher>();
|
||||
if (dispatcher) {
|
||||
dispatcher->RunAsync(
|
||||
Windows::UI::Core::CoreDispatcherPriority::Normal,
|
||||
ref new Windows::UI::Core::DispatchedHandler(&WINRT_HandleGameBarIsInputRedirected_MainThread));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
WINRT_InitGameBar(_THIS)
|
||||
{
|
||||
SDL_VideoData *driverdata = (SDL_VideoData *)_this->driverdata;
|
||||
IGameBarStatics_ *gameBar = WINRT_GetGameBar();
|
||||
if (gameBar) {
|
||||
/* GameBar.IsInputRedirected events can come in via something other than
|
||||
the main/SDL thread.
|
||||
|
||||
Get a WinRT 'CoreDispatcher' that can be used to call back into the
|
||||
SDL thread.
|
||||
*/
|
||||
WINRT_MainThreadDispatcher = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher;
|
||||
Windows::Foundation::EventHandler<Platform::Object ^> ^handler = \
|
||||
ref new Windows::Foundation::EventHandler<Platform::Object ^>(&WINRT_HandleGameBarIsInputRedirected_NonMainThread);
|
||||
__FIEventHandler_1_IInspectable * pHandler = reinterpret_cast<__FIEventHandler_1_IInspectable *>(handler);
|
||||
gameBar->add_IsInputRedirectedChanged(pHandler, &driverdata->gameBarIsInputRedirectedToken);
|
||||
gameBar->Release();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
WINRT_QuitGameBar(_THIS)
|
||||
{
|
||||
SDL_VideoData *driverdata;
|
||||
IGameBarStatics_ *gameBar;
|
||||
if (!_this || !_this->driverdata) {
|
||||
return;
|
||||
}
|
||||
gameBar = WINRT_GetGameBar();
|
||||
if (!gameBar) {
|
||||
return;
|
||||
}
|
||||
driverdata = (SDL_VideoData *)_this->driverdata;
|
||||
if (driverdata->gameBarIsInputRedirectedToken.Value) {
|
||||
gameBar->remove_IsInputRedirectedChanged(driverdata->gameBarIsInputRedirectedToken);
|
||||
driverdata->gameBarIsInputRedirectedToken.Value = 0;
|
||||
}
|
||||
WINRT_MainThreadDispatcher = nullptr;
|
||||
gameBar->Release();
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_WINRT */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
35
Engine/lib/sdl/src/video/winrt/SDL_winrtgamebar_cpp.h
Normal file
35
Engine/lib/sdl/src/video/winrt/SDL_winrtgamebar_cpp.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 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.
|
||||
*/
|
||||
#include "SDL_config.h"
|
||||
|
||||
#ifndef _SDL_winrtgamebar_h
|
||||
#define _SDL_winrtgamebar_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* These are exported as C++ functions, rather than C, to fix a compilation
|
||||
bug with MSVC 2013, for Windows 8.x builds. */
|
||||
extern void WINRT_InitGameBar(_THIS);
|
||||
extern void WINRT_QuitGameBar(_THIS);
|
||||
#endif
|
||||
|
||||
#endif /* _SDL_winrtmouse_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -383,4 +383,48 @@ WINRT_ProcessCharacterReceivedEvent(Windows::UI::Core::CharacterReceivedEventArg
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WIN10
|
||||
|
||||
SDL_bool WINRT_HasScreenKeyboardSupport(_THIS)
|
||||
{
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
void WINRT_ShowScreenKeyboard(_THIS, SDL_Window *window)
|
||||
{
|
||||
using namespace Windows::UI::ViewManagement;
|
||||
InputPane ^ inputPane = InputPane::GetForCurrentView();
|
||||
if (inputPane) {
|
||||
inputPane->TryShow();
|
||||
}
|
||||
}
|
||||
|
||||
void WINRT_HideScreenKeyboard(_THIS, SDL_Window *window)
|
||||
{
|
||||
using namespace Windows::UI::ViewManagement;
|
||||
InputPane ^ inputPane = InputPane::GetForCurrentView();
|
||||
if (inputPane) {
|
||||
inputPane->TryHide();
|
||||
}
|
||||
}
|
||||
|
||||
SDL_bool WINRT_IsScreenKeyboardShown(_THIS, SDL_Window *window)
|
||||
{
|
||||
using namespace Windows::UI::ViewManagement;
|
||||
InputPane ^ inputPane = InputPane::GetForCurrentView();
|
||||
if (inputPane) {
|
||||
// dludwig@pobox.com: checking inputPane->Visible doesn't seem to detect visibility,
|
||||
// at least not on the Windows Phone 10.0.10240.0 emulator. Checking
|
||||
// the size of inputPane->OccludedRect, however, does seem to work.
|
||||
Windows::Foundation::Rect rect = inputPane->OccludedRect;
|
||||
if (rect.Width > 0 && rect.Height > 0) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
}
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
#endif // NTDDI_VERSION >= ...
|
||||
|
||||
#endif // SDL_VIDEO_DRIVER_WINRT
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
* Windows includes:
|
||||
*/
|
||||
#include <Windows.h>
|
||||
#include <windows.ui.core.h>
|
||||
using namespace Windows::UI::Core;
|
||||
using Windows::UI::Core::CoreCursor;
|
||||
|
||||
|
|
@ -116,11 +117,69 @@ WINRT_ShowCursor(SDL_Cursor * cursor)
|
|||
return 0;
|
||||
}
|
||||
|
||||
CoreWindow ^ coreWindow = CoreWindow::GetForCurrentThread();
|
||||
if (cursor) {
|
||||
CoreCursor ^* theCursor = (CoreCursor ^*) cursor->driverdata;
|
||||
CoreWindow::GetForCurrentThread()->PointerCursor = *theCursor;
|
||||
coreWindow->PointerCursor = *theCursor;
|
||||
} else {
|
||||
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
|
||||
// HACK ALERT: TL;DR - Hiding the cursor in WinRT/UWP apps is weird, and
|
||||
// a Win32-style cursor resource file must be directly included in apps,
|
||||
// otherwise hiding the cursor will cause mouse-motion data to never be
|
||||
// received.
|
||||
//
|
||||
// Here's the lengthy explanation:
|
||||
//
|
||||
// There are two ways to hide a cursor in WinRT/UWP apps.
|
||||
// Both involve setting the WinRT CoreWindow's (which is somewhat analogous
|
||||
// to a Win32 HWND) 'PointerCursor' property.
|
||||
//
|
||||
// The first way to hide a cursor sets PointerCursor to nullptr. This
|
||||
// is, arguably, the easiest to implement for an app. It does have an
|
||||
// unfortunate side-effect: it'll prevent mouse-motion events from being
|
||||
// sent to the app (via CoreWindow).
|
||||
//
|
||||
// The second way to hide a cursor sets PointerCursor to a transparent
|
||||
// cursor. This allows mouse-motion events to be sent to the app, but is
|
||||
// more difficult to set up, as:
|
||||
// 1. WinRT/UWP, while providing a few stock cursors, does not provide
|
||||
// a completely transparent cursor.
|
||||
// 2. WinRT/UWP allows apps to provide custom-built cursors, but *ONLY*
|
||||
// if they are linked directly inside the app, via Win32-style
|
||||
// cursor resource files. APIs to create cursors at runtime are
|
||||
// not provided to apps, and attempting to link-to or use Win32
|
||||
// cursor-creation APIs could cause an app to fail Windows Store
|
||||
// certification.
|
||||
//
|
||||
// SDL can use either means of hiding the cursor. It provides a Win32-style
|
||||
// set of cursor resource files in its source distribution, inside
|
||||
// src/main/winrt/. If those files are linked to an SDL-for-WinRT/UWP app
|
||||
// (by including them in a MSVC project, for example), SDL will attempt to
|
||||
// use those, if and when the cursor is hidden via SDL APIs. If those
|
||||
// files are not linked in, SDL will attempt to hide the cursor via the
|
||||
// 'set PointerCursor to nullptr' means (which, if you recall, causes
|
||||
// mouse-motion data to NOT be sent to the app!).
|
||||
//
|
||||
// Tech notes:
|
||||
// - SDL's blank cursor resource uses a resource ID of 5000.
|
||||
// - SDL's cursor resources consist of the following two files:
|
||||
// - src/main/winrt/SDL2-WinRTResource_BlankCursor.cur -- cursor pixel data
|
||||
// - src/main/winrt/SDL2-WinRTResources.rc -- declares the cursor resource, and its ID (of 5000)
|
||||
//
|
||||
|
||||
const unsigned int win32CursorResourceID = 5000;
|
||||
CoreCursor ^ blankCursor = ref new CoreCursor(CoreCursorType::Custom, win32CursorResourceID);
|
||||
|
||||
// Set 'PointerCursor' to 'blankCursor' in a way that shouldn't throw
|
||||
// an exception if the app hasn't loaded that resource.
|
||||
ABI::Windows::UI::Core::ICoreCursor * iblankCursor = reinterpret_cast<ABI::Windows::UI::Core::ICoreCursor *>(blankCursor);
|
||||
ABI::Windows::UI::Core::ICoreWindow * icoreWindow = reinterpret_cast<ABI::Windows::UI::Core::ICoreWindow *>(coreWindow);
|
||||
HRESULT hr = icoreWindow->put_PointerCursor(iblankCursor);
|
||||
if (FAILED(hr)) {
|
||||
// The app doesn't contain the cursor resource, or some other error
|
||||
// occurred. Just use the other, but mouse-motion-preventing, means of
|
||||
// hiding the cursor.
|
||||
coreWindow->PointerCursor = nullptr;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
/* Windows includes */
|
||||
#include <agile.h>
|
||||
#include <windows.graphics.display.h>
|
||||
#include <windows.system.display.h>
|
||||
#include <dxgi.h>
|
||||
#include <dxgi1_2.h>
|
||||
using namespace Windows::ApplicationModel::Core;
|
||||
|
|
@ -41,7 +42,8 @@ using namespace Windows::UI::ViewManagement;
|
|||
|
||||
|
||||
/* [re]declare Windows GUIDs locally, to limit the amount of external lib(s) SDL has to link to */
|
||||
static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48,{ 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } };
|
||||
static const GUID IID_IDisplayRequest = { 0xe5732044, 0xf49f, 0x4b60, { 0x8d, 0xd4, 0x5e, 0x7e, 0x3a, 0x63, 0x2a, 0xc0 } };
|
||||
static const GUID IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } };
|
||||
|
||||
|
||||
/* SDL includes */
|
||||
|
|
@ -61,6 +63,7 @@ extern "C" {
|
|||
#include "../../core/winrt/SDL_winrtapp_xaml.h"
|
||||
#include "SDL_winrtvideo_cpp.h"
|
||||
#include "SDL_winrtevents_c.h"
|
||||
#include "SDL_winrtgamebar_cpp.h"
|
||||
#include "SDL_winrtmouse_c.h"
|
||||
#include "SDL_main.h"
|
||||
#include "SDL_system.h"
|
||||
|
|
@ -82,6 +85,11 @@ static void WINRT_DestroyWindow(_THIS, SDL_Window * window);
|
|||
static SDL_bool WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info);
|
||||
|
||||
|
||||
/* Misc functions */
|
||||
static ABI::Windows::System::Display::IDisplayRequest * WINRT_CreateDisplayRequest(_THIS);
|
||||
extern void WINRT_SuspendScreenSaver(_THIS);
|
||||
|
||||
|
||||
/* SDL-internal globals: */
|
||||
SDL_Window * WINRT_GlobalSDLWindow = NULL;
|
||||
|
||||
|
|
@ -118,18 +126,15 @@ WINRT_CreateDevice(int devindex)
|
|||
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
|
||||
if (!device) {
|
||||
SDL_OutOfMemory();
|
||||
if (device) {
|
||||
SDL_free(device);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
data = (SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
|
||||
if (!data) {
|
||||
SDL_OutOfMemory();
|
||||
SDL_free(device);
|
||||
return (0);
|
||||
}
|
||||
SDL_zerop(data);
|
||||
device->driverdata = data;
|
||||
|
||||
/* Set the function pointers */
|
||||
|
|
@ -142,6 +147,15 @@ WINRT_CreateDevice(int devindex)
|
|||
device->SetDisplayMode = WINRT_SetDisplayMode;
|
||||
device->PumpEvents = WINRT_PumpEvents;
|
||||
device->GetWindowWMInfo = WINRT_GetWindowWMInfo;
|
||||
device->SuspendScreenSaver = WINRT_SuspendScreenSaver;
|
||||
|
||||
#if NTDDI_VERSION >= NTDDI_WIN10
|
||||
device->HasScreenKeyboardSupport = WINRT_HasScreenKeyboardSupport;
|
||||
device->ShowScreenKeyboard = WINRT_ShowScreenKeyboard;
|
||||
device->HideScreenKeyboard = WINRT_HideScreenKeyboard;
|
||||
device->IsScreenKeyboardShown = WINRT_IsScreenKeyboardShown;
|
||||
#endif
|
||||
|
||||
#ifdef SDL_VIDEO_OPENGL_EGL
|
||||
device->GL_LoadLibrary = WINRT_GLES_LoadLibrary;
|
||||
device->GL_GetProcAddress = WINRT_GLES_GetProcAddress;
|
||||
|
|
@ -167,12 +181,17 @@ VideoBootStrap WINRT_bootstrap = {
|
|||
int
|
||||
WINRT_VideoInit(_THIS)
|
||||
{
|
||||
SDL_VideoData * driverdata = (SDL_VideoData *) _this->driverdata;
|
||||
if (WINRT_InitModes(_this) < 0) {
|
||||
return -1;
|
||||
}
|
||||
WINRT_InitMouse(_this);
|
||||
WINRT_InitTouch(_this);
|
||||
|
||||
WINRT_InitGameBar(_this);
|
||||
if (driverdata) {
|
||||
/* Initialize screensaver-disabling support */
|
||||
driverdata->displayRequest = WINRT_CreateDisplayRequest(_this);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -414,6 +433,12 @@ WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
|||
void
|
||||
WINRT_VideoQuit(_THIS)
|
||||
{
|
||||
SDL_VideoData * driverdata = (SDL_VideoData *) _this->driverdata;
|
||||
if (driverdata && driverdata->displayRequest) {
|
||||
driverdata->displayRequest->Release();
|
||||
driverdata->displayRequest = NULL;
|
||||
}
|
||||
WINRT_QuitGameBar(_this);
|
||||
WINRT_QuitMouse(_this);
|
||||
}
|
||||
|
||||
|
|
@ -483,7 +508,7 @@ WINRT_DetectWindowFlags(SDL_Window * window)
|
|||
// data->coreWindow->PointerPosition is not supported on WinPhone 8.0
|
||||
latestFlags |= SDL_WINDOW_MOUSE_FOCUS;
|
||||
#else
|
||||
if (data->coreWindow->Bounds.Contains(data->coreWindow->PointerPosition)) {
|
||||
if (data->coreWindow->Visible && data->coreWindow->Bounds.Contains(data->coreWindow->PointerPosition)) {
|
||||
latestFlags |= SDL_WINDOW_MOUSE_FOCUS;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -753,6 +778,65 @@ WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
|
|||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
static ABI::Windows::System::Display::IDisplayRequest *
|
||||
WINRT_CreateDisplayRequest(_THIS)
|
||||
{
|
||||
/* Setup a WinRT DisplayRequest object, usable for enabling/disabling screensaver requests */
|
||||
wchar_t *wClassName = L"Windows.System.Display.DisplayRequest";
|
||||
HSTRING hClassName;
|
||||
IActivationFactory *pActivationFactory = NULL;
|
||||
IInspectable * pDisplayRequestRaw = nullptr;
|
||||
ABI::Windows::System::Display::IDisplayRequest * pDisplayRequest = nullptr;
|
||||
HRESULT hr;
|
||||
|
||||
hr = ::WindowsCreateString(wClassName, (UINT32)wcslen(wClassName), &hClassName);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
hr = Windows::Foundation::GetActivationFactory(hClassName, &pActivationFactory);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
hr = pActivationFactory->ActivateInstance(&pDisplayRequestRaw);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
hr = pDisplayRequestRaw->QueryInterface(IID_IDisplayRequest, (void **) &pDisplayRequest);
|
||||
if (FAILED(hr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (pDisplayRequestRaw) {
|
||||
pDisplayRequestRaw->Release();
|
||||
}
|
||||
if (pActivationFactory) {
|
||||
pActivationFactory->Release();
|
||||
}
|
||||
if (hClassName) {
|
||||
::WindowsDeleteString(hClassName);
|
||||
}
|
||||
|
||||
return pDisplayRequest;
|
||||
}
|
||||
|
||||
void
|
||||
WINRT_SuspendScreenSaver(_THIS)
|
||||
{
|
||||
SDL_VideoData *driverdata = (SDL_VideoData *)_this->driverdata;
|
||||
if (driverdata && driverdata->displayRequest) {
|
||||
ABI::Windows::System::Display::IDisplayRequest * displayRequest = (ABI::Windows::System::Display::IDisplayRequest *) driverdata->displayRequest;
|
||||
if (_this->suspend_screensaver) {
|
||||
displayRequest->RequestActive();
|
||||
} else {
|
||||
displayRequest->RequestRelease();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_WINRT */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -46,6 +46,17 @@ typedef struct SDL_VideoData {
|
|||
* passed to eglGetDisplay and eglCreateWindowSurface:
|
||||
*/
|
||||
IUnknown *winrtEglWindow;
|
||||
|
||||
/* Event token(s), for unregistering WinRT event handler(s).
|
||||
These are just a struct with a 64-bit integer inside them
|
||||
*/
|
||||
Windows::Foundation::EventRegistrationToken gameBarIsInputRedirectedToken;
|
||||
|
||||
/* A WinRT DisplayRequest, used for implementing SDL_*ScreenSaver() functions.
|
||||
* This is really a pointer to a 'ABI::Windows::System::Display::IDisplayRequest *',
|
||||
* It's casted to 'IUnknown *', to help with building SDL.
|
||||
*/
|
||||
IUnknown *displayRequest;
|
||||
} SDL_VideoData;
|
||||
|
||||
/* The global, WinRT, SDL Window.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue