src/video/SDL_sysvideo.h
author Ryan C. Gordon <icculus@icculus.org>
Wed, 25 Jun 2014 17:06:12 -0400
changeset 8953 dc80dc0bd22e
parent 8833 ae720d61d14d
parent 8935 9d2f0236322b
child 9037 e9d67ac0c6f8
permissions -rw-r--r--
Merged Ryan's SDL-gui-backend branch.

Adds three APIs, and implements them on X11, Cocoa, and Windows:

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