src/video/SDL_sysvideo.h
author Ryan C. Gordon <icculus@icculus.org>
Sat, 24 May 2014 01:25:27 -0400
changeset 8782 5a97aae701ab
parent 8583 fb2933ca805f
child 8833 ae720d61d14d
child 8931 44d8a2f4b431
permissions -rw-r--r--
Fixed whitespace.
     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_destroying;
    97 
    98     SDL_WindowShaper *shaper;
    99 
   100     SDL_WindowUserData *data;
   101 
   102     void *driverdata;
   103 
   104     SDL_Window *prev;
   105     SDL_Window *next;
   106 };
   107 #define FULLSCREEN_VISIBLE(W) \
   108     (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
   109      ((W)->flags & SDL_WINDOW_SHOWN) && \
   110      !((W)->flags & SDL_WINDOW_MINIMIZED))
   111 
   112 /*
   113  * Define the SDL display structure This corresponds to physical monitors
   114  * attached to the system.
   115  */
   116 struct SDL_VideoDisplay
   117 {
   118     char *name;
   119     int max_display_modes;
   120     int num_display_modes;
   121     SDL_DisplayMode *display_modes;
   122     SDL_DisplayMode desktop_mode;
   123     SDL_DisplayMode current_mode;
   124 
   125     SDL_Window *fullscreen_window;
   126 
   127     SDL_VideoDevice *device;
   128 
   129     void *driverdata;
   130 };
   131 
   132 /* Forward declaration */
   133 struct SDL_SysWMinfo;
   134 
   135 /* Define the SDL video driver structure */
   136 #define _THIS   SDL_VideoDevice *_this
   137 
   138 struct SDL_VideoDevice
   139 {
   140     /* * * */
   141     /* The name of this video driver */
   142     const char *name;
   143 
   144     /* * * */
   145     /* Initialization/Query functions */
   146 
   147     /*
   148      * Initialize the native video subsystem, filling in the list of
   149      * displays for this driver, returning 0 or -1 if there's an error.
   150      */
   151     int (*VideoInit) (_THIS);
   152 
   153     /*
   154      * Reverse the effects VideoInit() -- called if VideoInit() fails or
   155      * if the application is shutting down the video subsystem.
   156      */
   157     void (*VideoQuit) (_THIS);
   158 
   159     /* * * */
   160     /*
   161      * Display functions
   162      */
   163 
   164     /*
   165      * Get the bounds of a display
   166      */
   167     int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   168 
   169     /*
   170      * Get a list of the available display modes for a display.
   171      */
   172     void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
   173 
   174     /*
   175      * Setting the display mode is independent of creating windows, so
   176      * when the display mode is changed, all existing windows should have
   177      * their data updated accordingly, including the display surfaces
   178      * associated with them.
   179      */
   180     int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
   181 
   182     /* * * */
   183     /*
   184      * Window functions
   185      */
   186     int (*CreateWindow) (_THIS, SDL_Window * window);
   187     int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
   188     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   189     void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
   190     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   191     void (*SetWindowSize) (_THIS, SDL_Window * window);
   192     void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
   193     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
   194     void (*ShowWindow) (_THIS, SDL_Window * window);
   195     void (*HideWindow) (_THIS, SDL_Window * window);
   196     void (*RaiseWindow) (_THIS, SDL_Window * window);
   197     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   198     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   199     void (*RestoreWindow) (_THIS, SDL_Window * window);
   200     void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
   201     void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
   202     int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
   203     int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
   204     void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
   205     void (*DestroyWindow) (_THIS, SDL_Window * window);
   206     int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
   207     int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
   208     void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
   209     void (*OnWindowEnter) (_THIS, SDL_Window * window);
   210 
   211     /* * * */
   212     /*
   213      * Shaped-window functions
   214      */
   215     SDL_ShapeDriver shape_driver;
   216 
   217     /* Get some platform dependent window information */
   218     SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   219                                 struct SDL_SysWMinfo * info);
   220 
   221     /* * * */
   222     /*
   223      * OpenGL support
   224      */
   225     int (*GL_LoadLibrary) (_THIS, const char *path);
   226     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   227     void (*GL_UnloadLibrary) (_THIS);
   228       SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
   229     int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
   230     void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   231     int (*GL_SetSwapInterval) (_THIS, int interval);
   232     int (*GL_GetSwapInterval) (_THIS);
   233     void (*GL_SwapWindow) (_THIS, SDL_Window * window);
   234     void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
   235 
   236     /* * * */
   237     /*
   238      * Event manager functions
   239      */
   240     void (*PumpEvents) (_THIS);
   241 
   242     /* Suspend the screensaver */
   243     void (*SuspendScreenSaver) (_THIS);
   244 
   245     /* Text input */
   246     void (*StartTextInput) (_THIS);
   247     void (*StopTextInput) (_THIS);
   248     void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
   249 
   250     /* Screen keyboard */
   251     SDL_bool (*HasScreenKeyboardSupport) (_THIS);
   252     void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
   253     void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
   254     SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
   255 
   256     /* Clipboard */
   257     int (*SetClipboardText) (_THIS, const char *text);
   258     char * (*GetClipboardText) (_THIS);
   259     SDL_bool (*HasClipboardText) (_THIS);
   260 
   261     /* MessageBox */
   262     int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
   263 
   264     /* * * */
   265     /* Data common to all drivers */
   266     SDL_bool suspend_screensaver;
   267     int num_displays;
   268     SDL_VideoDisplay *displays;
   269     SDL_Window *windows;
   270     Uint8 window_magic;
   271     Uint32 next_object_id;
   272     char * clipboard_text;
   273 
   274     /* * * */
   275     /* Data used by the GL drivers */
   276     struct
   277     {
   278         int red_size;
   279         int green_size;
   280         int blue_size;
   281         int alpha_size;
   282         int depth_size;
   283         int buffer_size;
   284         int stencil_size;
   285         int double_buffer;
   286         int accum_red_size;
   287         int accum_green_size;
   288         int accum_blue_size;
   289         int accum_alpha_size;
   290         int stereo;
   291         int multisamplebuffers;
   292         int multisamplesamples;
   293         int accelerated;
   294         int major_version;
   295         int minor_version;
   296         int flags;
   297         int profile_mask;
   298         int share_with_current_context;
   299         int framebuffer_srgb_capable;
   300         int retained_backing;
   301         int driver_loaded;
   302         char driver_path[256];
   303         void *dll_handle;
   304     } gl_config;
   305 
   306     /* * * */
   307     /* Cache current GL context; don't call the OS when it hasn't changed. */
   308     /* We have the global pointers here so Cocoa continues to work the way
   309        it always has, and the thread-local storage for the general case.
   310      */
   311     SDL_Window *current_glwin;
   312     SDL_GLContext current_glctx;
   313     SDL_TLSID current_glwin_tls;
   314     SDL_TLSID current_glctx_tls;
   315 
   316     /* * * */
   317     /* Data private to this driver */
   318     void *driverdata;
   319     struct SDL_GLDriverData *gl_data;
   320     
   321 #if SDL_VIDEO_OPENGL_EGL
   322     struct SDL_EGL_VideoData *egl_data;
   323 #endif
   324     
   325 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
   326     struct SDL_PrivateGLESData *gles_data;
   327 #endif
   328 
   329     /* * * */
   330     /* The function used to dispose of this structure */
   331     void (*free) (_THIS);
   332 };
   333 
   334 typedef struct VideoBootStrap
   335 {
   336     const char *name;
   337     const char *desc;
   338     int (*available) (void);
   339     SDL_VideoDevice *(*create) (int devindex);
   340 } VideoBootStrap;
   341 
   342 #if SDL_VIDEO_DRIVER_COCOA
   343 extern VideoBootStrap COCOA_bootstrap;
   344 #endif
   345 #if SDL_VIDEO_DRIVER_X11
   346 extern VideoBootStrap X11_bootstrap;
   347 #endif
   348 #if SDL_VIDEO_DRIVER_MIR
   349 extern VideoBootStrap MIR_bootstrap;
   350 #endif
   351 #if SDL_VIDEO_DRIVER_DIRECTFB
   352 extern VideoBootStrap DirectFB_bootstrap;
   353 #endif
   354 #if SDL_VIDEO_DRIVER_WINDOWS
   355 extern VideoBootStrap WINDOWS_bootstrap;
   356 #endif
   357 #if SDL_VIDEO_DRIVER_WINRT
   358 extern VideoBootStrap WINRT_bootstrap;
   359 #endif
   360 #if SDL_VIDEO_DRIVER_HAIKU
   361 extern VideoBootStrap HAIKU_bootstrap;
   362 #endif
   363 #if SDL_VIDEO_DRIVER_PANDORA
   364 extern VideoBootStrap PND_bootstrap;
   365 #endif
   366 #if SDL_VIDEO_DRIVER_UIKIT
   367 extern VideoBootStrap UIKIT_bootstrap;
   368 #endif
   369 #if SDL_VIDEO_DRIVER_ANDROID
   370 extern VideoBootStrap Android_bootstrap;
   371 #endif
   372 #if SDL_VIDEO_DRIVER_PSP
   373 extern VideoBootStrap PSP_bootstrap;
   374 #endif
   375 #if SDL_VIDEO_DRIVER_RPI
   376 extern VideoBootStrap RPI_bootstrap;
   377 #endif
   378 #if SDL_VIDEO_DRIVER_DUMMY
   379 extern VideoBootStrap DUMMY_bootstrap;
   380 #endif
   381 #if SDL_VIDEO_DRIVER_WAYLAND
   382 extern VideoBootStrap Wayland_bootstrap;
   383 #endif
   384 
   385 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
   386 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   387 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   388 extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
   389 extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
   390 extern void *SDL_GetDisplayDriverData( int displayIndex );
   391 
   392 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
   393 
   394 extern void SDL_OnWindowShown(SDL_Window * window);
   395 extern void SDL_OnWindowHidden(SDL_Window * window);
   396 extern void SDL_OnWindowResized(SDL_Window * window);
   397 extern void SDL_OnWindowMinimized(SDL_Window * window);
   398 extern void SDL_OnWindowRestored(SDL_Window * window);
   399 extern void SDL_OnWindowEnter(SDL_Window * window);
   400 extern void SDL_OnWindowLeave(SDL_Window * window);
   401 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   402 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   403 extern void SDL_UpdateWindowGrab(SDL_Window * window);
   404 extern SDL_Window * SDL_GetFocusWindow(void);
   405 
   406 extern SDL_bool SDL_ShouldAllowTopmost(void);
   407 
   408 #endif /* _SDL_sysvideo_h */
   409 
   410 /* vi: set ts=4 sw=4 expandtab: */