src/video/SDL_sysvideo.h
author Ryan C. Gordon <icculus@icculus.org>
Thu, 09 Apr 2015 22:28:37 -0400
changeset 9541 cf8fab52e33b
parent 9447 728a4bf8e02f
child 9619 b94b6d0bff0f
permissions -rw-r--r--
Merged Alex Szpakowski's iOS-improvement branch to default.

Fixes Bugzilla #2798.
Fixes Bugzilla #2212.
Fixes Bugzilla #2826.
Fixes Bugzilla #2661.
Fixes Bugzilla #1885.
Fixes Bugzilla #1578.
Fixes Bugzilla #2751.

(whew!)

Notable changes, from Alex's notes:

- The SDL_WINDOW_ALLOW_HIGHDPI flag is now needed (along with SDL_GL_GetDrawableSize or SDL_GetRendererOutputSize) to use Retina / high DPI resolutions, bringing SDL’s Retina-related behavior on iOS in line with Mac OS X. Window dimensions and display modes are now in the “points” (non-high DPI) coordinate system rather than pixels, whereas SDL_GL_GetDrawableSize is in pixels.

- Reworked the custom extended launch screen code:
- It now hides after the first SDL_PumpEvents call rather than SDL_CreateWindow, and it fades out in a similar manner to the system launch screen behavior.
- It now mirrors the system launch screen behavior when deciding which image to display: it falls back to using the Launch Images dictionary in Info.plist if the iOS 8+ launch screen nib isn’t available, and if the Launch Images dictionary doesn’t exist it uses the old standard launch image names.
- The extended launch screen can now be disabled via the SDL_IPHONE_LAUNCHSCREEN define in SDL_config_iphoneos.h.

- Added support for SDL_HINT_ACCELEROMETER_AS_JOYSTICK.

- Added access to a window view's renderbuffer and framebuffer to syswm.

- Added OpenGL ES debug labels for the Renderbuffer and Framebuffer Objects created with SDL_GL_CreateContext.

- Added support for sRGB OpenGL ES contexts on iOS 7+.

- Updated OpenGL ES contexts to support native-resolution rendering (when SDL_WINDOW_ALLOW_HIGHDPI is enabled) on the iPhone 6 Plus, i.e. 1080x1920 rather than 1242x2208.

- Updated SDL_GL_CreateContext, SDL_GL_SwapWindow, SDL_GL_MakeCurrent, and SDL_GL_DeleteContext to be more robust.

- Updated SDL windows to display a UIView at all times, even when an OpenGL context is not active. This allows rotation, touch events, and other windowing-related events to work properly without an active OpenGL context. It also makes it easier to use SDL_GetWindowWMInfo after creating a SDL window.

- Updated the iOS-specific Objective-C code to use cleaner and more modern language features and APIs, including ARC instead of manual reference counting.

- Updated SDL_HINT_ORIENTATIONS to allow disabling custom orientations if the hint is set with no valid orientation names.

- Fixed several rotation and orientation bugs with windows and display modes, especially in iOS 8+.

- Fixed SDL_SetWindowFullscreen failing to update the status bar visibility on iOS 7+.

- Fixed the orientation of the offset applied to the window’s view when the onscreen keyboard is shown in iOS 8+.

- Fixed SDL_IsScreenKeyboardShown (patch by Phil Hassey.)

- Fixed several major memory leaks caused by missing autorelease pool blocks in the iOS-specific Objective-C code.

- Removed several dead code paths.

- The iOS 7 SDK (Xcode 5) or newer is now required to build SDL for iOS.
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
     4 
     5   This software is provided 'as-is', without any express or implied
     6   warranty.  In no event will the authors be held liable for any damages
     7   arising from the use of this software.
     8 
     9   Permission is granted to anyone to use this software for any purpose,
    10   including commercial applications, and to alter it and redistribute it
    11   freely, subject to the following restrictions:
    12 
    13   1. The origin of this software must not be misrepresented; you must not
    14      claim that you wrote the original software. If you use this software
    15      in a product, an acknowledgment in the product documentation would be
    16      appreciated but is not required.
    17   2. Altered source versions must be plainly marked as such, and must not be
    18      misrepresented as being the original software.
    19   3. This notice may not be removed or altered from any source distribution.
    20 */
    21 #include "../SDL_internal.h"
    22 
    23 #ifndef _SDL_sysvideo_h
    24 #define _SDL_sysvideo_h
    25 
    26 #include "SDL_messagebox.h"
    27 #include "SDL_shape.h"
    28 #include "SDL_thread.h"
    29 
    30 /* The SDL video driver */
    31 
    32 typedef struct SDL_WindowShaper SDL_WindowShaper;
    33 typedef struct SDL_ShapeDriver SDL_ShapeDriver;
    34 typedef struct SDL_VideoDisplay SDL_VideoDisplay;
    35 typedef struct SDL_VideoDevice SDL_VideoDevice;
    36 
    37 /* Define the SDL window-shaper structure */
    38 struct SDL_WindowShaper
    39 {
    40     /* The window associated with the shaper */
    41     SDL_Window *window;
    42 
    43     /* The user's specified coordinates for the window, for once we give it a shape. */
    44     Uint32 userx,usery;
    45 
    46     /* The parameters for shape calculation. */
    47     SDL_WindowShapeMode mode;
    48 
    49     /* Has this window been assigned a shape? */
    50     SDL_bool hasshape;
    51 
    52     void *driverdata;
    53 };
    54 
    55 /* Define the SDL shape driver structure */
    56 struct SDL_ShapeDriver
    57 {
    58     SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);
    59     int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
    60     int (*ResizeWindowShape)(SDL_Window *window);
    61 };
    62 
    63 typedef struct SDL_WindowUserData
    64 {
    65     char *name;
    66     void *data;
    67     struct SDL_WindowUserData *next;
    68 } SDL_WindowUserData;
    69 
    70 /* Define the SDL window structure, corresponding to toplevel windows */
    71 struct SDL_Window
    72 {
    73     const void *magic;
    74     Uint32 id;
    75     char *title;
    76     SDL_Surface *icon;
    77     int x, y;
    78     int w, h;
    79     int min_w, min_h;
    80     int max_w, max_h;
    81     Uint32 flags;
    82     Uint32 last_fullscreen_flags;
    83 
    84     /* Stored position and size for windowed mode */
    85     SDL_Rect windowed;
    86 
    87     SDL_DisplayMode fullscreen_mode;
    88 
    89     float brightness;
    90     Uint16 *gamma;
    91     Uint16 *saved_gamma;        /* (just offset into gamma) */
    92 
    93     SDL_Surface *surface;
    94     SDL_bool surface_valid;
    95 
    96     SDL_bool is_hiding;
    97     SDL_bool is_destroying;
    98 
    99     SDL_WindowShaper *shaper;
   100 
   101     SDL_HitTest hit_test;
   102     void *hit_test_data;
   103 
   104     SDL_WindowUserData *data;
   105 
   106     void *driverdata;
   107 
   108     SDL_Window *prev;
   109     SDL_Window *next;
   110 };
   111 #define FULLSCREEN_VISIBLE(W) \
   112     (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
   113      ((W)->flags & SDL_WINDOW_SHOWN) && \
   114      !((W)->flags & SDL_WINDOW_MINIMIZED))
   115 
   116 /*
   117  * Define the SDL display structure This corresponds to physical monitors
   118  * attached to the system.
   119  */
   120 struct SDL_VideoDisplay
   121 {
   122     char *name;
   123     int max_display_modes;
   124     int num_display_modes;
   125     SDL_DisplayMode *display_modes;
   126     SDL_DisplayMode desktop_mode;
   127     SDL_DisplayMode current_mode;
   128 
   129     SDL_Window *fullscreen_window;
   130 
   131     SDL_VideoDevice *device;
   132 
   133     void *driverdata;
   134 };
   135 
   136 /* Forward declaration */
   137 struct SDL_SysWMinfo;
   138 
   139 /* Define the SDL video driver structure */
   140 #define _THIS   SDL_VideoDevice *_this
   141 
   142 struct SDL_VideoDevice
   143 {
   144     /* * * */
   145     /* The name of this video driver */
   146     const char *name;
   147 
   148     /* * * */
   149     /* Initialization/Query functions */
   150 
   151     /*
   152      * Initialize the native video subsystem, filling in the list of
   153      * displays for this driver, returning 0 or -1 if there's an error.
   154      */
   155     int (*VideoInit) (_THIS);
   156 
   157     /*
   158      * Reverse the effects VideoInit() -- called if VideoInit() fails or
   159      * if the application is shutting down the video subsystem.
   160      */
   161     void (*VideoQuit) (_THIS);
   162 
   163     /* * * */
   164     /*
   165      * Display functions
   166      */
   167 
   168     /*
   169      * Get the bounds of a display
   170      */
   171     int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   172 
   173     /*
   174      * Get a list of the available display modes for a display.
   175      */
   176     void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
   177 
   178     /*
   179      * Setting the display mode is independent of creating windows, so
   180      * when the display mode is changed, all existing windows should have
   181      * their data updated accordingly, including the display surfaces
   182      * associated with them.
   183      */
   184     int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
   185 
   186     /* * * */
   187     /*
   188      * Window functions
   189      */
   190     int (*CreateWindow) (_THIS, SDL_Window * window);
   191     int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
   192     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   193     void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
   194     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   195     void (*SetWindowSize) (_THIS, SDL_Window * window);
   196     void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
   197     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
   198     void (*ShowWindow) (_THIS, SDL_Window * window);
   199     void (*HideWindow) (_THIS, SDL_Window * window);
   200     void (*RaiseWindow) (_THIS, SDL_Window * window);
   201     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   202     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   203     void (*RestoreWindow) (_THIS, SDL_Window * window);
   204     void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
   205     void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
   206     int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
   207     int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
   208     void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
   209     void (*DestroyWindow) (_THIS, SDL_Window * window);
   210     int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
   211     int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
   212     void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
   213     void (*OnWindowEnter) (_THIS, SDL_Window * window);
   214 
   215     /* * * */
   216     /*
   217      * Shaped-window functions
   218      */
   219     SDL_ShapeDriver shape_driver;
   220 
   221     /* Get some platform dependent window information */
   222     SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   223                                 struct SDL_SysWMinfo * info);
   224 
   225     /* * * */
   226     /*
   227      * OpenGL support
   228      */
   229     int (*GL_LoadLibrary) (_THIS, const char *path);
   230     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   231     void (*GL_UnloadLibrary) (_THIS);
   232       SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
   233     int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
   234     void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   235     int (*GL_SetSwapInterval) (_THIS, int interval);
   236     int (*GL_GetSwapInterval) (_THIS);
   237     void (*GL_SwapWindow) (_THIS, SDL_Window * window);
   238     void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
   239 
   240     /* * * */
   241     /*
   242      * Event manager functions
   243      */
   244     void (*PumpEvents) (_THIS);
   245 
   246     /* Suspend the screensaver */
   247     void (*SuspendScreenSaver) (_THIS);
   248 
   249     /* Text input */
   250     void (*StartTextInput) (_THIS);
   251     void (*StopTextInput) (_THIS);
   252     void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
   253 
   254     /* Screen keyboard */
   255     SDL_bool (*HasScreenKeyboardSupport) (_THIS);
   256     void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
   257     void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
   258     SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
   259 
   260     /* Clipboard */
   261     int (*SetClipboardText) (_THIS, const char *text);
   262     char * (*GetClipboardText) (_THIS);
   263     SDL_bool (*HasClipboardText) (_THIS);
   264 
   265     /* MessageBox */
   266     int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
   267 
   268     /* Hit-testing */
   269     int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);
   270 
   271     /* * * */
   272     /* Data common to all drivers */
   273     SDL_bool suspend_screensaver;
   274     int num_displays;
   275     SDL_VideoDisplay *displays;
   276     SDL_Window *windows;
   277     SDL_Window *grabbed_window;
   278     Uint8 window_magic;
   279     Uint32 next_object_id;
   280     char * clipboard_text;
   281 
   282     /* * * */
   283     /* Data used by the GL drivers */
   284     struct
   285     {
   286         int red_size;
   287         int green_size;
   288         int blue_size;
   289         int alpha_size;
   290         int depth_size;
   291         int buffer_size;
   292         int stencil_size;
   293         int double_buffer;
   294         int accum_red_size;
   295         int accum_green_size;
   296         int accum_blue_size;
   297         int accum_alpha_size;
   298         int stereo;
   299         int multisamplebuffers;
   300         int multisamplesamples;
   301         int accelerated;
   302         int major_version;
   303         int minor_version;
   304         int flags;
   305         int profile_mask;
   306         int share_with_current_context;
   307         int release_behavior;
   308         int framebuffer_srgb_capable;
   309         int retained_backing;
   310         int driver_loaded;
   311         char driver_path[256];
   312         void *dll_handle;
   313     } gl_config;
   314 
   315     /* * * */
   316     /* Cache current GL context; don't call the OS when it hasn't changed. */
   317     /* We have the global pointers here so Cocoa continues to work the way
   318        it always has, and the thread-local storage for the general case.
   319      */
   320     SDL_Window *current_glwin;
   321     SDL_GLContext current_glctx;
   322     SDL_TLSID current_glwin_tls;
   323     SDL_TLSID current_glctx_tls;
   324 
   325     /* * * */
   326     /* Data private to this driver */
   327     void *driverdata;
   328     struct SDL_GLDriverData *gl_data;
   329     
   330 #if SDL_VIDEO_OPENGL_EGL
   331     struct SDL_EGL_VideoData *egl_data;
   332 #endif
   333     
   334 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
   335     struct SDL_PrivateGLESData *gles_data;
   336 #endif
   337 
   338     /* * * */
   339     /* The function used to dispose of this structure */
   340     void (*free) (_THIS);
   341 };
   342 
   343 typedef struct VideoBootStrap
   344 {
   345     const char *name;
   346     const char *desc;
   347     int (*available) (void);
   348     SDL_VideoDevice *(*create) (int devindex);
   349 } VideoBootStrap;
   350 
   351 #if SDL_VIDEO_DRIVER_COCOA
   352 extern VideoBootStrap COCOA_bootstrap;
   353 #endif
   354 #if SDL_VIDEO_DRIVER_X11
   355 extern VideoBootStrap X11_bootstrap;
   356 #endif
   357 #if SDL_VIDEO_DRIVER_MIR
   358 extern VideoBootStrap MIR_bootstrap;
   359 #endif
   360 #if SDL_VIDEO_DRIVER_DIRECTFB
   361 extern VideoBootStrap DirectFB_bootstrap;
   362 #endif
   363 #if SDL_VIDEO_DRIVER_WINDOWS
   364 extern VideoBootStrap WINDOWS_bootstrap;
   365 #endif
   366 #if SDL_VIDEO_DRIVER_WINRT
   367 extern VideoBootStrap WINRT_bootstrap;
   368 #endif
   369 #if SDL_VIDEO_DRIVER_HAIKU
   370 extern VideoBootStrap HAIKU_bootstrap;
   371 #endif
   372 #if SDL_VIDEO_DRIVER_PANDORA
   373 extern VideoBootStrap PND_bootstrap;
   374 #endif
   375 #if SDL_VIDEO_DRIVER_UIKIT
   376 extern VideoBootStrap UIKIT_bootstrap;
   377 #endif
   378 #if SDL_VIDEO_DRIVER_ANDROID
   379 extern VideoBootStrap Android_bootstrap;
   380 #endif
   381 #if SDL_VIDEO_DRIVER_PSP
   382 extern VideoBootStrap PSP_bootstrap;
   383 #endif
   384 #if SDL_VIDEO_DRIVER_RPI
   385 extern VideoBootStrap RPI_bootstrap;
   386 #endif
   387 #if SDL_VIDEO_DRIVER_DUMMY
   388 extern VideoBootStrap DUMMY_bootstrap;
   389 #endif
   390 #if SDL_VIDEO_DRIVER_WAYLAND
   391 extern VideoBootStrap Wayland_bootstrap;
   392 #endif
   393 #if SDL_VIDEO_DRIVER_NACL
   394 extern VideoBootStrap NACL_bootstrap;
   395 #endif
   396 #if SDL_VIDEO_DRIVER_VIVANTE
   397 extern VideoBootStrap VIVANTE_bootstrap;
   398 #endif
   399 #if SDL_VIDEO_DRIVER_EMSCRIPTEN
   400 extern VideoBootStrap Emscripten_bootstrap;
   401 #endif
   402 
   403 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
   404 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   405 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   406 extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
   407 extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
   408 extern void *SDL_GetDisplayDriverData( int displayIndex );
   409 
   410 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
   411 
   412 extern void SDL_OnWindowShown(SDL_Window * window);
   413 extern void SDL_OnWindowHidden(SDL_Window * window);
   414 extern void SDL_OnWindowResized(SDL_Window * window);
   415 extern void SDL_OnWindowMinimized(SDL_Window * window);
   416 extern void SDL_OnWindowRestored(SDL_Window * window);
   417 extern void SDL_OnWindowEnter(SDL_Window * window);
   418 extern void SDL_OnWindowLeave(SDL_Window * window);
   419 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   420 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   421 extern void SDL_UpdateWindowGrab(SDL_Window * window);
   422 extern SDL_Window * SDL_GetFocusWindow(void);
   423 
   424 extern SDL_bool SDL_ShouldAllowTopmost(void);
   425 
   426 #endif /* _SDL_sysvideo_h */
   427 
   428 /* vi: set ts=4 sw=4 expandtab: */