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 | |
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 (*) (_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 | |
413 | typedef 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. */ |
421 | extern VideoBootStrap COCOA_bootstrap; |
422 | extern VideoBootStrap X11_bootstrap; |
423 | extern VideoBootStrap DirectFB_bootstrap; |
424 | extern VideoBootStrap WINDOWS_bootstrap; |
425 | extern VideoBootStrap WINRT_bootstrap; |
426 | extern VideoBootStrap HAIKU_bootstrap; |
427 | extern VideoBootStrap PND_bootstrap; |
428 | extern VideoBootStrap UIKIT_bootstrap; |
429 | extern VideoBootStrap Android_bootstrap; |
430 | extern VideoBootStrap PSP_bootstrap; |
431 | extern VideoBootStrap VITA_bootstrap; |
432 | extern VideoBootStrap RPI_bootstrap; |
433 | extern VideoBootStrap KMSDRM_bootstrap; |
434 | extern VideoBootStrap KMSDRM_LEGACY_bootstrap; |
435 | extern VideoBootStrap DUMMY_bootstrap; |
436 | extern VideoBootStrap Wayland_bootstrap; |
437 | extern VideoBootStrap NACL_bootstrap; |
438 | extern VideoBootStrap VIVANTE_bootstrap; |
439 | extern VideoBootStrap Emscripten_bootstrap; |
440 | extern VideoBootStrap QNX_bootstrap; |
441 | extern VideoBootStrap OFFSCREEN_bootstrap; |
442 | extern VideoBootStrap OS2DIVE_bootstrap; |
443 | extern VideoBootStrap OS2VMAN_bootstrap; |
444 | |
445 | extern SDL_VideoDevice *SDL_GetVideoDevice(void); |
446 | extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode); |
447 | extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event); |
448 | extern void SDL_DelVideoDisplay(int index); |
449 | extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode); |
450 | extern int SDL_GetIndexOfDisplay(SDL_VideoDisplay *display); |
451 | extern SDL_VideoDisplay *SDL_GetDisplay(int displayIndex); |
452 | extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window); |
453 | extern void *SDL_GetDisplayDriverData( int displayIndex ); |
454 | extern SDL_bool SDL_IsVideoContextExternal(void); |
455 | |
456 | extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor); |
457 | |
458 | extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags); |
459 | extern SDL_bool SDL_HasWindows(void); |
460 | |
461 | extern void SDL_OnWindowShown(SDL_Window * window); |
462 | extern void SDL_OnWindowHidden(SDL_Window * window); |
463 | extern void SDL_OnWindowResized(SDL_Window * window); |
464 | extern void SDL_OnWindowMinimized(SDL_Window * window); |
465 | extern void SDL_OnWindowRestored(SDL_Window * window); |
466 | extern void SDL_OnWindowEnter(SDL_Window * window); |
467 | extern void SDL_OnWindowLeave(SDL_Window * window); |
468 | extern void SDL_OnWindowFocusGained(SDL_Window * window); |
469 | extern void SDL_OnWindowFocusLost(SDL_Window * window); |
470 | extern void SDL_UpdateWindowGrab(SDL_Window * window); |
471 | extern SDL_Window * SDL_GetFocusWindow(void); |
472 | |
473 | extern SDL_bool SDL_ShouldAllowTopmost(void); |
474 | |
475 | extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches); |
476 | |
477 | extern void SDL_ToggleDragAndDropSupport(void); |
478 | |
479 | #endif /* SDL_sysvideo_h_ */ |
480 | |
481 | /* vi: set ts=4 sw=4 expandtab: */ |
482 | |