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