src/video/SDL_sysvideo.h
author Ryan C. Gordon <icculus@icculus.org>
Wed, 16 Oct 2019 13:54:35 -0400
changeset 13132 d1a5e3cd0ae8
parent 13089 9692ad570003
permissions -rw-r--r--
emscripten: Patched to compile (thanks, Caleb!).

Fixes Bugzilla #4827.
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2019 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 #include "SDL_metal.h"
    30 
    31 #include "SDL_vulkan_internal.h"
    32 
    33 /* The SDL video driver */
    34 
    35 typedef struct SDL_WindowShaper SDL_WindowShaper;
    36 typedef struct SDL_ShapeDriver SDL_ShapeDriver;
    37 typedef struct SDL_VideoDisplay SDL_VideoDisplay;
    38 typedef struct SDL_VideoDevice SDL_VideoDevice;
    39 
    40 /* Define the SDL window-shaper structure */
    41 struct SDL_WindowShaper
    42 {
    43     /* The window associated with the shaper */
    44     SDL_Window *window;
    45 
    46     /* The user's specified coordinates for the window, for once we give it a shape. */
    47     Uint32 userx,usery;
    48 
    49     /* The parameters for shape calculation. */
    50     SDL_WindowShapeMode mode;
    51 
    52     /* Has this window been assigned a shape? */
    53     SDL_bool hasshape;
    54 
    55     void *driverdata;
    56 };
    57 
    58 /* Define the SDL shape driver structure */
    59 struct SDL_ShapeDriver
    60 {
    61     SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);
    62     int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
    63     int (*ResizeWindowShape)(SDL_Window *window);
    64 };
    65 
    66 typedef struct SDL_WindowUserData
    67 {
    68     char *name;
    69     void *data;
    70     struct SDL_WindowUserData *next;
    71 } SDL_WindowUserData;
    72 
    73 /* Define the SDL window structure, corresponding to toplevel windows */
    74 struct SDL_Window
    75 {
    76     const void *magic;
    77     Uint32 id;
    78     char *title;
    79     SDL_Surface *icon;
    80     int x, y;
    81     int w, h;
    82     int min_w, min_h;
    83     int max_w, max_h;
    84     Uint32 flags;
    85     Uint32 last_fullscreen_flags;
    86 
    87     /* Stored position and size for windowed mode */
    88     SDL_Rect windowed;
    89 
    90     SDL_DisplayMode fullscreen_mode;
    91 
    92     float opacity;
    93 
    94     float brightness;
    95     Uint16 *gamma;
    96     Uint16 *saved_gamma;        /* (just offset into gamma) */
    97 
    98     SDL_Surface *surface;
    99     SDL_bool surface_valid;
   100 
   101     SDL_bool is_hiding;
   102     SDL_bool is_destroying;
   103     SDL_bool is_dropping;       /* drag/drop in progress, expecting SDL_SendDropComplete(). */
   104 
   105     SDL_WindowShaper *shaper;
   106 
   107     SDL_HitTest hit_test;
   108     void *hit_test_data;
   109 
   110     SDL_WindowUserData *data;
   111 
   112     void *driverdata;
   113 
   114     SDL_Window *prev;
   115     SDL_Window *next;
   116 };
   117 #define FULLSCREEN_VISIBLE(W) \
   118     (((W)->flags & SDL_WINDOW_FULLSCREEN) && \
   119      ((W)->flags & SDL_WINDOW_SHOWN) && \
   120      !((W)->flags & SDL_WINDOW_MINIMIZED))
   121 
   122 /*
   123  * Define the SDL display structure.
   124  * This corresponds to physical monitors attached to the system.
   125  */
   126 struct SDL_VideoDisplay
   127 {
   128     char *name;
   129     int max_display_modes;
   130     int num_display_modes;
   131     SDL_DisplayMode *display_modes;
   132     SDL_DisplayMode desktop_mode;
   133     SDL_DisplayMode current_mode;
   134     SDL_DisplayOrientation orientation;
   135 
   136     SDL_Window *fullscreen_window;
   137 
   138     SDL_VideoDevice *device;
   139 
   140     void *driverdata;
   141 };
   142 
   143 /* Forward declaration */
   144 struct SDL_SysWMinfo;
   145 
   146 /* Define the SDL video driver structure */
   147 #define _THIS   SDL_VideoDevice *_this
   148 
   149 struct SDL_VideoDevice
   150 {
   151     /* * * */
   152     /* The name of this video driver */
   153     const char *name;
   154 
   155     /* * * */
   156     /* Initialization/Query functions */
   157 
   158     /*
   159      * Initialize the native video subsystem, filling in the list of
   160      * displays for this driver, returning 0 or -1 if there's an error.
   161      */
   162     int (*VideoInit) (_THIS);
   163 
   164     /*
   165      * Reverse the effects VideoInit() -- called if VideoInit() fails or
   166      * if the application is shutting down the video subsystem.
   167      */
   168     void (*VideoQuit) (_THIS);
   169 
   170     /*
   171      * Reinitialize the touch devices -- called if an unknown touch ID occurs.
   172      */
   173     void (*ResetTouch) (_THIS);
   174 
   175     /* * * */
   176     /*
   177      * Display functions
   178      */
   179 
   180     /*
   181      * Get the bounds of a display
   182      */
   183     int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   184 
   185     /*
   186      * Get the usable bounds of a display (bounds minus menubar or whatever)
   187      */
   188     int (*GetDisplayUsableBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
   189 
   190     /*
   191      * Get the dots/pixels-per-inch of a display
   192      */
   193     int (*GetDisplayDPI) (_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
   194 
   195     /*
   196      * Get a list of the available display modes for a display.
   197      */
   198     void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
   199 
   200     /*
   201      * Setting the display mode is independent of creating windows, so
   202      * when the display mode is changed, all existing windows should have
   203      * their data updated accordingly, including the display surfaces
   204      * associated with them.
   205      */
   206     int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
   207 
   208     /* * * */
   209     /*
   210      * Window functions
   211      */
   212     int (*CreateSDLWindow) (_THIS, SDL_Window * window);
   213     int (*CreateSDLWindowFrom) (_THIS, SDL_Window * window, const void *data);
   214     void (*SetWindowTitle) (_THIS, SDL_Window * window);
   215     void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
   216     void (*SetWindowPosition) (_THIS, SDL_Window * window);
   217     void (*SetWindowSize) (_THIS, SDL_Window * window);
   218     void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
   219     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
   220     int (*GetWindowBordersSize) (_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);
   221     int (*SetWindowOpacity) (_THIS, SDL_Window * window, float opacity);
   222     int (*SetWindowModalFor) (_THIS, SDL_Window * modal_window, SDL_Window * parent_window);
   223     int (*SetWindowInputFocus) (_THIS, SDL_Window * window);
   224     void (*ShowWindow) (_THIS, SDL_Window * window);
   225     void (*HideWindow) (_THIS, SDL_Window * window);
   226     void (*RaiseWindow) (_THIS, SDL_Window * window);
   227     void (*MaximizeWindow) (_THIS, SDL_Window * window);
   228     void (*MinimizeWindow) (_THIS, SDL_Window * window);
   229     void (*RestoreWindow) (_THIS, SDL_Window * window);
   230     void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
   231     void (*SetWindowResizable) (_THIS, SDL_Window * window, SDL_bool resizable);
   232     void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
   233     int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
   234     int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
   235     void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
   236     void (*DestroyWindow) (_THIS, SDL_Window * window);
   237     int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
   238     int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
   239     void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
   240     void (*OnWindowEnter) (_THIS, SDL_Window * window);
   241 
   242     /* * * */
   243     /*
   244      * Shaped-window functions
   245      */
   246     SDL_ShapeDriver shape_driver;
   247 
   248     /* Get some platform dependent window information */
   249     SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
   250                                 struct SDL_SysWMinfo * info);
   251 
   252     /* * * */
   253     /*
   254      * OpenGL support
   255      */
   256     int (*GL_LoadLibrary) (_THIS, const char *path);
   257     void *(*GL_GetProcAddress) (_THIS, const char *proc);
   258     void (*GL_UnloadLibrary) (_THIS);
   259       SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
   260     int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
   261     void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   262     int (*GL_SetSwapInterval) (_THIS, int interval);
   263     int (*GL_GetSwapInterval) (_THIS);
   264     int (*GL_SwapWindow) (_THIS, SDL_Window * window);
   265     void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
   266     void (*GL_DefaultProfileConfig) (_THIS, int *mask, int *major, int *minor);
   267 
   268     /* * * */
   269     /*
   270      * Vulkan support
   271      */
   272     int (*Vulkan_LoadLibrary) (_THIS, const char *path);
   273     void (*Vulkan_UnloadLibrary) (_THIS);
   274     SDL_bool (*Vulkan_GetInstanceExtensions) (_THIS, SDL_Window *window, unsigned *count, const char **names);
   275     SDL_bool (*Vulkan_CreateSurface) (_THIS, SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface);
   276     void (*Vulkan_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
   277 
   278     /* * * */
   279     /*
   280      * Metal support
   281      */
   282     SDL_MetalView (*Metal_CreateView) (_THIS, SDL_Window * window);
   283     void (*Metal_DestroyView) (_THIS, SDL_MetalView view);
   284 
   285     /* * * */
   286     /*
   287      * Event manager functions
   288      */
   289     void (*PumpEvents) (_THIS);
   290 
   291     /* Suspend the screensaver */
   292     void (*SuspendScreenSaver) (_THIS);
   293 
   294     /* Text input */
   295     void (*StartTextInput) (_THIS);
   296     void (*StopTextInput) (_THIS);
   297     void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
   298 
   299     /* Screen keyboard */
   300     SDL_bool (*HasScreenKeyboardSupport) (_THIS);
   301     void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
   302     void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
   303     SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
   304 
   305     /* Clipboard */
   306     int (*SetClipboardText) (_THIS, const char *text);
   307     char * (*GetClipboardText) (_THIS);
   308     SDL_bool (*HasClipboardText) (_THIS);
   309 
   310     /* MessageBox */
   311     int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
   312 
   313     /* Hit-testing */
   314     int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);
   315 
   316     /* Tell window that app enabled drag'n'drop events */
   317     void (*AcceptDragAndDrop)(SDL_Window * window, SDL_bool accept);
   318 
   319     /* * * */
   320     /* Data common to all drivers */
   321     SDL_bool is_dummy;
   322     SDL_bool suspend_screensaver;
   323     int num_displays;
   324     SDL_VideoDisplay *displays;
   325     SDL_Window *windows;
   326     SDL_Window *grabbed_window;
   327     Uint8 window_magic;
   328     Uint32 next_object_id;
   329     char *clipboard_text;
   330 
   331     /* * * */
   332     /* Data used by the GL drivers */
   333     struct
   334     {
   335         int red_size;
   336         int green_size;
   337         int blue_size;
   338         int alpha_size;
   339         int depth_size;
   340         int buffer_size;
   341         int stencil_size;
   342         int double_buffer;
   343         int accum_red_size;
   344         int accum_green_size;
   345         int accum_blue_size;
   346         int accum_alpha_size;
   347         int stereo;
   348         int multisamplebuffers;
   349         int multisamplesamples;
   350         int accelerated;
   351         int major_version;
   352         int minor_version;
   353         int flags;
   354         int profile_mask;
   355         int share_with_current_context;
   356         int release_behavior;
   357         int reset_notification;
   358         int framebuffer_srgb_capable;
   359         int no_error;
   360         int retained_backing;
   361         int driver_loaded;
   362         char driver_path[256];
   363         void *dll_handle;
   364     } gl_config;
   365 
   366     /* * * */
   367     /* Cache current GL context; don't call the OS when it hasn't changed. */
   368     /* We have the global pointers here so Cocoa continues to work the way
   369        it always has, and the thread-local storage for the general case.
   370      */
   371     SDL_Window *current_glwin;
   372     SDL_GLContext current_glctx;
   373     SDL_TLSID current_glwin_tls;
   374     SDL_TLSID current_glctx_tls;
   375 
   376     /* * * */
   377     /* Data used by the Vulkan drivers */
   378     struct
   379     {
   380         PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
   381         PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
   382         int loader_loaded;
   383         char loader_path[256];
   384         void *loader_handle;
   385     } vulkan_config;
   386 
   387     /* * * */
   388     /* Data private to this driver */
   389     void *driverdata;
   390     struct SDL_GLDriverData *gl_data;
   391     
   392 #if SDL_VIDEO_OPENGL_EGL
   393     struct SDL_EGL_VideoData *egl_data;
   394 #endif
   395     
   396 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
   397     struct SDL_PrivateGLESData *gles_data;
   398 #endif
   399 
   400     /* * * */
   401     /* The function used to dispose of this structure */
   402     void (*free) (_THIS);
   403 };
   404 
   405 typedef struct VideoBootStrap
   406 {
   407     const char *name;
   408     const char *desc;
   409     int (*available) (void);
   410     SDL_VideoDevice *(*create) (int devindex);
   411 } VideoBootStrap;
   412 
   413 /* Not all of these are available in a given build. Use #ifdefs, etc. */
   414 extern VideoBootStrap COCOA_bootstrap;
   415 extern VideoBootStrap X11_bootstrap;
   416 extern VideoBootStrap DirectFB_bootstrap;
   417 extern VideoBootStrap WINDOWS_bootstrap;
   418 extern VideoBootStrap WINRT_bootstrap;
   419 extern VideoBootStrap HAIKU_bootstrap;
   420 extern VideoBootStrap PND_bootstrap;
   421 extern VideoBootStrap UIKIT_bootstrap;
   422 extern VideoBootStrap Android_bootstrap;
   423 extern VideoBootStrap PSP_bootstrap;
   424 extern VideoBootStrap RPI_bootstrap;
   425 extern VideoBootStrap KMSDRM_bootstrap;
   426 extern VideoBootStrap DUMMY_bootstrap;
   427 extern VideoBootStrap Wayland_bootstrap;
   428 extern VideoBootStrap NACL_bootstrap;
   429 extern VideoBootStrap VIVANTE_bootstrap;
   430 extern VideoBootStrap Emscripten_bootstrap;
   431 extern VideoBootStrap QNX_bootstrap;
   432 extern VideoBootStrap OFFSCREEN_bootstrap;
   433 
   434 extern SDL_VideoDevice *SDL_GetVideoDevice(void);
   435 extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
   436 extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
   437 extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
   438 extern int SDL_GetIndexOfDisplay(SDL_VideoDisplay *display);
   439 extern SDL_VideoDisplay *SDL_GetDisplay(int displayIndex);
   440 extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
   441 extern void *SDL_GetDisplayDriverData( int displayIndex );
   442 
   443 extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor);
   444 
   445 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
   446 extern SDL_bool SDL_HasWindows(void);
   447 
   448 extern void SDL_OnWindowShown(SDL_Window * window);
   449 extern void SDL_OnWindowHidden(SDL_Window * window);
   450 extern void SDL_OnWindowResized(SDL_Window * window);
   451 extern void SDL_OnWindowMinimized(SDL_Window * window);
   452 extern void SDL_OnWindowRestored(SDL_Window * window);
   453 extern void SDL_OnWindowEnter(SDL_Window * window);
   454 extern void SDL_OnWindowLeave(SDL_Window * window);
   455 extern void SDL_OnWindowFocusGained(SDL_Window * window);
   456 extern void SDL_OnWindowFocusLost(SDL_Window * window);
   457 extern void SDL_UpdateWindowGrab(SDL_Window * window);
   458 extern SDL_Window * SDL_GetFocusWindow(void);
   459 
   460 extern SDL_bool SDL_ShouldAllowTopmost(void);
   461 
   462 extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);
   463 
   464 extern void SDL_OnApplicationWillTerminate(void);
   465 extern void SDL_OnApplicationDidReceiveMemoryWarning(void);
   466 extern void SDL_OnApplicationWillResignActive(void);
   467 extern void SDL_OnApplicationDidEnterBackground(void);
   468 extern void SDL_OnApplicationWillEnterForeground(void);
   469 extern void SDL_OnApplicationDidBecomeActive(void);
   470 
   471 extern void SDL_ToggleDragAndDropSupport(void);
   472 
   473 #endif /* SDL_sysvideo_h_ */
   474 
   475 /* vi: set ts=4 sw=4 expandtab: */