src/video/winrt/SDL_winrtvideo_cpp.h
author David Ludwig <dludwig@pobox.com>
Sat, 20 Aug 2016 13:46:45 -0400
changeset 10222 29d7289e9055
parent 9998 f67cf37e9cd4
child 10293 db77073d402d
permissions -rw-r--r--
WinRT: fixed bug where Win10 GameBar, when shown + hidden, might not restore a cursor's hidden state

The repro steps were this:
1. run an sdl2 winrt/uwp app, on Win10, v10.0.10586.0 or higher
2. hide the cursor, via a call to SDL_ShowCursor(0)
3. make the Win10 game bar appear, by pressing the Windows + G hotkey
4. observe that the mouse cursor appears, in order to interact with the
game bar (this is expected behavior)
5. make the Win10 game bar disappear, either by pressing the Windows + G hotkey
again, or clicking somewhere in the app

EXPECTED RESULT: cursor disappears, as game bar disappears

ACTUAL RESULT: cursor didn't always disappear
dludwig@8512
     1
/*
dludwig@8512
     2
  Simple DirectMedia Layer
slouken@9998
     3
  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
dludwig@8512
     4
dludwig@8512
     5
  This software is provided 'as-is', without any express or implied
dludwig@8512
     6
  warranty.  In no event will the authors be held liable for any damages
dludwig@8512
     7
  arising from the use of this software.
dludwig@8512
     8
dludwig@8512
     9
  Permission is granted to anyone to use this software for any purpose,
dludwig@8512
    10
  including commercial applications, and to alter it and redistribute it
dludwig@8512
    11
  freely, subject to the following restrictions:
dludwig@8512
    12
dludwig@8512
    13
  1. The origin of this software must not be misrepresented; you must not
dludwig@8512
    14
     claim that you wrote the original software. If you use this software
dludwig@8512
    15
     in a product, an acknowledgment in the product documentation would be
dludwig@8512
    16
     appreciated but is not required.
dludwig@8512
    17
  2. Altered source versions must be plainly marked as such, and must not be
dludwig@8512
    18
     misrepresented as being the original software.
dludwig@8512
    19
  3. This notice may not be removed or altered from any source distribution.
dludwig@8512
    20
*/
dludwig@8512
    21
dludwig@8512
    22
/* Windows includes: */
dludwig@8512
    23
#include <windows.h>
dludwig@8512
    24
#ifdef __cplusplus_winrt
dludwig@8512
    25
#include <agile.h>
dludwig@8512
    26
#endif
dludwig@8512
    27
dludwig@8512
    28
/* SDL includes: */
dludwig@8541
    29
#include "SDL_video.h"
dludwig@8512
    30
#include "SDL_events.h"
dludwig@8512
    31
dludwig@9924
    32
#if NTDDI_VERSION >= NTDDI_WINBLUE  /* ApplicationView's functionality only becomes
dludwig@9924
    33
                                       useful for SDL in Win[Phone] 8.1 and up.
dludwig@9924
    34
                                       Plus, it is not available at all in WinPhone 8.0. */
dludwig@9924
    35
#define SDL_WINRT_USE_APPLICATIONVIEW 1
dludwig@9924
    36
#endif
dludwig@9924
    37
dludwig@8541
    38
extern "C" {
dludwig@8541
    39
#include "../SDL_sysvideo.h"
dludwig@8545
    40
#include "../SDL_egl_c.h"
dludwig@8541
    41
}
dludwig@8541
    42
dludwig@8663
    43
/* Private display data */
dludwig@8663
    44
typedef struct SDL_VideoData {
dludwig@8663
    45
    /* An object created by ANGLE/WinRT (OpenGL ES 2 for WinRT) that gets
dludwig@8663
    46
     * passed to eglGetDisplay and eglCreateWindowSurface:
dludwig@8663
    47
     */
dludwig@8663
    48
    IUnknown *winrtEglWindow;
dludwig@10222
    49
dludwig@10222
    50
    /* Event token(s), for unregistering WinRT event handler(s).
dludwig@10222
    51
       These are just a struct with a 64-bit integer inside them
dludwig@10222
    52
    */
dludwig@10222
    53
    Windows::Foundation::EventRegistrationToken gameBarIsInputRedirectedToken;
dludwig@8663
    54
} SDL_VideoData;
dludwig@8512
    55
dludwig@8515
    56
/* The global, WinRT, SDL Window.
dludwig@8515
    57
   For now, SDL/WinRT only supports one window (due to platform limitations of
dludwig@8515
    58
   WinRT.
dludwig@8515
    59
*/
dludwig@8515
    60
extern SDL_Window * WINRT_GlobalSDLWindow;
dludwig@8515
    61
dludwig@9924
    62
/* Updates one or more SDL_Window flags, by querying the OS' native windowing APIs.
dludwig@9924
    63
   SDL_Window flags that can be updated should be specified in 'mask'.
slouken@8582
    64
*/
dludwig@9924
    65
extern void WINRT_UpdateWindowFlags(SDL_Window * window, Uint32 mask);
dludwig@9924
    66
extern "C" Uint32 WINRT_DetectWindowFlags(SDL_Window * window);  /* detects flags w/o applying them */
slouken@8582
    67
slouken@8582
    68
/* Display mode internals */
dludwig@9924
    69
//typedef struct
dludwig@9924
    70
//{
dludwig@9924
    71
//    Windows::Graphics::Display::DisplayOrientations currentOrientation;
dludwig@9924
    72
//} SDL_DisplayModeData;
dludwig@8515
    73
dludwig@8512
    74
#ifdef __cplusplus_winrt
dludwig@8512
    75
dludwig@8755
    76
/* A convenience macro to get a WinRT display property */
dludwig@8755
    77
#if NTDDI_VERSION > NTDDI_WIN8
dludwig@8755
    78
#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayInformation::GetForCurrentView()->NAME)
dludwig@8755
    79
#else
dludwig@8755
    80
#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayProperties::NAME)
dludwig@8755
    81
#endif
dludwig@8755
    82
dludwig@9931
    83
/* Converts DIPS to/from physical pixels */
dludwig@9931
    84
#define WINRT_DIPS_TO_PHYSICAL_PIXELS(DIPS)     ((int)(0.5f + (((float)(DIPS) * (float)WINRT_DISPLAY_PROPERTY(LogicalDpi)) / 96.f)))
dludwig@9931
    85
#define WINRT_PHYSICAL_PIXELS_TO_DIPS(PHYSPIX)  (((float)(PHYSPIX) * 96.f)/WINRT_DISPLAY_PROPERTY(LogicalDpi))
dludwig@9924
    86
dludwig@8512
    87
/* Internal window data */
slouken@8582
    88
struct SDL_WindowData
slouken@8582
    89
{
slouken@8582
    90
    SDL_Window *sdlWindow;
slouken@8582
    91
    Platform::Agile<Windows::UI::Core::CoreWindow> coreWindow;
slouken@8582
    92
#ifdef SDL_VIDEO_OPENGL_EGL
slouken@8582
    93
    EGLSurface egl_surface;
slouken@8582
    94
#endif
dludwig@9924
    95
#if SDL_WINRT_USE_APPLICATIONVIEW
dludwig@9924
    96
    Windows::UI::ViewManagement::ApplicationView ^ appView;
dludwig@9924
    97
#endif
dludwig@8512
    98
};
dludwig@8512
    99
dludwig@8512
   100
#endif // ifdef __cplusplus_winrt