src/video/winrt/SDL_winrtvideo_cpp.h
author David Ludwig <dludwig@pobox.com>
Thu, 26 Nov 2015 00:41:39 -0500
changeset 9924 355cccccc7dc
parent 9619 b94b6d0bff0f
child 9931 0bb3dd1c95f2
permissions -rw-r--r--
WinRT: lots of display and windowing related fixes

This change-set fixes a lot of windowing related bugs, especially with
regards to Windows 8.x apps running on Windows 10 (which was the driver for
this work). The primary fixes include:
* listed display modes were wrong, especially when launching apps into a
non-fullscreen space
* reported window flags were often wrong, especially on Windows 10
* fullscreen/windowed mode switches weren't failing (they are not
programmatically possible in Win 8.x apps).
dludwig@8512
     1
/*
dludwig@8512
     2
  Simple DirectMedia Layer
slouken@9619
     3
  Copyright (C) 1997-2015 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@8663
    49
} SDL_VideoData;
dludwig@8512
    50
dludwig@8515
    51
/* The global, WinRT, SDL Window.
dludwig@8515
    52
   For now, SDL/WinRT only supports one window (due to platform limitations of
dludwig@8515
    53
   WinRT.
dludwig@8515
    54
*/
dludwig@8515
    55
extern SDL_Window * WINRT_GlobalSDLWindow;
dludwig@8515
    56
dludwig@9924
    57
/* Updates one or more SDL_Window flags, by querying the OS' native windowing APIs.
dludwig@9924
    58
   SDL_Window flags that can be updated should be specified in 'mask'.
slouken@8582
    59
*/
dludwig@9924
    60
extern void WINRT_UpdateWindowFlags(SDL_Window * window, Uint32 mask);
dludwig@9924
    61
extern "C" Uint32 WINRT_DetectWindowFlags(SDL_Window * window);  /* detects flags w/o applying them */
slouken@8582
    62
slouken@8582
    63
/* Display mode internals */
dludwig@9924
    64
//typedef struct
dludwig@9924
    65
//{
dludwig@9924
    66
//    Windows::Graphics::Display::DisplayOrientations currentOrientation;
dludwig@9924
    67
//} SDL_DisplayModeData;
dludwig@8515
    68
dludwig@8512
    69
#ifdef __cplusplus_winrt
dludwig@8512
    70
dludwig@8755
    71
/* A convenience macro to get a WinRT display property */
dludwig@8755
    72
#if NTDDI_VERSION > NTDDI_WIN8
dludwig@8755
    73
#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayInformation::GetForCurrentView()->NAME)
dludwig@8755
    74
#else
dludwig@8755
    75
#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayProperties::NAME)
dludwig@8755
    76
#endif
dludwig@8755
    77
dludwig@9924
    78
/* Converts DIPS to physical pixels */
dludwig@9924
    79
#define WINRT_DIPS_TO_PHYSICAL_PIXELS(DIPS) ((int)(0.5f + (((float)(DIPS) * (float)WINRT_DISPLAY_PROPERTY(LogicalDpi)) / 96.f)))
dludwig@9924
    80
dludwig@9924
    81
dludwig@8512
    82
/* Internal window data */
slouken@8582
    83
struct SDL_WindowData
slouken@8582
    84
{
slouken@8582
    85
    SDL_Window *sdlWindow;
slouken@8582
    86
    Platform::Agile<Windows::UI::Core::CoreWindow> coreWindow;
slouken@8582
    87
#ifdef SDL_VIDEO_OPENGL_EGL
slouken@8582
    88
    EGLSurface egl_surface;
slouken@8582
    89
#endif
dludwig@9924
    90
#if SDL_WINRT_USE_APPLICATIONVIEW
dludwig@9924
    91
    Windows::UI::ViewManagement::ApplicationView ^ appView;
dludwig@9924
    92
#endif
dludwig@8512
    93
};
dludwig@8512
    94
dludwig@8512
    95
#endif // ifdef __cplusplus_winrt