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