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