src/video/SDL_sysvideo.h
author Philipp Wiesemann <philipp.wiesemann@arcor.de>
Tue, 29 Dec 2015 19:13:56 +0100
changeset 9988 08d023f75d78
parent 9813 0652406e46c6
child 9998 f67cf37e9cd4
permissions -rw-r--r--
Fixed a crash if creating accelerated renderer after accessing window surface.

Partially fixes Bugzilla #3196.
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2015 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 the dots/pixels-per-inch of a display
   175      */
   176     int (*GetDisplayDPI) (_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
   177 
   178     /*
   179      * Get a list of the available display modes for a display.
   180      */
   181     void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
   182 
   183     /*
   184      * Setting the display mode is independent of creating windows, so
   185      * when the display mode is changed, all existing windows should have
   186      * their data updated accordingly, including the display surfaces
   187      * associated with them.
   188      */
   189     int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
   190 
   191     /* * * */
   192     /*
   193      * Window functions
   194      */
   195     int (*CreateWindow) (_THIS, SDL_Window * window);
   196     int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
   197     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   198     void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
   199     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   200     void (*SetWindowSize) (_THIS, SDL_Window * window);
   201     void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
   202     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
   203     void (*ShowWindow) (_THIS, SDL_Window * window);
   204     void (*HideWindow) (_THIS, SDL_Window * window);
   205     void (*RaiseWindow) (_THIS, SDL_Window * window);
   206     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   207     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   208     void (*RestoreWindow) (_THIS, SDL_Window * window);
   209     void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
   210     void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
   211     int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
   212     int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
   213     void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
   214     void (*DestroyWindow) (_THIS, SDL_Window * window);
   215     int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
   216     int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
   217     void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
   218     void (*OnWindowEnter) (_THIS, SDL_Window * window);
   219 
   220     /* * * */
   221     /*
   222      * Shaped-window functions
   223      */
   224     SDL_ShapeDriver shape_driver;
   225 
   226     /* Get some platform dependent window information */
   227     SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   228                                 struct SDL_SysWMinfo * info);
   229 
   230     /* * * */
   231     /*
   232      * OpenGL support
   233      */
   234     int (*GL_LoadLibrary) (_THIS, const char *path);
   235     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   236     void (*GL_UnloadLibrary) (_THIS);
   237       SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
   238     int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
   239     void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   240     int (*GL_SetSwapInterval) (_THIS, int interval);
   241     int (*GL_GetSwapInterval) (_THIS);
   242     void (*GL_SwapWindow) (_THIS, SDL_Window * window);
   243     void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
   244 
   245     /* * * */
   246     /*
   247      * Event manager functions
   248      */
   249     void (*PumpEvents) (_THIS);
   250 
   251     /* Suspend the screensaver */
   252     void (*SuspendScreenSaver) (_THIS);
   253 
   254     /* Text input */
   255     void (*StartTextInput) (_THIS);
   256     void (*StopTextInput) (_THIS);
   257     void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
   258 
   259     /* Screen keyboard */
   260     SDL_bool (*HasScreenKeyboardSupport) (_THIS);
   261     void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
   262     void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
   263     SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
   264 
   265     /* Clipboard */
   266     int (*SetClipboardText) (_THIS, const char *text);
   267     char * (*GetClipboardText) (_THIS);
   268     SDL_bool (*HasClipboardText) (_THIS);
   269 
   270     /* MessageBox */
   271     int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
   272 
   273     /* Hit-testing */
   274     int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);
   275 
   276     /* * * */
   277     /* Data common to all drivers */
   278     SDL_bool suspend_screensaver;
   279     int num_displays;
   280     SDL_VideoDisplay *displays;
   281     SDL_Window *windows;
   282     SDL_Window *grabbed_window;
   283     Uint8 window_magic;
   284     Uint32 next_object_id;
   285     char * clipboard_text;
   286 
   287     /* * * */
   288     /* Data used by the GL drivers */
   289     struct
   290     {
   291         int red_size;
   292         int green_size;
   293         int blue_size;
   294         int alpha_size;
   295         int depth_size;
   296         int buffer_size;
   297         int stencil_size;
   298         int double_buffer;
   299         int accum_red_size;
   300         int accum_green_size;
   301         int accum_blue_size;
   302         int accum_alpha_size;
   303         int stereo;
   304         int multisamplebuffers;
   305         int multisamplesamples;
   306         int accelerated;
   307         int major_version;
   308         int minor_version;
   309         int flags;
   310         int profile_mask;
   311         int share_with_current_context;
   312         int release_behavior;
   313         int framebuffer_srgb_capable;
   314         int retained_backing;
   315         int driver_loaded;
   316         char driver_path[256];
   317         void *dll_handle;
   318     } gl_config;
   319 
   320     /* * * */
   321     /* Cache current GL context; don't call the OS when it hasn't changed. */
   322     /* We have the global pointers here so Cocoa continues to work the way
   323        it always has, and the thread-local storage for the general case.
   324      */
   325     SDL_Window *current_glwin;
   326     SDL_GLContext current_glctx;
   327     SDL_TLSID current_glwin_tls;
   328     SDL_TLSID current_glctx_tls;
   329 
   330     /* * * */
   331     /* Data private to this driver */
   332     void *driverdata;
   333     struct SDL_GLDriverData *gl_data;
   334     
   335 #if SDL_VIDEO_OPENGL_EGL
   336     struct SDL_EGL_VideoData *egl_data;
   337 #endif
   338     
   339 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
   340     struct SDL_PrivateGLESData *gles_data;
   341 #endif
   342 
   343     /* * * */
   344     /* The function used to dispose of this structure */
   345     void (*free) (_THIS);
   346 };
   347 
   348 typedef struct VideoBootStrap
   349 {
   350     const char *name;
   351     const char *desc;
   352     int (*available) (void);
   353     SDL_VideoDevice *(*create) (int devindex);
   354 } VideoBootStrap;
   355 
   356 #if SDL_VIDEO_DRIVER_COCOA
   357 extern VideoBootStrap COCOA_bootstrap;
   358 #endif
   359 #if SDL_VIDEO_DRIVER_X11
   360 extern VideoBootStrap X11_bootstrap;
   361 #endif
   362 #if SDL_VIDEO_DRIVER_MIR
   363 extern VideoBootStrap MIR_bootstrap;
   364 #endif
   365 #if SDL_VIDEO_DRIVER_DIRECTFB
   366 extern VideoBootStrap DirectFB_bootstrap;
   367 #endif
   368 #if SDL_VIDEO_DRIVER_WINDOWS
   369 extern VideoBootStrap WINDOWS_bootstrap;
   370 #endif
   371 #if SDL_VIDEO_DRIVER_WINRT
   372 extern VideoBootStrap WINRT_bootstrap;
   373 #endif
   374 #if SDL_VIDEO_DRIVER_HAIKU
   375 extern VideoBootStrap HAIKU_bootstrap;
   376 #endif
   377 #if SDL_VIDEO_DRIVER_PANDORA
   378 extern VideoBootStrap PND_bootstrap;
   379 #endif
   380 #if SDL_VIDEO_DRIVER_UIKIT
   381 extern VideoBootStrap UIKIT_bootstrap;
   382 #endif
   383 #if SDL_VIDEO_DRIVER_ANDROID
   384 extern VideoBootStrap Android_bootstrap;
   385 #endif
   386 #if SDL_VIDEO_DRIVER_PSP
   387 extern VideoBootStrap PSP_bootstrap;
   388 #endif
   389 #if SDL_VIDEO_DRIVER_RPI
   390 extern VideoBootStrap RPI_bootstrap;
   391 #endif
   392 #if SDL_VIDEO_DRIVER_DUMMY
   393 extern VideoBootStrap DUMMY_bootstrap;
   394 #endif
   395 #if SDL_VIDEO_DRIVER_WAYLAND
   396 extern VideoBootStrap Wayland_bootstrap;
   397 #endif
   398 #if SDL_VIDEO_DRIVER_NACL
   399 extern VideoBootStrap NACL_bootstrap;
   400 #endif
   401 #if SDL_VIDEO_DRIVER_VIVANTE
   402 extern VideoBootStrap VIVANTE_bootstrap;
   403 #endif
   404 #if SDL_VIDEO_DRIVER_EMSCRIPTEN
   405 extern VideoBootStrap Emscripten_bootstrap;
   406 #endif
   407 
   408 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
   409 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   410 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   411 extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
   412 extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
   413 extern void *SDL_GetDisplayDriverData( int displayIndex );
   414 
   415 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
   416 
   417 extern void SDL_OnWindowShown(SDL_Window * window);
   418 extern void SDL_OnWindowHidden(SDL_Window * window);
   419 extern void SDL_OnWindowResized(SDL_Window * window);
   420 extern void SDL_OnWindowMinimized(SDL_Window * window);
   421 extern void SDL_OnWindowRestored(SDL_Window * window);
   422 extern void SDL_OnWindowEnter(SDL_Window * window);
   423 extern void SDL_OnWindowLeave(SDL_Window * window);
   424 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   425 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   426 extern void SDL_UpdateWindowGrab(SDL_Window * window);
   427 extern SDL_Window * SDL_GetFocusWindow(void);
   428 
   429 extern SDL_bool SDL_ShouldAllowTopmost(void);
   430 
   431 extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);
   432 
   433 #endif /* _SDL_sysvideo_h */
   434 
   435 /* vi: set ts=4 sw=4 expandtab: */