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