1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2021 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
35typedef struct SDL_WindowShaper SDL_WindowShaper;
36typedef struct SDL_ShapeDriver SDL_ShapeDriver;
37typedef struct SDL_VideoDisplay SDL_VideoDisplay;
38typedef struct SDL_VideoDevice SDL_VideoDevice;
39
40/* Define the SDL window-shaper structure */
41struct 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 */
59struct 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
66typedef 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 */
74struct 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 */
126struct 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 */
144struct SDL_SysWMinfo;
145
146/* Define the SDL video driver structure */
147#define _THIS SDL_VideoDevice *_this
148
149struct 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 (*SetWindowMouseGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
236 void (*SetWindowKeyboardGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
237 void (*DestroyWindow) (_THIS, SDL_Window * window);
238 int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
239 int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
240 void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
241 void (*OnWindowEnter) (_THIS, SDL_Window * window);
242
243 /* * * */
244 /*
245 * Shaped-window functions
246 */
247 SDL_ShapeDriver shape_driver;
248
249 /* Get some platform dependent window information */
250 SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
251 struct SDL_SysWMinfo * info);
252
253 /* * * */
254 /*
255 * OpenGL support
256 */
257 int (*GL_LoadLibrary) (_THIS, const char *path);
258 void *(*GL_GetProcAddress) (_THIS, const char *proc);
259 void (*GL_UnloadLibrary) (_THIS);
260 SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
261 int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
262 void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
263 int (*GL_SetSwapInterval) (_THIS, int interval);
264 int (*GL_GetSwapInterval) (_THIS);
265 int (*GL_SwapWindow) (_THIS, SDL_Window * window);
266 void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
267 void (*GL_DefaultProfileConfig) (_THIS, int *mask, int *major, int *minor);
268
269 /* * * */
270 /*
271 * Vulkan support
272 */
273 int (*Vulkan_LoadLibrary) (_THIS, const char *path);
274 void (*Vulkan_UnloadLibrary) (_THIS);
275 SDL_bool (*Vulkan_GetInstanceExtensions) (_THIS, SDL_Window *window, unsigned *count, const char **names);
276 SDL_bool (*Vulkan_CreateSurface) (_THIS, SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface);
277 void (*Vulkan_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
278
279 /* * * */
280 /*
281 * Metal support
282 */
283 SDL_MetalView (*Metal_CreateView) (_THIS, SDL_Window * window);
284 void (*Metal_DestroyView) (_THIS, SDL_MetalView view);
285 void *(*Metal_GetLayer) (_THIS, SDL_MetalView view);
286 void (*Metal_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
287
288 /* * * */
289 /*
290 * Event manager functions
291 */
292 void (*PumpEvents) (_THIS);
293
294 /* Suspend the screensaver */
295 void (*SuspendScreenSaver) (_THIS);
296
297 /* Text input */
298 void (*StartTextInput) (_THIS);
299 void (*StopTextInput) (_THIS);
300 void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
301
302 /* Screen keyboard */
303 SDL_bool (*HasScreenKeyboardSupport) (_THIS);
304 void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
305 void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
306 SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
307
308 /* Clipboard */
309 int (*SetClipboardText) (_THIS, const char *text);
310 char * (*GetClipboardText) (_THIS);
311 SDL_bool (*HasClipboardText) (_THIS);
312
313 /* MessageBox */
314 int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
315
316 /* Hit-testing */
317 int (*SetWindowHitTest)(SDL_Window * window, SDL_bool enabled);
318
319 /* Tell window that app enabled drag'n'drop events */
320 void (*AcceptDragAndDrop)(SDL_Window * window, SDL_bool accept);
321
322 /* * * */
323 /* Data common to all drivers */
324 SDL_bool is_dummy;
325 SDL_bool suspend_screensaver;
326 int num_displays;
327 SDL_VideoDisplay *displays;
328 SDL_Window *windows;
329 SDL_Window *grabbed_window;
330 Uint8 window_magic;
331 Uint32 next_object_id;
332 char *clipboard_text;
333
334 /* * * */
335 /* Data used by the GL drivers */
336 struct
337 {
338 int red_size;
339 int green_size;
340 int blue_size;
341 int alpha_size;
342 int depth_size;
343 int buffer_size;
344 int stencil_size;
345 int double_buffer;
346 int accum_red_size;
347 int accum_green_size;
348 int accum_blue_size;
349 int accum_alpha_size;
350 int stereo;
351 int multisamplebuffers;
352 int multisamplesamples;
353 int accelerated;
354 int major_version;
355 int minor_version;
356 int flags;
357 int profile_mask;
358 int share_with_current_context;
359 int release_behavior;
360 int reset_notification;
361 int framebuffer_srgb_capable;
362 int no_error;
363 int retained_backing;
364 int driver_loaded;
365 char driver_path[256];
366 void *dll_handle;
367 } gl_config;
368
369 /* * * */
370 /* Cache current GL context; don't call the OS when it hasn't changed. */
371 /* We have the global pointers here so Cocoa continues to work the way
372 it always has, and the thread-local storage for the general case.
373 */
374 SDL_Window *current_glwin;
375 SDL_GLContext current_glctx;
376 SDL_TLSID current_glwin_tls;
377 SDL_TLSID current_glctx_tls;
378
379 /* Flag that stores whether it's allowed to call SDL_GL_MakeCurrent()
380 * with a NULL window, but a non-NULL context. (Not allowed in most cases,
381 * except on EGL under some circumstances.) */
382 SDL_bool gl_allow_no_surface;
383
384 /* * * */
385 /* Data used by the Vulkan drivers */
386 struct
387 {
388 PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
389 PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
390 int loader_loaded;
391 char loader_path[256];
392 void *loader_handle;
393 } vulkan_config;
394
395 /* * * */
396 /* Data private to this driver */
397 void *driverdata;
398 struct SDL_GLDriverData *gl_data;
399
400#if SDL_VIDEO_OPENGL_EGL
401 struct SDL_EGL_VideoData *egl_data;
402#endif
403
404#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
405 struct SDL_PrivateGLESData *gles_data;
406#endif
407
408 /* * * */
409 /* The function used to dispose of this structure */
410 void (*free) (_THIS);
411};
412
413typedef struct VideoBootStrap
414{
415 const char *name;
416 const char *desc;
417 SDL_VideoDevice *(*create) (int devindex);
418} VideoBootStrap;
419
420/* Not all of these are available in a given build. Use #ifdefs, etc. */
421extern VideoBootStrap COCOA_bootstrap;
422extern VideoBootStrap X11_bootstrap;
423extern VideoBootStrap DirectFB_bootstrap;
424extern VideoBootStrap WINDOWS_bootstrap;
425extern VideoBootStrap WINRT_bootstrap;
426extern VideoBootStrap HAIKU_bootstrap;
427extern VideoBootStrap PND_bootstrap;
428extern VideoBootStrap UIKIT_bootstrap;
429extern VideoBootStrap Android_bootstrap;
430extern VideoBootStrap PSP_bootstrap;
431extern VideoBootStrap VITA_bootstrap;
432extern VideoBootStrap RPI_bootstrap;
433extern VideoBootStrap KMSDRM_bootstrap;
434extern VideoBootStrap KMSDRM_LEGACY_bootstrap;
435extern VideoBootStrap DUMMY_bootstrap;
436extern VideoBootStrap Wayland_bootstrap;
437extern VideoBootStrap NACL_bootstrap;
438extern VideoBootStrap VIVANTE_bootstrap;
439extern VideoBootStrap Emscripten_bootstrap;
440extern VideoBootStrap QNX_bootstrap;
441extern VideoBootStrap OFFSCREEN_bootstrap;
442extern VideoBootStrap OS2DIVE_bootstrap;
443extern VideoBootStrap OS2VMAN_bootstrap;
444
445extern SDL_VideoDevice *SDL_GetVideoDevice(void);
446extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
447extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event);
448extern void SDL_DelVideoDisplay(int index);
449extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
450extern int SDL_GetIndexOfDisplay(SDL_VideoDisplay *display);
451extern SDL_VideoDisplay *SDL_GetDisplay(int displayIndex);
452extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
453extern void *SDL_GetDisplayDriverData( int displayIndex );
454extern SDL_bool SDL_IsVideoContextExternal(void);
455
456extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor);
457
458extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
459extern SDL_bool SDL_HasWindows(void);
460
461extern void SDL_OnWindowShown(SDL_Window * window);
462extern void SDL_OnWindowHidden(SDL_Window * window);
463extern void SDL_OnWindowResized(SDL_Window * window);
464extern void SDL_OnWindowMinimized(SDL_Window * window);
465extern void SDL_OnWindowRestored(SDL_Window * window);
466extern void SDL_OnWindowEnter(SDL_Window * window);
467extern void SDL_OnWindowLeave(SDL_Window * window);
468extern void SDL_OnWindowFocusGained(SDL_Window * window);
469extern void SDL_OnWindowFocusLost(SDL_Window * window);
470extern void SDL_UpdateWindowGrab(SDL_Window * window);
471extern SDL_Window * SDL_GetFocusWindow(void);
472
473extern SDL_bool SDL_ShouldAllowTopmost(void);
474
475extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);
476
477extern void SDL_ToggleDragAndDropSupport(void);
478
479#endif /* SDL_sysvideo_h_ */
480
481/* vi: set ts=4 sw=4 expandtab: */
482