SDL  2.0
SDL_video.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 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 /* The high-level video driver subsystem */
24 
25 #include "SDL.h"
26 #include "SDL_video.h"
27 #include "SDL_sysvideo.h"
28 #include "SDL_blit.h"
29 #include "SDL_pixels_c.h"
30 #include "SDL_rect_c.h"
31 #include "../events/SDL_events_c.h"
32 #include "../timer/SDL_timer_c.h"
33 
34 #include "SDL_syswm.h"
35 
36 #if SDL_VIDEO_OPENGL
37 #include "SDL_opengl.h"
38 #endif /* SDL_VIDEO_OPENGL */
39 
40 #if SDL_VIDEO_OPENGL_ES && !SDL_VIDEO_OPENGL
41 #include "SDL_opengles.h"
42 #endif /* SDL_VIDEO_OPENGL_ES && !SDL_VIDEO_OPENGL */
43 
44 /* GL and GLES2 headers conflict on Linux 32 bits */
45 #if SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL
46 #include "SDL_opengles2.h"
47 #endif /* SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL */
48 
49 #if !SDL_VIDEO_OPENGL
50 #ifndef GL_CONTEXT_RELEASE_BEHAVIOR_KHR
51 #define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB
52 #endif
53 #endif
54 
55 #ifdef __EMSCRIPTEN__
56 #include <emscripten.h>
57 #endif
58 
59 /* Available video drivers */
61 #if SDL_VIDEO_DRIVER_COCOA
63 #endif
64 #if SDL_VIDEO_DRIVER_X11
66 #endif
67 #if SDL_VIDEO_DRIVER_WAYLAND
69 #endif
70 #if SDL_VIDEO_DRIVER_VIVANTE
72 #endif
73 #if SDL_VIDEO_DRIVER_DIRECTFB
75 #endif
76 #if SDL_VIDEO_DRIVER_WINDOWS
78 #endif
79 #if SDL_VIDEO_DRIVER_WINRT
81 #endif
82 #if SDL_VIDEO_DRIVER_HAIKU
84 #endif
85 #if SDL_VIDEO_DRIVER_PANDORA
87 #endif
88 #if SDL_VIDEO_DRIVER_UIKIT
90 #endif
91 #if SDL_VIDEO_DRIVER_ANDROID
93 #endif
94 #if SDL_VIDEO_DRIVER_PSP
96 #endif
97 #if SDL_VIDEO_DRIVER_KMSDRM
100 #endif
101 #if SDL_VIDEO_DRIVER_RPI
102  &RPI_bootstrap,
103 #endif
104 #if SDL_VIDEO_DRIVER_NACL
106 #endif
107 #if SDL_VIDEO_DRIVER_EMSCRIPTEN
109 #endif
110 #if SDL_VIDEO_DRIVER_QNX
111  &QNX_bootstrap,
112 #endif
113 #if SDL_VIDEO_DRIVER_OFFSCREEN
115 #endif
116 #if SDL_VIDEO_DRIVER_OS2
119 #endif
120 #if SDL_VIDEO_DRIVER_DUMMY
122 #endif
123  NULL
124 };
125 
127 
128 #define CHECK_WINDOW_MAGIC(window, retval) \
129  if (!_this) { \
130  SDL_UninitializedVideo(); \
131  return retval; \
132  } \
133  SDL_assert(window && window->magic == &_this->window_magic); \
134  if (!window || window->magic != &_this->window_magic) { \
135  SDL_SetError("Invalid window"); \
136  return retval; \
137  }
138 
139 #define CHECK_DISPLAY_INDEX(displayIndex, retval) \
140  if (!_this) { \
141  SDL_UninitializedVideo(); \
142  return retval; \
143  } \
144  SDL_assert(_this->displays != NULL); \
145  SDL_assert(displayIndex >= 0 && displayIndex < _this->num_displays); \
146  if (displayIndex < 0 || displayIndex >= _this->num_displays) { \
147  SDL_SetError("displayIndex must be in the range 0 - %d", \
148  _this->num_displays - 1); \
149  return retval; \
150  }
151 
152 #define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN)
153 
154 #ifdef __MACOSX__
155 /* Support for Mac OS X fullscreen spaces */
156 extern SDL_bool Cocoa_IsWindowInFullscreenSpace(SDL_Window * window);
157 extern SDL_bool Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state);
158 #endif
159 
160 
161 /* Support for framebuffer emulation using an accelerated renderer */
162 
163 #define SDL_WINDOWTEXTUREDATA "_SDL_WindowTextureData"
164 
165 typedef struct {
168  void *pixels;
169  int pitch;
172 
173 static SDL_bool
175 {
176  const char *hint;
177 
178  /* If there's no native framebuffer support then there's no option */
180  return SDL_TRUE;
181  }
182 
183  /* If this is the dummy driver there is no texture support */
184  if (_this->is_dummy) {
185  return SDL_FALSE;
186  }
187 
188  /* If the user has specified a software renderer we can't use a
189  texture framebuffer, or renderer creation will go recursive.
190  */
192  if (hint && SDL_strcasecmp(hint, "software") == 0) {
193  return SDL_FALSE;
194  }
195 
196  /* See if the user or application wants a specific behavior */
198  if (hint) {
199  if (*hint == '0' || SDL_strcasecmp(hint, "false") == 0) {
200  return SDL_FALSE;
201  } else {
202  return SDL_TRUE;
203  }
204  }
205 
206  /* Each platform has different performance characteristics */
207 #if defined(__WIN32__)
208  /* GDI BitBlt() is way faster than Direct3D dynamic textures right now.
209  */
210  return SDL_FALSE;
211 
212 #elif defined(__MACOSX__)
213  /* Mac OS X uses OpenGL as the native fast path (for cocoa and X11) */
214  return SDL_TRUE;
215 
216 #elif defined(__LINUX__)
217  /* Properly configured OpenGL drivers are faster than MIT-SHM */
218 #if SDL_VIDEO_OPENGL
219  /* Ugh, find a way to cache this value! */
220  {
223  SDL_bool hasAcceleratedOpenGL = SDL_FALSE;
224 
225  window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32, SDL_WINDOW_OPENGL|SDL_WINDOW_HIDDEN);
226  if (window) {
228  if (context) {
229  const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
230  const char *vendor = NULL;
231 
232  glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
233  if (glGetStringFunc) {
234  vendor = (const char *) glGetStringFunc(GL_VENDOR);
235  }
236  /* Add more vendors here at will... */
237  if (vendor &&
238  (SDL_strstr(vendor, "ATI Technologies") ||
239  SDL_strstr(vendor, "NVIDIA"))) {
240  hasAcceleratedOpenGL = SDL_TRUE;
241  }
243  }
245  }
246  return hasAcceleratedOpenGL;
247  }
248 #elif SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
249  /* Let's be optimistic about this! */
250  return SDL_TRUE;
251 #else
252  return SDL_FALSE;
253 #endif
254 
255 #else
256  /* Play it safe, assume that if there is a framebuffer driver that it's
257  optimized for the current platform.
258  */
259  return SDL_FALSE;
260 #endif
261 }
262 
263 static int
265 {
267 
269  if (!data) {
271  int i;
273 
274  /* Check to see if there's a specific driver requested */
275  if (hint && *hint != '0' && *hint != '1' &&
276  SDL_strcasecmp(hint, "true") != 0 &&
277  SDL_strcasecmp(hint, "false") != 0 &&
278  SDL_strcasecmp(hint, "software") != 0) {
279  for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
280  SDL_RendererInfo info;
281  SDL_GetRenderDriverInfo(i, &info);
282  if (SDL_strcasecmp(info.name, hint) == 0) {
284  break;
285  }
286  }
287  }
288 
289  if (!renderer) {
290  for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
291  SDL_RendererInfo info;
292  SDL_GetRenderDriverInfo(i, &info);
293  if (SDL_strcmp(info.name, "software") != 0) {
295  if (renderer) {
296  break;
297  }
298  }
299  }
300  }
301  if (!renderer) {
302  return SDL_SetError("No hardware accelerated renderers available");
303  }
304 
305  /* Create the data after we successfully create the renderer (bug #1116) */
306  data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(*data));
307  if (!data) {
309  return SDL_OutOfMemory();
310  }
312 
313  data->renderer = renderer;
314  }
315 
316  /* Free any old texture and pixel data */
317  if (data->texture) {
318  SDL_DestroyTexture(data->texture);
319  data->texture = NULL;
320  }
321  SDL_free(data->pixels);
322  data->pixels = NULL;
323 
324  {
325  SDL_RendererInfo info;
326  Uint32 i;
327 
328  if (SDL_GetRendererInfo(data->renderer, &info) < 0) {
329  return -1;
330  }
331 
332  /* Find the first format without an alpha channel */
333  *format = info.texture_formats[0];
334 
335  for (i = 0; i < info.num_texture_formats; ++i) {
338  *format = info.texture_formats[i];
339  break;
340  }
341  }
342  }
343 
344  data->texture = SDL_CreateTexture(data->renderer, *format,
346  window->w, window->h);
347  if (!data->texture) {
348  return -1;
349  }
350 
351  /* Create framebuffer data */
352  data->bytes_per_pixel = SDL_BYTESPERPIXEL(*format);
353  data->pitch = (((window->w * data->bytes_per_pixel) + 3) & ~3);
354 
355  {
356  /* Make static analysis happy about potential malloc(0) calls. */
357  const size_t allocsize = window->h * data->pitch;
358  data->pixels = SDL_malloc((allocsize > 0) ? allocsize : 1);
359  if (!data->pixels) {
360  return SDL_OutOfMemory();
361  }
362  }
363 
364  *pixels = data->pixels;
365  *pitch = data->pitch;
366 
367  /* Make sure we're not double-scaling the viewport */
368  SDL_RenderSetViewport(data->renderer, NULL);
369 
370  return 0;
371 }
372 
373 static int
375 {
377  SDL_Rect rect;
378  void *src;
379 
381  if (!data || !data->texture) {
382  return SDL_SetError("No window texture data");
383  }
384 
385  /* Update a single rect that contains subrects for best DMA performance */
386  if (SDL_GetSpanEnclosingRect(window->w, window->h, numrects, rects, &rect)) {
387  src = (void *)((Uint8 *)data->pixels +
388  rect.y * data->pitch +
389  rect.x * data->bytes_per_pixel);
390  if (SDL_UpdateTexture(data->texture, &rect, src, data->pitch) < 0) {
391  return -1;
392  }
393 
394  if (SDL_RenderCopy(data->renderer, data->texture, NULL, NULL) < 0) {
395  return -1;
396  }
397 
398  SDL_RenderPresent(data->renderer);
399  }
400  return 0;
401 }
402 
403 static void
405 {
407 
409  if (!data) {
410  return;
411  }
412  if (data->texture) {
413  SDL_DestroyTexture(data->texture);
414  }
415  if (data->renderer) {
416  SDL_DestroyRenderer(data->renderer);
417  }
418  SDL_free(data->pixels);
419  SDL_free(data);
420 }
421 
422 
423 static int
424 cmpmodes(const void *A, const void *B)
425 {
426  const SDL_DisplayMode *a = (const SDL_DisplayMode *) A;
427  const SDL_DisplayMode *b = (const SDL_DisplayMode *) B;
428  if (a == b) {
429  return 0;
430  } else if (a->w != b->w) {
431  return b->w - a->w;
432  } else if (a->h != b->h) {
433  return b->h - a->h;
434  } else if (SDL_BITSPERPIXEL(a->format) != SDL_BITSPERPIXEL(b->format)) {
435  return SDL_BITSPERPIXEL(b->format) - SDL_BITSPERPIXEL(a->format);
436  } else if (SDL_PIXELLAYOUT(a->format) != SDL_PIXELLAYOUT(b->format)) {
437  return SDL_PIXELLAYOUT(b->format) - SDL_PIXELLAYOUT(a->format);
438  } else if (a->refresh_rate != b->refresh_rate) {
439  return b->refresh_rate - a->refresh_rate;
440  }
441  return 0;
442 }
443 
444 static int
446 {
447  return SDL_SetError("Video subsystem has not been initialized");
448 }
449 
450 int
452 {
453  return SDL_arraysize(bootstrap) - 1;
454 }
455 
456 const char *
458 {
459  if (index >= 0 && index < SDL_GetNumVideoDrivers()) {
460  return bootstrap[index]->name;
461  }
462  return NULL;
463 }
464 
465 /*
466  * Initialize the video and event subsystems -- determine native pixel format
467  */
468 int
469 SDL_VideoInit(const char *driver_name)
470 {
471  SDL_VideoDevice *video;
472  int index;
473  int i;
474 
475  /* Check to make sure we don't overwrite '_this' */
476  if (_this != NULL) {
477  SDL_VideoQuit();
478  }
479 
480 #if !SDL_TIMERS_DISABLED
481  SDL_TicksInit();
482 #endif
483 
484  /* Start the event loop */
486  SDL_KeyboardInit() < 0 ||
487  SDL_MouseInit() < 0 ||
488  SDL_TouchInit() < 0) {
489  return -1;
490  }
491 
492  /* Select the proper video driver */
493  index = 0;
494  video = NULL;
495  if (driver_name == NULL) {
496  driver_name = SDL_getenv("SDL_VIDEODRIVER");
497  }
498  if (driver_name != NULL) {
499  for (i = 0; bootstrap[i]; ++i) {
500  if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) {
501  video = bootstrap[i]->create(index);
502  break;
503  }
504  }
505  } else {
506  for (i = 0; bootstrap[i]; ++i) {
507  video = bootstrap[i]->create(index);
508  if (video != NULL) {
509  break;
510  }
511  }
512  }
513  if (video == NULL) {
514  if (driver_name) {
515  return SDL_SetError("%s not available", driver_name);
516  }
517  return SDL_SetError("No available video device");
518  }
519  _this = video;
520  _this->name = bootstrap[i]->name;
521  _this->next_object_id = 1;
522 
523 
524  /* Set some very sane GL defaults */
528 
531 
532  /* Initialize the video subsystem */
533  if (_this->VideoInit(_this) < 0) {
534  SDL_VideoQuit();
535  return -1;
536  }
537 
538  /* Make sure some displays were added */
539  if (_this->num_displays == 0) {
540  SDL_VideoQuit();
541  return SDL_SetError("The video driver did not add any displays");
542  }
543 
544  /* Add the renderer framebuffer emulation if desired */
549  }
550 
551  /* Disable the screen saver by default. This is a change from <= 2.0.1,
552  but most things using SDL are games or media players; you wouldn't
553  want a screensaver to trigger if you're playing exclusively with a
554  joystick, or passively watching a movie. Things that use SDL but
555  function more like a normal desktop app should explicitly reenable the
556  screensaver. */
559  }
560 
561  /* If we don't use a screen keyboard, turn on text input by default,
562  otherwise programs that expect to get text events without enabling
563  UNICODE input won't get any events.
564 
565  Actually, come to think of it, you needed to call SDL_EnableUNICODE(1)
566  in SDL 1.2 before you got text input events. Hmm...
567  */
570  }
571 
572  /* We're ready to go! */
573  return 0;
574 }
575 
576 const char *
578 {
579  if (!_this) {
581  return NULL;
582  }
583  return _this->name;
584 }
585 
588 {
589  return _this;
590 }
591 
592 int
594 {
595  SDL_VideoDisplay display;
596 
597  SDL_zero(display);
598  if (desktop_mode) {
599  display.desktop_mode = *desktop_mode;
600  }
601  display.current_mode = display.desktop_mode;
602 
603  return SDL_AddVideoDisplay(&display, SDL_FALSE);
604 }
605 
606 int
607 SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event)
608 {
609  SDL_VideoDisplay *displays;
610  int index = -1;
611 
612  displays =
614  (_this->num_displays + 1) * sizeof(*displays));
615  if (displays) {
616  index = _this->num_displays++;
617  displays[index] = *display;
618  displays[index].device = _this;
619  _this->displays = displays;
620 
621  if (display->name) {
622  displays[index].name = SDL_strdup(display->name);
623  } else {
624  char name[32];
625 
626  SDL_itoa(index, name, 10);
627  displays[index].name = SDL_strdup(name);
628  }
629 
630  if (send_event) {
632  }
633  } else {
634  SDL_OutOfMemory();
635  }
636  return index;
637 }
638 
639 void
641 {
643  return;
644  }
645 
647 
648  if (index < (_this->num_displays - 1)) {
650  }
651  --_this->num_displays;
652 }
653 
654 int
656 {
657  if (!_this) {
659  return 0;
660  }
661  return _this->num_displays;
662 }
663 
664 int
666 {
667  int displayIndex;
668 
669  for (displayIndex = 0; displayIndex < _this->num_displays; ++displayIndex) {
670  if (display == &_this->displays[displayIndex]) {
671  return displayIndex;
672  }
673  }
674 
675  /* Couldn't find the display, just use index 0 */
676  return 0;
677 }
678 
679 void *
680 SDL_GetDisplayDriverData(int displayIndex)
681 {
682  CHECK_DISPLAY_INDEX(displayIndex, NULL);
683 
684  return _this->displays[displayIndex].driverdata;
685 }
686 
687 SDL_bool
689 {
691 }
692 
693 const char *
694 SDL_GetDisplayName(int displayIndex)
695 {
696  CHECK_DISPLAY_INDEX(displayIndex, NULL);
697 
698  return _this->displays[displayIndex].name;
699 }
700 
701 int
702 SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect)
703 {
704  CHECK_DISPLAY_INDEX(displayIndex, -1);
705 
706  if (rect) {
707  SDL_VideoDisplay *display = &_this->displays[displayIndex];
708 
709  if (_this->GetDisplayBounds) {
710  if (_this->GetDisplayBounds(_this, display, rect) == 0) {
711  return 0;
712  }
713  }
714 
715  /* Assume that the displays are left to right */
716  if (displayIndex == 0) {
717  rect->x = 0;
718  rect->y = 0;
719  } else {
720  SDL_GetDisplayBounds(displayIndex-1, rect);
721  rect->x += rect->w;
722  }
723  rect->w = display->current_mode.w;
724  rect->h = display->current_mode.h;
725  }
726  return 0; /* !!! FIXME: should this be an error if (rect==NULL) ? */
727 }
728 
729 static int
731 {
732  const char *hint = SDL_GetHint(SDL_HINT_DISPLAY_USABLE_BOUNDS);
733  return hint && (SDL_sscanf(hint, "%d,%d,%d,%d", &rect->x, &rect->y, &rect->w, &rect->h) == 4);
734 }
735 
736 int
738 {
739  CHECK_DISPLAY_INDEX(displayIndex, -1);
740 
741  if (rect) {
742  SDL_VideoDisplay *display = &_this->displays[displayIndex];
743 
744  if ((displayIndex == 0) && ParseDisplayUsableBoundsHint(rect)) {
745  return 0;
746  }
747 
749  if (_this->GetDisplayUsableBounds(_this, display, rect) == 0) {
750  return 0;
751  }
752  }
753 
754  /* Oh well, just give the entire display bounds. */
755  return SDL_GetDisplayBounds(displayIndex, rect);
756  }
757  return 0; /* !!! FIXME: should this be an error if (rect==NULL) ? */
758 }
759 
760 int
761 SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi)
762 {
763  SDL_VideoDisplay *display;
764 
765  CHECK_DISPLAY_INDEX(displayIndex, -1);
766 
767  display = &_this->displays[displayIndex];
768 
769  if (_this->GetDisplayDPI) {
770  if (_this->GetDisplayDPI(_this, display, ddpi, hdpi, vdpi) == 0) {
771  return 0;
772  }
773  } else {
774  return SDL_Unsupported();
775  }
776 
777  return -1;
778 }
779 
781 SDL_GetDisplayOrientation(int displayIndex)
782 {
783  SDL_VideoDisplay *display;
784 
786 
787  display = &_this->displays[displayIndex];
788  return display->orientation;
789 }
790 
791 SDL_bool
793 {
794  SDL_DisplayMode *modes;
795  int i, nmodes;
796 
797  /* Make sure we don't already have the mode in the list */
798  modes = display->display_modes;
799  nmodes = display->num_display_modes;
800  for (i = 0; i < nmodes; ++i) {
801  if (cmpmodes(mode, &modes[i]) == 0) {
802  return SDL_FALSE;
803  }
804  }
805 
806  /* Go ahead and add the new mode */
807  if (nmodes == display->max_display_modes) {
808  modes =
809  SDL_realloc(modes,
810  (display->max_display_modes + 32) * sizeof(*modes));
811  if (!modes) {
812  return SDL_FALSE;
813  }
814  display->display_modes = modes;
815  display->max_display_modes += 32;
816  }
817  modes[nmodes] = *mode;
818  display->num_display_modes++;
819 
820  /* Re-sort video modes */
821  SDL_qsort(display->display_modes, display->num_display_modes,
822  sizeof(SDL_DisplayMode), cmpmodes);
823 
824  return SDL_TRUE;
825 }
826 
827 static int
829 {
830  if (!display->num_display_modes && _this->GetDisplayModes) {
831  _this->GetDisplayModes(_this, display);
832  SDL_qsort(display->display_modes, display->num_display_modes,
833  sizeof(SDL_DisplayMode), cmpmodes);
834  }
835  return display->num_display_modes;
836 }
837 
838 int
839 SDL_GetNumDisplayModes(int displayIndex)
840 {
841  CHECK_DISPLAY_INDEX(displayIndex, -1);
842 
843  return SDL_GetNumDisplayModesForDisplay(&_this->displays[displayIndex]);
844 }
845 
846 int
847 SDL_GetDisplayMode(int displayIndex, int index, SDL_DisplayMode * mode)
848 {
849  SDL_VideoDisplay *display;
850 
851  CHECK_DISPLAY_INDEX(displayIndex, -1);
852 
853  display = &_this->displays[displayIndex];
855  return SDL_SetError("index must be in the range of 0 - %d",
856  SDL_GetNumDisplayModesForDisplay(display) - 1);
857  }
858  if (mode) {
859  *mode = display->display_modes[index];
860  }
861  return 0;
862 }
863 
864 int
866 {
867  SDL_VideoDisplay *display;
868 
869  CHECK_DISPLAY_INDEX(displayIndex, -1);
870 
871  display = &_this->displays[displayIndex];
872  if (mode) {
873  *mode = display->desktop_mode;
874  }
875  return 0;
876 }
877 
878 int
880 {
881  SDL_VideoDisplay *display;
882 
883  CHECK_DISPLAY_INDEX(displayIndex, -1);
884 
885  display = &_this->displays[displayIndex];
886  if (mode) {
887  *mode = display->current_mode;
888  }
889  return 0;
890 }
891 
892 static SDL_DisplayMode *
894  const SDL_DisplayMode * mode,
895  SDL_DisplayMode * closest)
896 {
897  Uint32 target_format;
898  int target_refresh_rate;
899  int i;
900  SDL_DisplayMode *current, *match;
901 
902  if (!mode || !closest) {
903  SDL_SetError("Missing desired mode or closest mode parameter");
904  return NULL;
905  }
906 
907  /* Default to the desktop format */
908  if (mode->format) {
909  target_format = mode->format;
910  } else {
911  target_format = display->desktop_mode.format;
912  }
913 
914  /* Default to the desktop refresh rate */
915  if (mode->refresh_rate) {
916  target_refresh_rate = mode->refresh_rate;
917  } else {
918  target_refresh_rate = display->desktop_mode.refresh_rate;
919  }
920 
921  match = NULL;
922  for (i = 0; i < SDL_GetNumDisplayModesForDisplay(display); ++i) {
923  current = &display->display_modes[i];
924 
925  if (current->w && (current->w < mode->w)) {
926  /* Out of sorted modes large enough here */
927  break;
928  }
929  if (current->h && (current->h < mode->h)) {
930  if (current->w && (current->w == mode->w)) {
931  /* Out of sorted modes large enough here */
932  break;
933  }
934  /* Wider, but not tall enough, due to a different
935  aspect ratio. This mode must be skipped, but closer
936  modes may still follow. */
937  continue;
938  }
939  if (!match || current->w < match->w || current->h < match->h) {
940  match = current;
941  continue;
942  }
943  if (current->format != match->format) {
944  /* Sorted highest depth to lowest */
945  if (current->format == target_format ||
946  (SDL_BITSPERPIXEL(current->format) >=
947  SDL_BITSPERPIXEL(target_format)
948  && SDL_PIXELTYPE(current->format) ==
949  SDL_PIXELTYPE(target_format))) {
950  match = current;
951  }
952  continue;
953  }
954  if (current->refresh_rate != match->refresh_rate) {
955  /* Sorted highest refresh to lowest */
956  if (current->refresh_rate >= target_refresh_rate) {
957  match = current;
958  }
959  }
960  }
961  if (match) {
962  if (match->format) {
963  closest->format = match->format;
964  } else {
965  closest->format = mode->format;
966  }
967  if (match->w && match->h) {
968  closest->w = match->w;
969  closest->h = match->h;
970  } else {
971  closest->w = mode->w;
972  closest->h = mode->h;
973  }
974  if (match->refresh_rate) {
975  closest->refresh_rate = match->refresh_rate;
976  } else {
977  closest->refresh_rate = mode->refresh_rate;
978  }
979  closest->driverdata = match->driverdata;
980 
981  /*
982  * Pick some reasonable defaults if the app and driver don't
983  * care
984  */
985  if (!closest->format) {
986  closest->format = SDL_PIXELFORMAT_RGB888;
987  }
988  if (!closest->w) {
989  closest->w = 640;
990  }
991  if (!closest->h) {
992  closest->h = 480;
993  }
994  return closest;
995  }
996  return NULL;
997 }
998 
1000 SDL_GetClosestDisplayMode(int displayIndex,
1001  const SDL_DisplayMode * mode,
1002  SDL_DisplayMode * closest)
1003 {
1004  SDL_VideoDisplay *display;
1005 
1006  CHECK_DISPLAY_INDEX(displayIndex, NULL);
1007 
1008  display = &_this->displays[displayIndex];
1009  return SDL_GetClosestDisplayModeForDisplay(display, mode, closest);
1010 }
1011 
1012 static int
1014 {
1015  SDL_DisplayMode display_mode;
1016  SDL_DisplayMode current_mode;
1017 
1018  if (mode) {
1019  display_mode = *mode;
1020 
1021  /* Default to the current mode */
1022  if (!display_mode.format) {
1023  display_mode.format = display->current_mode.format;
1024  }
1025  if (!display_mode.w) {
1026  display_mode.w = display->current_mode.w;
1027  }
1028  if (!display_mode.h) {
1029  display_mode.h = display->current_mode.h;
1030  }
1031  if (!display_mode.refresh_rate) {
1032  display_mode.refresh_rate = display->current_mode.refresh_rate;
1033  }
1034 
1035  /* Get a good video mode, the closest one possible */
1036  if (!SDL_GetClosestDisplayModeForDisplay(display, &display_mode, &display_mode)) {
1037  return SDL_SetError("No video mode large enough for %dx%d",
1038  display_mode.w, display_mode.h);
1039  }
1040  } else {
1041  display_mode = display->desktop_mode;
1042  }
1043 
1044  /* See if there's anything left to do */
1045  current_mode = display->current_mode;
1046  if (SDL_memcmp(&display_mode, &current_mode, sizeof(display_mode)) == 0) {
1047  return 0;
1048  }
1049 
1050  /* Actually change the display mode */
1051  if (!_this->SetDisplayMode) {
1052  return SDL_SetError("SDL video driver doesn't support changing display mode");
1053  }
1054  if (_this->SetDisplayMode(_this, display, &display_mode) < 0) {
1055  return -1;
1056  }
1057  display->current_mode = display_mode;
1058  return 0;
1059 }
1060 
1062 SDL_GetDisplay(int displayIndex)
1063 {
1064  CHECK_DISPLAY_INDEX(displayIndex, NULL);
1065 
1066  return &_this->displays[displayIndex];
1067 }
1068 
1069 int
1071 {
1072  int displayIndex;
1073  int i, dist;
1074  int closest = -1;
1075  int closest_dist = 0x7FFFFFFF;
1076  SDL_Point center;
1077  SDL_Point delta;
1078  SDL_Rect rect;
1079 
1081 
1084  displayIndex = (window->x & 0xFFFF);
1085  if (displayIndex >= _this->num_displays) {
1086  displayIndex = 0;
1087  }
1088  return displayIndex;
1089  }
1092  displayIndex = (window->y & 0xFFFF);
1093  if (displayIndex >= _this->num_displays) {
1094  displayIndex = 0;
1095  }
1096  return displayIndex;
1097  }
1098 
1099  /* Find the display containing the window */
1100  for (i = 0; i < _this->num_displays; ++i) {
1101  SDL_VideoDisplay *display = &_this->displays[i];
1102 
1103  if (display->fullscreen_window == window) {
1104  return i;
1105  }
1106  }
1107  center.x = window->x + window->w / 2;
1108  center.y = window->y + window->h / 2;
1109  for (i = 0; i < _this->num_displays; ++i) {
1111  if (SDL_EnclosePoints(&center, 1, &rect, NULL)) {
1112  return i;
1113  }
1114 
1115  delta.x = center.x - (rect.x + rect.w / 2);
1116  delta.y = center.y - (rect.y + rect.h / 2);
1117  dist = (delta.x*delta.x + delta.y*delta.y);
1118  if (dist < closest_dist) {
1119  closest = i;
1120  closest_dist = dist;
1121  }
1122  }
1123  if (closest < 0) {
1124  SDL_SetError("Couldn't find any displays");
1125  }
1126  return closest;
1127 }
1128 
1131 {
1132  int displayIndex = SDL_GetWindowDisplayIndex(window);
1133  if (displayIndex >= 0) {
1134  return &_this->displays[displayIndex];
1135  } else {
1136  return NULL;
1137  }
1138 }
1139 
1140 int
1142 {
1144 
1145  if (mode) {
1146  window->fullscreen_mode = *mode;
1147  } else {
1148  SDL_zero(window->fullscreen_mode);
1149  }
1150 
1152  SDL_DisplayMode fullscreen_mode;
1153  if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
1155  }
1156  }
1157  return 0;
1158 }
1159 
1160 int
1162 {
1163  SDL_DisplayMode fullscreen_mode;
1164  SDL_VideoDisplay *display;
1165 
1167 
1168  if (!mode) {
1169  return SDL_InvalidParamError("mode");
1170  }
1171 
1172  fullscreen_mode = window->fullscreen_mode;
1173  if (!fullscreen_mode.w) {
1174  fullscreen_mode.w = window->windowed.w;
1175  }
1176  if (!fullscreen_mode.h) {
1177  fullscreen_mode.h = window->windowed.h;
1178  }
1179 
1180  display = SDL_GetDisplayForWindow(window);
1181 
1182  /* if in desktop size mode, just return the size of the desktop */
1184  fullscreen_mode = display->desktop_mode;
1186  &fullscreen_mode,
1187  &fullscreen_mode)) {
1188  return SDL_SetError("Couldn't find display mode match");
1189  }
1190 
1191  if (mode) {
1192  *mode = fullscreen_mode;
1193  }
1194  return 0;
1195 }
1196 
1197 Uint32
1199 {
1200  SDL_VideoDisplay *display;
1201 
1203 
1204  display = SDL_GetDisplayForWindow(window);
1205  return display->current_mode.format;
1206 }
1207 
1208 static void
1210 {
1211  int x, y;
1212 
1213  if (window == SDL_GetMouseFocus()) {
1214  SDL_GetMouseState(&x, &y);
1216  }
1217 }
1218 
1219 #if __WINRT__
1221 #endif
1222 
1223 static int
1225 {
1226  SDL_VideoDisplay *display;
1227  SDL_Window *other;
1228 
1230 
1231  /* if we are in the process of hiding don't go back to fullscreen */
1232  if (window->is_hiding && fullscreen) {
1233  return 0;
1234  }
1235 
1236 #ifdef __MACOSX__
1237  /* if the window is going away and no resolution change is necessary,
1238  do nothing, or else we may trigger an ugly double-transition
1239  */
1240  if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
1241  if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)
1242  return 0;
1243 
1244  /* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
1245  if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
1246  if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
1247  return -1;
1248  }
1249  } else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
1250  display = SDL_GetDisplayForWindow(window);
1252  if (_this->SetWindowFullscreen) {
1254  }
1255  }
1256 
1257  if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
1258  if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
1259  return -1;
1260  }
1261  window->last_fullscreen_flags = window->flags;
1262  return 0;
1263  }
1264  }
1265 #elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
1266  /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen
1267  or not. The user can choose this, via OS-provided UI, but this can't
1268  be set programmatically.
1269 
1270  Just look at what SDL's WinRT video backend code detected with regards
1271  to fullscreen (being active, or not), and figure out a return/error code
1272  from that.
1273  */
1274  if (fullscreen == !(WINRT_DetectWindowFlags(window) & FULLSCREEN_MASK)) {
1275  /* Uh oh, either:
1276  1. fullscreen was requested, and we're already windowed
1277  2. windowed-mode was requested, and we're already fullscreen
1278 
1279  WinRT 8.x can't resolve either programmatically, so we're
1280  giving up.
1281  */
1282  return -1;
1283  } else {
1284  /* Whatever was requested, fullscreen or windowed mode, is already
1285  in-place.
1286  */
1287  return 0;
1288  }
1289 #endif
1290 
1291  display = SDL_GetDisplayForWindow(window);
1292 
1293  if (fullscreen) {
1294  /* Hide any other fullscreen windows */
1295  if (display->fullscreen_window &&
1296  display->fullscreen_window != window) {
1298  }
1299  }
1300 
1301  /* See if anything needs to be done now */
1302  if ((display->fullscreen_window == window) == fullscreen) {
1303  if ((window->last_fullscreen_flags & FULLSCREEN_MASK) == (window->flags & FULLSCREEN_MASK)) {
1304  return 0;
1305  }
1306  }
1307 
1308  /* See if there are any fullscreen windows */
1309  for (other = _this->windows; other; other = other->next) {
1310  SDL_bool setDisplayMode = SDL_FALSE;
1311 
1312  if (other == window) {
1313  setDisplayMode = fullscreen;
1314  } else if (FULLSCREEN_VISIBLE(other) &&
1315  SDL_GetDisplayForWindow(other) == display) {
1316  setDisplayMode = SDL_TRUE;
1317  }
1318 
1319  if (setDisplayMode) {
1320  SDL_DisplayMode fullscreen_mode;
1321 
1322  SDL_zero(fullscreen_mode);
1323 
1324  if (SDL_GetWindowDisplayMode(other, &fullscreen_mode) == 0) {
1325  SDL_bool resized = SDL_TRUE;
1326 
1327  if (other->w == fullscreen_mode.w && other->h == fullscreen_mode.h) {
1328  resized = SDL_FALSE;
1329  }
1330 
1331  /* only do the mode change if we want exclusive fullscreen */
1333  if (SDL_SetDisplayModeForDisplay(display, &fullscreen_mode) < 0) {
1334  return -1;
1335  }
1336  } else {
1337  if (SDL_SetDisplayModeForDisplay(display, NULL) < 0) {
1338  return -1;
1339  }
1340  }
1341 
1342  if (_this->SetWindowFullscreen) {
1343  _this->SetWindowFullscreen(_this, other, display, SDL_TRUE);
1344  }
1345  display->fullscreen_window = other;
1346 
1347  /* Generate a mode change event here */
1348  if (resized) {
1349 #ifndef ANDROID
1350  // Android may not resize the window to exactly what our fullscreen mode is, especially on
1351  // windowed Android environments like the Chromebook or Samsung DeX. Given this, we shouldn't
1352  // use fullscreen_mode.w and fullscreen_mode.h, but rather get our current native size. As such,
1353  // Android's SetWindowFullscreen will generate the window event for us with the proper final size.
1354 
1356  fullscreen_mode.w, fullscreen_mode.h);
1357 #endif
1358  } else {
1359  SDL_OnWindowResized(other);
1360  }
1361 
1362  SDL_RestoreMousePosition(other);
1363 
1364  window->last_fullscreen_flags = window->flags;
1365  return 0;
1366  }
1367  }
1368  }
1369 
1370  /* Nope, restore the desktop mode */
1372 
1373  if (_this->SetWindowFullscreen) {
1375  }
1376  display->fullscreen_window = NULL;
1377 
1378  /* Generate a mode change event here */
1380 
1381  /* Restore the cursor position */
1383 
1384  window->last_fullscreen_flags = window->flags;
1385  return 0;
1386 }
1387 
1388 #define CREATE_FLAGS \
1389  (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP | SDL_WINDOW_VULKAN | SDL_WINDOW_MINIMIZED | SDL_WINDOW_METAL)
1390 
1391 static SDL_INLINE SDL_bool
1393 {
1396  return SDL_TRUE;
1397  }
1398  return SDL_FALSE;
1399 }
1400 
1401 /* prepare a newly-created window */
1402 static SDL_INLINE void
1404 {
1405  if (_this->AcceptDragAndDrop) {
1407  }
1408 }
1409 
1410 /* toggle d'n'd for all existing windows. */
1411 void
1413 {
1414  if (_this && _this->AcceptDragAndDrop) {
1416  SDL_Window *window;
1417  for (window = _this->windows; window; window = window->next) {
1419  }
1420  }
1421 }
1422 
1423 static void
1425 {
1427 
1428  if (flags & SDL_WINDOW_MAXIMIZED) {
1430  }
1431  if (flags & SDL_WINDOW_MINIMIZED) {
1433  }
1434  if (flags & SDL_WINDOW_FULLSCREEN) {
1436  }
1439  }
1440  if (!(flags & SDL_WINDOW_HIDDEN)) {
1442  }
1443 }
1444 
1445 SDL_Window *
1446 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
1447 {
1448  SDL_Window *window;
1449 
1450  if (!_this) {
1451  /* Initialize the video system if needed */
1452  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
1453  return NULL;
1454  }
1455  }
1456 
1457  if ((((flags & SDL_WINDOW_UTILITY) != 0) + ((flags & SDL_WINDOW_TOOLTIP) != 0) + ((flags & SDL_WINDOW_POPUP_MENU) != 0)) > 1) {
1458  SDL_SetError("Conflicting window flags specified");
1459  return NULL;
1460  }
1461 
1462  /* Some platforms can't create zero-sized windows */
1463  if (w < 1) {
1464  w = 1;
1465  }
1466  if (h < 1) {
1467  h = 1;
1468  }
1469 
1470  /* Some platforms blow up if the windows are too large. Raise it later? */
1471  if ((w > 16384) || (h > 16384)) {
1472  SDL_SetError("Window is too large.");
1473  return NULL;
1474  }
1475 
1476  /* Some platforms have OpenGL enabled by default */
1477 #if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__
1480  }
1481 #endif
1482  if (flags & SDL_WINDOW_OPENGL) {
1483  if (!_this->GL_CreateContext) {
1484  SDL_SetError("OpenGL support is either not configured in SDL "
1485  "or not available in current SDL video driver "
1486  "(%s) or platform", _this->name);
1487  return NULL;
1488  }
1489  if (SDL_GL_LoadLibrary(NULL) < 0) {
1490  return NULL;
1491  }
1492  }
1493 
1494  if (flags & SDL_WINDOW_VULKAN) {
1495  if (!_this->Vulkan_CreateSurface) {
1496  SDL_SetError("Vulkan support is either not configured in SDL "
1497  "or not available in current SDL video driver "
1498  "(%s) or platform", _this->name);
1499  return NULL;
1500  }
1501  if (flags & SDL_WINDOW_OPENGL) {
1502  SDL_SetError("Vulkan and OpenGL not supported on same window");
1503  return NULL;
1504  }
1505  if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
1506  return NULL;
1507  }
1508  }
1509 
1510  if (flags & SDL_WINDOW_METAL) {
1511  if (!_this->Metal_CreateView) {
1512  SDL_SetError("Metal support is either not configured in SDL "
1513  "or not available in current SDL video driver "
1514  "(%s) or platform", _this->name);
1515  return NULL;
1516  }
1517  if (flags & SDL_WINDOW_OPENGL) {
1518  SDL_SetError("Metal and OpenGL not supported on same window");
1519  return NULL;
1520  }
1521  if (flags & SDL_WINDOW_VULKAN) {
1522  SDL_SetError("Metal and Vulkan not supported on same window. "
1523  "To use MoltenVK, set SDL_WINDOW_VULKAN only.");
1524  return NULL;
1525  }
1526  }
1527 
1528  /* Unless the user has specified the high-DPI disabling hint, respect the
1529  * SDL_WINDOW_ALLOW_HIGHDPI flag.
1530  */
1534  }
1535  }
1536 
1537  window = (SDL_Window *)SDL_calloc(1, sizeof(*window));
1538  if (!window) {
1539  SDL_OutOfMemory();
1540  return NULL;
1541  }
1542  window->magic = &_this->window_magic;
1543  window->id = _this->next_object_id++;
1544  window->x = x;
1545  window->y = y;
1546  window->w = w;
1547  window->h = h;
1551  int displayIndex;
1552  SDL_Rect bounds;
1553 
1554  displayIndex = SDL_GetIndexOfDisplay(display);
1555  SDL_GetDisplayBounds(displayIndex, &bounds);
1557  window->x = bounds.x + (bounds.w - w) / 2;
1558  }
1560  window->y = bounds.y + (bounds.h - h) / 2;
1561  }
1562  }
1563  window->windowed.x = window->x;
1564  window->windowed.y = window->y;
1565  window->windowed.w = window->w;
1566  window->windowed.h = window->h;
1567 
1568  if (flags & SDL_WINDOW_FULLSCREEN) {
1570  int displayIndex;
1571  SDL_Rect bounds;
1572 
1573  displayIndex = SDL_GetIndexOfDisplay(display);
1574  SDL_GetDisplayBounds(displayIndex, &bounds);
1575 
1576  window->x = bounds.x;
1577  window->y = bounds.y;
1578  window->w = bounds.w;
1579  window->h = bounds.h;
1580  }
1581 
1582  window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);
1583  window->last_fullscreen_flags = window->flags;
1584  window->opacity = 1.0f;
1585  window->brightness = 1.0f;
1586  window->next = _this->windows;
1588 
1589  if (_this->windows) {
1590  _this->windows->prev = window;
1591  }
1592  _this->windows = window;
1593 
1596  return NULL;
1597  }
1598 
1599  /* Clear minimized if not on windows, only windows handles it at create rather than FinishWindowCreation,
1600  * but it's important or window focus will get broken on windows!
1601  */
1602 #if !defined(__WIN32__)
1603  if (window->flags & SDL_WINDOW_MINIMIZED) {
1604  window->flags &= ~SDL_WINDOW_MINIMIZED;
1605  }
1606 #endif
1607 
1608 #if __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
1609  /* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen
1610  or not. The user can choose this, via OS-provided UI, but this can't
1611  be set programmatically.
1612 
1613  Just look at what SDL's WinRT video backend code detected with regards
1614  to fullscreen (being active, or not), and figure out a return/error code
1615  from that.
1616  */
1617  flags = window->flags;
1618 #endif
1619 
1620  if (title) {
1621  SDL_SetWindowTitle(window, title);
1622  }
1624 
1625  /* If the window was created fullscreen, make sure the mode code matches */
1627 
1628  return window;
1629 }
1630 
1631 SDL_Window *
1633 {
1634  SDL_Window *window;
1635 
1636  if (!_this) {
1638  return NULL;
1639  }
1640  if (!_this->CreateSDLWindowFrom) {
1641  SDL_Unsupported();
1642  return NULL;
1643  }
1644  window = (SDL_Window *)SDL_calloc(1, sizeof(*window));
1645  if (!window) {
1646  SDL_OutOfMemory();
1647  return NULL;
1648  }
1649  window->magic = &_this->window_magic;
1650  window->id = _this->next_object_id++;
1651  window->flags = SDL_WINDOW_FOREIGN;
1652  window->last_fullscreen_flags = window->flags;
1653  window->is_destroying = SDL_FALSE;
1654  window->opacity = 1.0f;
1655  window->brightness = 1.0f;
1656  window->next = _this->windows;
1657  if (_this->windows) {
1658  _this->windows->prev = window;
1659  }
1660  _this->windows = window;
1661 
1662  if (_this->CreateSDLWindowFrom(_this, window, data) < 0) {
1664  return NULL;
1665  }
1666 
1668 
1669  return window;
1670 }
1671 
1672 int
1674 {
1675  SDL_bool loaded_opengl = SDL_FALSE;
1676  SDL_bool need_gl_unload = SDL_FALSE;
1677  SDL_bool need_gl_load = SDL_FALSE;
1678  SDL_bool loaded_vulkan = SDL_FALSE;
1679  SDL_bool need_vulkan_unload = SDL_FALSE;
1680  SDL_bool need_vulkan_load = SDL_FALSE;
1681 
1683  return SDL_SetError("OpenGL support is either not configured in SDL "
1684  "or not available in current SDL video driver "
1685  "(%s) or platform", _this->name);
1686  }
1687 
1688  if (window->flags & SDL_WINDOW_FOREIGN) {
1689  /* Can't destroy and re-create foreign windows, hrm */
1691  } else {
1693  }
1694 
1695  /* Restore video mode, etc. */
1697 
1698  /* Tear down the old native window */
1699  if (window->surface) {
1700  window->surface->flags &= ~SDL_DONTFREE;
1701  SDL_FreeSurface(window->surface);
1702  window->surface = NULL;
1703  window->surface_valid = SDL_FALSE;
1704  }
1707  }
1710  }
1711 
1712  if ((window->flags & SDL_WINDOW_OPENGL) != (flags & SDL_WINDOW_OPENGL)) {
1713  if (flags & SDL_WINDOW_OPENGL) {
1714  need_gl_load = SDL_TRUE;
1715  } else {
1716  need_gl_unload = SDL_TRUE;
1717  }
1718  } else if (window->flags & SDL_WINDOW_OPENGL) {
1719  need_gl_unload = SDL_TRUE;
1720  need_gl_load = SDL_TRUE;
1721  }
1722 
1723  if ((window->flags & SDL_WINDOW_METAL) != (flags & SDL_WINDOW_METAL)) {
1724  if (flags & SDL_WINDOW_METAL) {
1725  need_gl_load = SDL_TRUE;
1726  } else {
1727  need_gl_unload = SDL_TRUE;
1728  }
1729  } else if (window->flags & SDL_WINDOW_METAL) {
1730  need_gl_unload = SDL_TRUE;
1731  need_gl_load = SDL_TRUE;
1732  }
1733 
1734  if ((window->flags & SDL_WINDOW_VULKAN) != (flags & SDL_WINDOW_VULKAN)) {
1735  if (flags & SDL_WINDOW_VULKAN) {
1736  need_vulkan_load = SDL_TRUE;
1737  } else {
1738  need_vulkan_unload = SDL_TRUE;
1739  }
1740  } else if (window->flags & SDL_WINDOW_VULKAN) {
1741  need_vulkan_unload = SDL_TRUE;
1742  need_vulkan_load = SDL_TRUE;
1743  }
1744 
1746  SDL_SetError("Vulkan and OpenGL not supported on same window");
1747  return -1;
1748  }
1749 
1750  if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_OPENGL)) {
1751  SDL_SetError("Metal and OpenGL not supported on same window");
1752  return -1;
1753  }
1754 
1755  if ((flags & SDL_WINDOW_METAL) && (flags & SDL_WINDOW_VULKAN)) {
1756  SDL_SetError("Metal and Vulkan not supported on same window");
1757  return -1;
1758  }
1759 
1760  if (need_gl_unload) {
1762  }
1763 
1764  if (need_vulkan_unload) {
1766  }
1767 
1768  if (need_gl_load) {
1769  if (SDL_GL_LoadLibrary(NULL) < 0) {
1770  return -1;
1771  }
1772  loaded_opengl = SDL_TRUE;
1773  }
1774 
1775  if (need_vulkan_load) {
1776  if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
1777  return -1;
1778  }
1779  loaded_vulkan = SDL_TRUE;
1780  }
1781 
1782  window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);
1783  window->last_fullscreen_flags = window->flags;
1784  window->is_destroying = SDL_FALSE;
1785 
1787  if (_this->CreateSDLWindow(_this, window) < 0) {
1788  if (loaded_opengl) {
1790  window->flags &= ~SDL_WINDOW_OPENGL;
1791  }
1792  if (loaded_vulkan) {
1794  window->flags &= ~SDL_WINDOW_VULKAN;
1795  }
1796  return -1;
1797  }
1798  }
1799 
1800  if (flags & SDL_WINDOW_FOREIGN) {
1801  window->flags |= SDL_WINDOW_FOREIGN;
1802  }
1803 
1804  if (_this->SetWindowTitle && window->title) {
1806  }
1807 
1808  if (_this->SetWindowIcon && window->icon) {
1810  }
1811 
1812  if (window->hit_test) {
1814  }
1815 
1817 
1818  return 0;
1819 }
1820 
1821 SDL_bool
1823 {
1824  return (_this && _this->windows != NULL);
1825 }
1826 
1827 Uint32
1829 {
1831 
1832  return window->id;
1833 }
1834 
1835 SDL_Window *
1837 {
1838  SDL_Window *window;
1839 
1840  if (!_this) {
1841  return NULL;
1842  }
1843  for (window = _this->windows; window; window = window->next) {
1844  if (window->id == id) {
1845  return window;
1846  }
1847  }
1848  return NULL;
1849 }
1850 
1851 Uint32
1853 {
1855 
1856  return window->flags;
1857 }
1858 
1859 void
1860 SDL_SetWindowTitle(SDL_Window * window, const char *title)
1861 {
1863 
1864  if (title == window->title) {
1865  return;
1866  }
1867  SDL_free(window->title);
1868 
1869  window->title = SDL_strdup(title ? title : "");
1870 
1871  if (_this->SetWindowTitle) {
1873  }
1874 }
1875 
1876 const char *
1878 {
1880 
1881  return window->title ? window->title : "";
1882 }
1883 
1884 void
1886 {
1888 
1889  if (!icon) {
1890  return;
1891  }
1892 
1893  SDL_FreeSurface(window->icon);
1894 
1895  /* Convert the icon into ARGB8888 */
1897  if (!window->icon) {
1898  return;
1899  }
1900 
1901  if (_this->SetWindowIcon) {
1903  }
1904 }
1905 
1906 void*
1907 SDL_SetWindowData(SDL_Window * window, const char *name, void *userdata)
1908 {
1909  SDL_WindowUserData *prev, *data;
1910 
1912 
1913  /* Input validation */
1914  if (name == NULL || name[0] == '\0') {
1915  SDL_InvalidParamError("name");
1916  return NULL;
1917  }
1918 
1919  /* See if the named data already exists */
1920  prev = NULL;
1921  for (data = window->data; data; prev = data, data = data->next) {
1922  if (data->name && SDL_strcmp(data->name, name) == 0) {
1923  void *last_value = data->data;
1924 
1925  if (userdata) {
1926  /* Set the new value */
1927  data->data = userdata;
1928  } else {
1929  /* Delete this value */
1930  if (prev) {
1931  prev->next = data->next;
1932  } else {
1933  window->data = data->next;
1934  }
1935  SDL_free(data->name);
1936  SDL_free(data);
1937  }
1938  return last_value;
1939  }
1940  }
1941 
1942  /* Add new data to the window */
1943  if (userdata) {
1944  data = (SDL_WindowUserData *)SDL_malloc(sizeof(*data));
1945  data->name = SDL_strdup(name);
1946  data->data = userdata;
1947  data->next = window->data;
1948  window->data = data;
1949  }
1950  return NULL;
1951 }
1952 
1953 void *
1955 {
1957 
1959 
1960  /* Input validation */
1961  if (name == NULL || name[0] == '\0') {
1962  SDL_InvalidParamError("name");
1963  return NULL;
1964  }
1965 
1966  for (data = window->data; data; data = data->next) {
1967  if (data->name && SDL_strcmp(data->name, name) == 0) {
1968  return data->data;
1969  }
1970  }
1971  return NULL;
1972 }
1973 
1974 void
1976 {
1978 
1980  int displayIndex = (x & 0xFFFF);
1981  SDL_Rect bounds;
1982  if (displayIndex >= _this->num_displays) {
1983  displayIndex = 0;
1984  }
1985 
1986  SDL_zero(bounds);
1987 
1988  SDL_GetDisplayBounds(displayIndex, &bounds);
1989  if (SDL_WINDOWPOS_ISCENTERED(x)) {
1990  x = bounds.x + (bounds.w - window->w) / 2;
1991  }
1992  if (SDL_WINDOWPOS_ISCENTERED(y)) {
1993  y = bounds.y + (bounds.h - window->h) / 2;
1994  }
1995  }
1996 
1997  if ((window->flags & SDL_WINDOW_FULLSCREEN)) {
1998  if (!SDL_WINDOWPOS_ISUNDEFINED(x)) {
1999  window->windowed.x = x;
2000  }
2001  if (!SDL_WINDOWPOS_ISUNDEFINED(y)) {
2002  window->windowed.y = y;
2003  }
2004  } else {
2005  if (!SDL_WINDOWPOS_ISUNDEFINED(x)) {
2006  window->x = x;
2007  }
2008  if (!SDL_WINDOWPOS_ISUNDEFINED(y)) {
2009  window->y = y;
2010  }
2011 
2012  if (_this->SetWindowPosition) {
2014  }
2015  }
2016 }
2017 
2018 void
2020 {
2022 
2023  /* Fullscreen windows are always at their display's origin */
2024  if (window->flags & SDL_WINDOW_FULLSCREEN) {
2025  int displayIndex;
2026 
2027  if (x) {
2028  *x = 0;
2029  }
2030  if (y) {
2031  *y = 0;
2032  }
2033 
2034  /* Find the window's monitor and update to the
2035  monitor offset. */
2036  displayIndex = SDL_GetWindowDisplayIndex(window);
2037  if (displayIndex >= 0) {
2038  SDL_Rect bounds;
2039 
2040  SDL_zero(bounds);
2041 
2042  SDL_GetDisplayBounds(displayIndex, &bounds);
2043  if (x) {
2044  *x = bounds.x;
2045  }
2046  if (y) {
2047  *y = bounds.y;
2048  }
2049  }
2050  } else {
2051  if (x) {
2052  *x = window->x;
2053  }
2054  if (y) {
2055  *y = window->y;
2056  }
2057  }
2058 }
2059 
2060 void
2062 {
2064  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
2065  const int want = (bordered != SDL_FALSE); /* normalize the flag. */
2066  const int have = ((window->flags & SDL_WINDOW_BORDERLESS) == 0);
2067  if ((want != have) && (_this->SetWindowBordered)) {
2068  if (want) {
2069  window->flags &= ~SDL_WINDOW_BORDERLESS;
2070  } else {
2071  window->flags |= SDL_WINDOW_BORDERLESS;
2072  }
2074  }
2075  }
2076 }
2077 
2078 void
2080 {
2082  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
2083  const int want = (resizable != SDL_FALSE); /* normalize the flag. */
2084  const int have = ((window->flags & SDL_WINDOW_RESIZABLE) != 0);
2085  if ((want != have) && (_this->SetWindowResizable)) {
2086  if (want) {
2087  window->flags |= SDL_WINDOW_RESIZABLE;
2088  } else {
2089  window->flags &= ~SDL_WINDOW_RESIZABLE;
2090  }
2092  }
2093  }
2094 }
2095 
2096 void
2098 {
2100  if (w <= 0) {
2101  SDL_InvalidParamError("w");
2102  return;
2103  }
2104  if (h <= 0) {
2105  SDL_InvalidParamError("h");
2106  return;
2107  }
2108 
2109  /* Make sure we don't exceed any window size limits */
2110  if (window->min_w && w < window->min_w) {
2111  w = window->min_w;
2112  }
2113  if (window->max_w && w > window->max_w) {
2114  w = window->max_w;
2115  }
2116  if (window->min_h && h < window->min_h) {
2117  h = window->min_h;
2118  }
2119  if (window->max_h && h > window->max_h) {
2120  h = window->max_h;
2121  }
2122 
2123  window->windowed.w = w;
2124  window->windowed.h = h;
2125 
2126  if (window->flags & SDL_WINDOW_FULLSCREEN) {
2128  window->last_fullscreen_flags = 0;
2130  }
2131  } else {
2132  window->w = w;
2133  window->h = h;
2134  if (_this->SetWindowSize) {
2136  }
2137  if (window->w == w && window->h == h) {
2138  /* We didn't get a SDL_WINDOWEVENT_RESIZED event (by design) */
2140  }
2141  }
2142 }
2143 
2144 void
2146 {
2148  if (w) {
2149  *w = window->w;
2150  }
2151  if (h) {
2152  *h = window->h;
2153  }
2154 }
2155 
2156 int
2158 {
2159  int dummy = 0;
2160 
2161  if (!top) { top = &dummy; }
2162  if (!left) { left = &dummy; }
2163  if (!right) { right = &dummy; }
2164  if (!bottom) { bottom = &dummy; }
2165 
2166  /* Always initialize, so applications don't have to care */
2167  *top = *left = *bottom = *right = 0;
2168 
2170 
2171  if (!_this->GetWindowBordersSize) {
2172  return SDL_Unsupported();
2173  }
2174 
2176 }
2177 
2178 void
2180 {
2182  if (min_w <= 0) {
2183  SDL_InvalidParamError("min_w");
2184  return;
2185  }
2186  if (min_h <= 0) {
2187  SDL_InvalidParamError("min_h");
2188  return;
2189  }
2190 
2191  if ((window->max_w && min_w > window->max_w) ||
2192  (window->max_h && min_h > window->max_h)) {
2193  SDL_SetError("SDL_SetWindowMinimumSize(): Tried to set minimum size larger than maximum size");
2194  return;
2195  }
2196 
2197  window->min_w = min_w;
2198  window->min_h = min_h;
2199 
2200  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
2201  if (_this->SetWindowMinimumSize) {
2203  }
2204  /* Ensure that window is not smaller than minimal size */
2205  SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h));
2206  }
2207 }
2208 
2209 void
2210 SDL_GetWindowMinimumSize(SDL_Window * window, int *min_w, int *min_h)
2211 {
2213  if (min_w) {
2214  *min_w = window->min_w;
2215  }
2216  if (min_h) {
2217  *min_h = window->min_h;
2218  }
2219 }
2220 
2221 void
2223 {
2225  if (max_w <= 0) {
2226  SDL_InvalidParamError("max_w");
2227  return;
2228  }
2229  if (max_h <= 0) {
2230  SDL_InvalidParamError("max_h");
2231  return;
2232  }
2233 
2234  if (max_w < window->min_w || max_h < window->min_h) {
2235  SDL_SetError("SDL_SetWindowMaximumSize(): Tried to set maximum size smaller than minimum size");
2236  return;
2237  }
2238 
2239  window->max_w = max_w;
2240  window->max_h = max_h;
2241 
2242  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
2243  if (_this->SetWindowMaximumSize) {
2245  }
2246  /* Ensure that window is not larger than maximal size */
2247  SDL_SetWindowSize(window, SDL_min(window->w, window->max_w), SDL_min(window->h, window->max_h));
2248  }
2249 }
2250 
2251 void
2252 SDL_GetWindowMaximumSize(SDL_Window * window, int *max_w, int *max_h)
2253 {
2255  if (max_w) {
2256  *max_w = window->max_w;
2257  }
2258  if (max_h) {
2259  *max_h = window->max_h;
2260  }
2261 }
2262 
2263 void
2265 {
2267 
2268  if (window->flags & SDL_WINDOW_SHOWN) {
2269  return;
2270  }
2271 
2272  if (_this->ShowWindow) {
2274  }
2276 }
2277 
2278 void
2280 {
2282 
2283  if (!(window->flags & SDL_WINDOW_SHOWN)) {
2284  return;
2285  }
2286 
2287  window->is_hiding = SDL_TRUE;
2289 
2290  if (_this->HideWindow) {
2292  }
2293  window->is_hiding = SDL_FALSE;
2295 }
2296 
2297 void
2299 {
2301 
2302  if (!(window->flags & SDL_WINDOW_SHOWN)) {
2303  return;
2304  }
2305  if (_this->RaiseWindow) {
2307  }
2308 }
2309 
2310 void
2312 {
2314 
2315  if (window->flags & SDL_WINDOW_MAXIMIZED) {
2316  return;
2317  }
2318 
2319  /* !!! FIXME: should this check if the window is resizable? */
2320 
2321  if (_this->MaximizeWindow) {
2323  }
2324 }
2325 
2326 static SDL_bool
2328 {
2329  if (!_this->MinimizeWindow) {
2330  return SDL_FALSE;
2331  }
2332  return SDL_TRUE;
2333 }
2334 
2335 void
2337 {
2339 
2340  if (window->flags & SDL_WINDOW_MINIMIZED) {
2341  return;
2342  }
2343 
2344  if (!CanMinimizeWindow(window)) {
2345  return;
2346  }
2347 
2349 
2350  if (_this->MinimizeWindow) {
2352  }
2353 }
2354 
2355 void
2357 {
2359 
2360  if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) {
2361  return;
2362  }
2363 
2364  if (_this->RestoreWindow) {
2366  }
2367 }
2368 
2369 int
2371 {
2372  Uint32 oldflags;
2374 
2376 
2377  if (flags == (window->flags & FULLSCREEN_MASK)) {
2378  return 0;
2379  }
2380 
2381  /* clear the previous flags and OR in the new ones */
2382  oldflags = window->flags & FULLSCREEN_MASK;
2383  window->flags &= ~FULLSCREEN_MASK;
2384  window->flags |= flags;
2385 
2387  return 0;
2388  }
2389 
2390  window->flags &= ~FULLSCREEN_MASK;
2391  window->flags |= oldflags;
2392  return -1;
2393 }
2394 
2395 static SDL_Surface *
2397 {
2398  Uint32 format;
2399  void *pixels;
2400  int pitch;
2401  int bpp;
2402  Uint32 Rmask, Gmask, Bmask, Amask;
2403 
2405  return NULL;
2406  }
2407 
2408  if (_this->CreateWindowFramebuffer(_this, window, &format, &pixels, &pitch) < 0) {
2409  return NULL;
2410  }
2411 
2412  if (window->surface) {
2413  return window->surface;
2414  }
2415 
2416  if (!SDL_PixelFormatEnumToMasks(format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
2417  return NULL;
2418  }
2419 
2420  return SDL_CreateRGBSurfaceFrom(pixels, window->w, window->h, bpp, pitch, Rmask, Gmask, Bmask, Amask);
2421 }
2422 
2423 SDL_Surface *
2425 {
2427 
2428  if (!window->surface_valid) {
2429  if (window->surface) {
2430  window->surface->flags &= ~SDL_DONTFREE;
2431  SDL_FreeSurface(window->surface);
2432  window->surface = NULL;
2433  }
2435  if (window->surface) {
2436  window->surface_valid = SDL_TRUE;
2437  window->surface->flags |= SDL_DONTFREE;
2438  }
2439  }
2440  return window->surface;
2441 }
2442 
2443 int
2445 {
2446  SDL_Rect full_rect;
2447 
2449 
2450  full_rect.x = 0;
2451  full_rect.y = 0;
2452  full_rect.w = window->w;
2453  full_rect.h = window->h;
2454  return SDL_UpdateWindowSurfaceRects(window, &full_rect, 1);
2455 }
2456 
2457 int
2459  int numrects)
2460 {
2462 
2463  if (!window->surface_valid) {
2464  return SDL_SetError("Window surface is invalid, please call SDL_GetWindowSurface() to get a new surface");
2465  }
2466 
2467  return _this->UpdateWindowFramebuffer(_this, window, rects, numrects);
2468 }
2469 
2470 int
2472 {
2473  Uint16 ramp[256];
2474  int status;
2475 
2477 
2478  SDL_CalculateGammaRamp(brightness, ramp);
2479  status = SDL_SetWindowGammaRamp(window, ramp, ramp, ramp);
2480  if (status == 0) {
2481  window->brightness = brightness;
2482  }
2483  return status;
2484 }
2485 
2486 float
2488 {
2489  CHECK_WINDOW_MAGIC(window, 1.0f);
2490 
2491  return window->brightness;
2492 }
2493 
2494 int
2496 {
2497  int retval;
2499 
2500  if (!_this->SetWindowOpacity) {
2501  return SDL_Unsupported();
2502  }
2503 
2504  if (opacity < 0.0f) {
2505  opacity = 0.0f;
2506  } else if (opacity > 1.0f) {
2507  opacity = 1.0f;
2508  }
2509 
2510  retval = _this->SetWindowOpacity(_this, window, opacity);
2511  if (retval == 0) {
2512  window->opacity = opacity;
2513  }
2514 
2515  return retval;
2516 }
2517 
2518 int
2519 SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity)
2520 {
2522 
2523  if (out_opacity) {
2524  *out_opacity = window->opacity;
2525  }
2526 
2527  return 0;
2528 }
2529 
2530 int
2531 SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window)
2532 {
2533  CHECK_WINDOW_MAGIC(modal_window, -1);
2534  CHECK_WINDOW_MAGIC(parent_window, -1);
2535 
2536  if (!_this->SetWindowModalFor) {
2537  return SDL_Unsupported();
2538  }
2539 
2540  return _this->SetWindowModalFor(_this, modal_window, parent_window);
2541 }
2542 
2543 int
2545 {
2547 
2548  if (!_this->SetWindowInputFocus) {
2549  return SDL_Unsupported();
2550  }
2551 
2553 }
2554 
2555 
2556 int
2558  const Uint16 * green,
2559  const Uint16 * blue)
2560 {
2562 
2563  if (!_this->SetWindowGammaRamp) {
2564  return SDL_Unsupported();
2565  }
2566 
2567  if (!window->gamma) {
2568  if (SDL_GetWindowGammaRamp(window, NULL, NULL, NULL) < 0) {
2569  return -1;
2570  }
2571  SDL_assert(window->gamma != NULL);
2572  }
2573 
2574  if (red) {
2575  SDL_memcpy(&window->gamma[0*256], red, 256*sizeof(Uint16));
2576  }
2577  if (green) {
2578  SDL_memcpy(&window->gamma[1*256], green, 256*sizeof(Uint16));
2579  }
2580  if (blue) {
2581  SDL_memcpy(&window->gamma[2*256], blue, 256*sizeof(Uint16));
2582  }
2583  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
2584  return _this->SetWindowGammaRamp(_this, window, window->gamma);
2585  } else {
2586  return 0;
2587  }
2588 }
2589 
2590 int
2592  Uint16 * green,
2593  Uint16 * blue)
2594 {
2596 
2597  if (!window->gamma) {
2598  int i;
2599 
2600  window->gamma = (Uint16 *)SDL_malloc(256*6*sizeof(Uint16));
2601  if (!window->gamma) {
2602  return SDL_OutOfMemory();
2603  }
2604  window->saved_gamma = window->gamma + 3*256;
2605 
2606  if (_this->GetWindowGammaRamp) {
2607  if (_this->GetWindowGammaRamp(_this, window, window->gamma) < 0) {
2608  return -1;
2609  }
2610  } else {
2611  /* Create an identity gamma ramp */
2612  for (i = 0; i < 256; ++i) {
2613  Uint16 value = (Uint16)((i << 8) | i);
2614 
2615  window->gamma[0*256+i] = value;
2616  window->gamma[1*256+i] = value;
2617  window->gamma[2*256+i] = value;
2618  }
2619  }
2620  SDL_memcpy(window->saved_gamma, window->gamma, 3*256*sizeof(Uint16));
2621  }
2622 
2623  if (red) {
2624  SDL_memcpy(red, &window->gamma[0*256], 256*sizeof(Uint16));
2625  }
2626  if (green) {
2627  SDL_memcpy(green, &window->gamma[1*256], 256*sizeof(Uint16));
2628  }
2629  if (blue) {
2630  SDL_memcpy(blue, &window->gamma[2*256], 256*sizeof(Uint16));
2631  }
2632  return 0;
2633 }
2634 
2635 void
2637 {
2638  SDL_Window *grabbed_window;
2639  SDL_bool grabbed;
2640  if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
2641  (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
2642  grabbed = SDL_TRUE;
2643  } else {
2644  grabbed = SDL_FALSE;
2645  }
2646 
2647  grabbed_window = _this->grabbed_window;
2648  if (grabbed) {
2649  if (grabbed_window && (grabbed_window != window)) {
2650  /* stealing a grab from another window! */
2651  grabbed_window->flags &= ~SDL_WINDOW_INPUT_GRABBED;
2652  if (_this->SetWindowGrab) {
2653  _this->SetWindowGrab(_this, grabbed_window, SDL_FALSE);
2654  }
2655  }
2657  } else if (grabbed_window == window) {
2658  _this->grabbed_window = NULL; /* ungrabbing. */
2659  }
2660 
2661  if (_this->SetWindowGrab) {
2662  _this->SetWindowGrab(_this, window, grabbed);
2663  }
2664 }
2665 
2666 void
2668 {
2670 
2671  if (!!grabbed == !!(window->flags & SDL_WINDOW_INPUT_GRABBED)) {
2672  return;
2673  }
2674  if (grabbed) {
2675  window->flags |= SDL_WINDOW_INPUT_GRABBED;
2676  } else {
2677  window->flags &= ~SDL_WINDOW_INPUT_GRABBED;
2678  }
2680 }
2681 
2682 SDL_bool
2684 {
2687  return window == _this->grabbed_window;
2688 }
2689 
2690 SDL_Window *
2692 {
2694  return _this->grabbed_window;
2695 }
2696 
2697 void
2699 {
2701 }
2702 
2703 void
2705 {
2707 }
2708 
2709 void
2711 {
2712  window->surface_valid = SDL_FALSE;
2714 }
2715 
2716 void
2718 {
2720 }
2721 
2722 void
2724 {
2725  /*
2726  * FIXME: Is this fine to just remove this, or should it be preserved just
2727  * for the fullscreen case? In principle it seems like just hiding/showing
2728  * windows shouldn't affect the stacking order; maybe the right fix is to
2729  * re-decouple OnWindowShown and OnWindowRestored.
2730  */
2731  /*SDL_RaiseWindow(window);*/
2732 
2733  if (FULLSCREEN_VISIBLE(window)) {
2735  }
2736 }
2737 
2738 void
2740 {
2741  if (_this->OnWindowEnter) {
2743  }
2744 }
2745 
2746 void
2748 {
2749 }
2750 
2751 void
2753 {
2754  SDL_Mouse *mouse = SDL_GetMouse();
2755 
2756  if (window->gamma && _this->SetWindowGammaRamp) {
2758  }
2759 
2760  if (mouse && mouse->relative_mode) {
2763  }
2764 
2766 }
2767 
2768 static SDL_bool
2770 {
2771  if (!(window->flags & SDL_WINDOW_FULLSCREEN) || window->is_destroying) {
2772  return SDL_FALSE;
2773  }
2774 
2775 #ifdef __MACOSX__
2776  if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
2777  if (Cocoa_IsWindowInFullscreenSpace(window)) {
2778  return SDL_FALSE;
2779  }
2780  }
2781 #endif
2782 
2783 #ifdef __ANDROID__
2784  {
2787  return SDL_FALSE;
2788  }
2789  }
2790 #endif
2791 
2793 }
2794 
2795 void
2797 {
2798  if (window->gamma && _this->SetWindowGammaRamp) {
2799  _this->SetWindowGammaRamp(_this, window, window->saved_gamma);
2800  }
2801 
2803 
2806  }
2807 }
2808 
2809 /* !!! FIXME: is this different than SDL_GetKeyboardFocus()?
2810  !!! FIXME: Also, SDL_GetKeyboardFocus() is O(1), this isn't. */
2811 SDL_Window *
2813 {
2814  SDL_Window *window;
2815 
2816  if (!_this) {
2817  return NULL;
2818  }
2819  for (window = _this->windows; window; window = window->next) {
2820  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
2821  return window;
2822  }
2823  }
2824  return NULL;
2825 }
2826 
2827 void
2829 {
2830  SDL_VideoDisplay *display;
2831 
2833 
2834  window->is_destroying = SDL_TRUE;
2835 
2836  /* Restore video mode, etc. */
2838 
2839  /* Make sure this window no longer has focus */
2840  if (SDL_GetKeyboardFocus() == window) {
2842  }
2843  if (SDL_GetMouseFocus() == window) {
2845  }
2846 
2847  /* make no context current if this is the current context window. */
2848  if (window->flags & SDL_WINDOW_OPENGL) {
2849  if (_this->current_glwin == window) {
2851  }
2852  }
2853 
2854  if (window->surface) {
2855  window->surface->flags &= ~SDL_DONTFREE;
2856  SDL_FreeSurface(window->surface);
2857  window->surface = NULL;
2858  window->surface_valid = SDL_FALSE;
2859  }
2862  }
2863  if (_this->DestroyWindow) {
2865  }
2866  if (window->flags & SDL_WINDOW_OPENGL) {
2868  }
2869  if (window->flags & SDL_WINDOW_VULKAN) {
2871  }
2872 
2873  display = SDL_GetDisplayForWindow(window);
2874  if (display->fullscreen_window == window) {
2875  display->fullscreen_window = NULL;
2876  }
2877 
2878  /* Now invalidate magic */
2879  window->magic = NULL;
2880 
2881  /* Free memory associated with the window */
2882  SDL_free(window->title);
2883  SDL_FreeSurface(window->icon);
2884  SDL_free(window->gamma);
2885  while (window->data) {
2887 
2888  window->data = data->next;
2889  SDL_free(data->name);
2890  SDL_free(data);
2891  }
2892 
2893  /* Unlink the window from the list */
2894  if (window->next) {
2895  window->next->prev = window->prev;
2896  }
2897  if (window->prev) {
2898  window->prev->next = window->next;
2899  } else {
2900  _this->windows = window->next;
2901  }
2902 
2903  SDL_free(window);
2904 }
2905 
2906 SDL_bool
2908 {
2909  if (!_this) {
2910  return SDL_TRUE;
2911  }
2913 }
2914 
2915 void
2917 {
2918  if (!_this) {
2919  return;
2920  }
2921  if (!_this->suspend_screensaver) {
2922  return;
2923  }
2925  if (_this->SuspendScreenSaver) {
2927  }
2928 }
2929 
2930 void
2932 {
2933  if (!_this) {
2934  return;
2935  }
2936  if (_this->suspend_screensaver) {
2937  return;
2938  }
2940  if (_this->SuspendScreenSaver) {
2942  }
2943 }
2944 
2945 void
2947 {
2948  int i, j;
2949 
2950  if (!_this) {
2951  return;
2952  }
2953 
2954  /* Halt event processing before doing anything else */
2955  SDL_TouchQuit();
2956  SDL_MouseQuit();
2957  SDL_KeyboardQuit();
2959 
2961 
2962  /* Clean up the system video */
2963  while (_this->windows) {
2965  }
2966  _this->VideoQuit(_this);
2967 
2968  for (i = 0; i < _this->num_displays; ++i) {
2969  SDL_VideoDisplay *display = &_this->displays[i];
2970  for (j = display->num_display_modes; j--;) {
2971  SDL_free(display->display_modes[j].driverdata);
2972  display->display_modes[j].driverdata = NULL;
2973  }
2974  SDL_free(display->display_modes);
2975  display->display_modes = NULL;
2976  SDL_free(display->desktop_mode.driverdata);
2977  display->desktop_mode.driverdata = NULL;
2978  SDL_free(display->driverdata);
2979  display->driverdata = NULL;
2980  }
2981  if (_this->displays) {
2982  for (i = 0; i < _this->num_displays; ++i) {
2984  }
2986  _this->displays = NULL;
2987  _this->num_displays = 0;
2988  }
2991  _this->free(_this);
2992  _this = NULL;
2993 }
2994 
2995 int
2997 {
2998  int retval;
2999 
3000  if (!_this) {
3001  return SDL_UninitializedVideo();
3002  }
3003  if (_this->gl_config.driver_loaded) {
3004  if (path && SDL_strcmp(path, _this->gl_config.driver_path) != 0) {
3005  return SDL_SetError("OpenGL library already loaded");
3006  }
3007  retval = 0;
3008  } else {
3009  if (!_this->GL_LoadLibrary) {
3010  return SDL_SetError("No dynamic GL support in current SDL video driver (%s)", _this->name);
3011  }
3013  }
3014  if (retval == 0) {
3016  } else {
3017  if (_this->GL_UnloadLibrary) {
3019  }
3020  }
3021  return (retval);
3022 }
3023 
3024 void *
3025 SDL_GL_GetProcAddress(const char *proc)
3026 {
3027  void *func;
3028 
3029  if (!_this) {
3031  return NULL;
3032  }
3033  func = NULL;
3034  if (_this->GL_GetProcAddress) {
3035  if (_this->gl_config.driver_loaded) {
3036  func = _this->GL_GetProcAddress(_this, proc);
3037  } else {
3038  SDL_SetError("No GL driver has been loaded");
3039  }
3040  } else {
3041  SDL_SetError("No dynamic GL support in current SDL video driver (%s)", _this->name);
3042  }
3043  return func;
3044 }
3045 
3046 void
3048 {
3049  if (!_this) {
3051  return;
3052  }
3053  if (_this->gl_config.driver_loaded > 0) {
3054  if (--_this->gl_config.driver_loaded > 0) {
3055  return;
3056  }
3057  if (_this->GL_UnloadLibrary) {
3059  }
3060  }
3061 }
3062 
3063 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3064 static SDL_INLINE SDL_bool
3065 isAtLeastGL3(const char *verstr)
3066 {
3067  return (verstr && (SDL_atoi(verstr) >= 3));
3068 }
3069 #endif
3070 
3071 SDL_bool
3072 SDL_GL_ExtensionSupported(const char *extension)
3073 {
3074 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3075  const GLubyte *(APIENTRY * glGetStringFunc) (GLenum);
3076  const char *extensions;
3077  const char *start;
3078  const char *where, *terminator;
3079 
3080  /* Extension names should not have spaces. */
3081  where = SDL_strchr(extension, ' ');
3082  if (where || *extension == '\0') {
3083  return SDL_FALSE;
3084  }
3085  /* See if there's an environment variable override */
3086  start = SDL_getenv(extension);
3087  if (start && *start == '0') {
3088  return SDL_FALSE;
3089  }
3090 
3091  /* Lookup the available extensions */
3092 
3093  glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
3094  if (!glGetStringFunc) {
3095  return SDL_FALSE;
3096  }
3097 
3098  if (isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {
3099  const GLubyte *(APIENTRY * glGetStringiFunc) (GLenum, GLuint);
3100  void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params);
3101  GLint num_exts = 0;
3102  GLint i;
3103 
3104  glGetStringiFunc = SDL_GL_GetProcAddress("glGetStringi");
3105  glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv");
3106  if ((!glGetStringiFunc) || (!glGetIntegervFunc)) {
3107  return SDL_FALSE;
3108  }
3109 
3110  #ifndef GL_NUM_EXTENSIONS
3111  #define GL_NUM_EXTENSIONS 0x821D
3112  #endif
3113  glGetIntegervFunc(GL_NUM_EXTENSIONS, &num_exts);
3114  for (i = 0; i < num_exts; i++) {
3115  const char *thisext = (const char *) glGetStringiFunc(GL_EXTENSIONS, i);
3116  if (SDL_strcmp(thisext, extension) == 0) {
3117  return SDL_TRUE;
3118  }
3119  }
3120 
3121  return SDL_FALSE;
3122  }
3123 
3124  /* Try the old way with glGetString(GL_EXTENSIONS) ... */
3125 
3126  extensions = (const char *) glGetStringFunc(GL_EXTENSIONS);
3127  if (!extensions) {
3128  return SDL_FALSE;
3129  }
3130  /*
3131  * It takes a bit of care to be fool-proof about parsing the OpenGL
3132  * extensions string. Don't be fooled by sub-strings, etc.
3133  */
3134 
3135  start = extensions;
3136 
3137  for (;;) {
3138  where = SDL_strstr(start, extension);
3139  if (!where)
3140  break;
3141 
3142  terminator = where + SDL_strlen(extension);
3143  if (where == extensions || *(where - 1) == ' ')
3144  if (*terminator == ' ' || *terminator == '\0')
3145  return SDL_TRUE;
3146 
3147  start = terminator;
3148  }
3149  return SDL_FALSE;
3150 #else
3151  return SDL_FALSE;
3152 #endif
3153 }
3154 
3155 /* Deduce supported ES profile versions from the supported
3156  ARB_ES*_compatibility extensions. There is no direct query.
3157 
3158  This is normally only called when the OpenGL driver supports
3159  {GLX,WGL}_EXT_create_context_es2_profile.
3160  */
3161 void
3162 SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor)
3163 {
3164 /* THIS REQUIRES AN EXISTING GL CONTEXT THAT HAS BEEN MADE CURRENT. */
3165 /* Please refer to https://bugzilla.libsdl.org/show_bug.cgi?id=3725 for discussion. */
3166 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3167  /* XXX This is fragile; it will break in the event of release of
3168  * new versions of OpenGL ES.
3169  */
3170  if (SDL_GL_ExtensionSupported("GL_ARB_ES3_2_compatibility")) {
3171  *major = 3;
3172  *minor = 2;
3173  } else if (SDL_GL_ExtensionSupported("GL_ARB_ES3_1_compatibility")) {
3174  *major = 3;
3175  *minor = 1;
3176  } else if (SDL_GL_ExtensionSupported("GL_ARB_ES3_compatibility")) {
3177  *major = 3;
3178  *minor = 0;
3179  } else {
3180  *major = 2;
3181  *minor = 0;
3182  }
3183 #endif
3184 }
3185 
3186 void
3188 {
3189  if (!_this) {
3190  return;
3191  }
3192 
3193  _this->gl_config.red_size = 3;
3194  _this->gl_config.green_size = 3;
3195  _this->gl_config.blue_size = 2;
3196  _this->gl_config.alpha_size = 0;
3198  _this->gl_config.depth_size = 16;
3205  _this->gl_config.stereo = 0;
3209  _this->gl_config.accelerated = -1; /* accelerated or not, both are fine */
3210 
3211 #if SDL_VIDEO_OPENGL
3215 #elif SDL_VIDEO_OPENGL_ES2
3219 #elif SDL_VIDEO_OPENGL_ES
3223 #endif
3224 
3229  }
3230 
3231  _this->gl_config.flags = 0;
3233  _this->gl_config.no_error = 0;
3236 
3238 }
3239 
3240 int
3242 {
3243 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3244  int retval;
3245 
3246  if (!_this) {
3247  return SDL_UninitializedVideo();
3248  }
3249  retval = 0;
3250  switch (attr) {
3251  case SDL_GL_RED_SIZE:
3253  break;
3254  case SDL_GL_GREEN_SIZE:
3256  break;
3257  case SDL_GL_BLUE_SIZE:
3259  break;
3260  case SDL_GL_ALPHA_SIZE:
3262  break;
3263  case SDL_GL_DOUBLEBUFFER:
3265  break;
3266  case SDL_GL_BUFFER_SIZE:
3268  break;
3269  case SDL_GL_DEPTH_SIZE:
3271  break;
3272  case SDL_GL_STENCIL_SIZE:
3274  break;
3275  case SDL_GL_ACCUM_RED_SIZE:
3277  break;
3280  break;
3283  break;
3286  break;
3287  case SDL_GL_STEREO:
3289  break;
3292  break;
3295  break;
3298  break;
3301  break;
3304  break;
3307  break;
3308  case SDL_GL_CONTEXT_EGL:
3309  /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */
3310  if (value != 0) {
3312  } else {
3314  };
3315  break;
3316  case SDL_GL_CONTEXT_FLAGS:
3321  retval = SDL_SetError("Unknown OpenGL context flag %d", value);
3322  break;
3323  }
3325  break;
3327  if (value != 0 &&
3331  retval = SDL_SetError("Unknown OpenGL context profile %d", value);
3332  break;
3333  }
3335  break;
3338  break;
3341  break;
3344  break;
3347  break;
3350  break;
3351  default:
3352  retval = SDL_SetError("Unknown OpenGL attribute");
3353  break;
3354  }
3355  return retval;
3356 #else
3357  return SDL_Unsupported();
3358 #endif /* SDL_VIDEO_OPENGL */
3359 }
3360 
3361 int
3363 {
3364 #if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
3365  GLenum (APIENTRY *glGetErrorFunc) (void);
3366  GLenum attrib = 0;
3367  GLenum error = 0;
3368 
3369  /*
3370  * Some queries in Core Profile desktop OpenGL 3+ contexts require
3371  * glGetFramebufferAttachmentParameteriv instead of glGetIntegerv. Note that
3372  * the enums we use for the former function don't exist in OpenGL ES 2, and
3373  * the function itself doesn't exist prior to OpenGL 3 and OpenGL ES 2.
3374  */
3375 #if SDL_VIDEO_OPENGL
3376  const GLubyte *(APIENTRY *glGetStringFunc) (GLenum name);
3377  void (APIENTRY *glGetFramebufferAttachmentParameterivFunc) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
3379  GLenum attachmentattrib = 0;
3380 #endif
3381 
3382  if (!value) {
3383  return SDL_InvalidParamError("value");
3384  }
3385 
3386  /* Clear value in any case */
3387  *value = 0;
3388 
3389  if (!_this) {
3390  return SDL_UninitializedVideo();
3391  }
3392 
3393  switch (attr) {
3394  case SDL_GL_RED_SIZE:
3395 #if SDL_VIDEO_OPENGL
3396  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE;
3397 #endif
3398  attrib = GL_RED_BITS;
3399  break;
3400  case SDL_GL_BLUE_SIZE:
3401 #if SDL_VIDEO_OPENGL
3402  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;
3403 #endif
3404  attrib = GL_BLUE_BITS;
3405  break;
3406  case SDL_GL_GREEN_SIZE:
3407 #if SDL_VIDEO_OPENGL
3408  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;
3409 #endif
3410  attrib = GL_GREEN_BITS;
3411  break;
3412  case SDL_GL_ALPHA_SIZE:
3413 #if SDL_VIDEO_OPENGL
3414  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;
3415 #endif
3416  attrib = GL_ALPHA_BITS;
3417  break;
3418  case SDL_GL_DOUBLEBUFFER:
3419 #if SDL_VIDEO_OPENGL
3420  attrib = GL_DOUBLEBUFFER;
3421  break;
3422 #else
3423  /* OpenGL ES 1.0 and above specifications have EGL_SINGLE_BUFFER */
3424  /* parameter which switches double buffer to single buffer. OpenGL ES */
3425  /* SDL driver must set proper value after initialization */
3427  return 0;
3428 #endif
3429  case SDL_GL_DEPTH_SIZE:
3430 #if SDL_VIDEO_OPENGL
3431  attachment = GL_DEPTH;
3432  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;
3433 #endif
3434  attrib = GL_DEPTH_BITS;
3435  break;
3436  case SDL_GL_STENCIL_SIZE:
3437 #if SDL_VIDEO_OPENGL
3439  attachmentattrib = GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;
3440 #endif
3441  attrib = GL_STENCIL_BITS;
3442  break;
3443 #if SDL_VIDEO_OPENGL
3444  case SDL_GL_ACCUM_RED_SIZE:
3445  attrib = GL_ACCUM_RED_BITS;
3446  break;
3448  attrib = GL_ACCUM_GREEN_BITS;
3449  break;
3451  attrib = GL_ACCUM_BLUE_BITS;
3452  break;
3454  attrib = GL_ACCUM_ALPHA_BITS;
3455  break;
3456  case SDL_GL_STEREO:
3457  attrib = GL_STEREO;
3458  break;
3459 #else
3460  case SDL_GL_ACCUM_RED_SIZE:
3464  case SDL_GL_STEREO:
3465  /* none of these are supported in OpenGL ES */
3466  *value = 0;
3467  return 0;
3468 #endif
3470  attrib = GL_SAMPLE_BUFFERS;
3471  break;
3473  attrib = GL_SAMPLES;
3474  break;
3476 #if SDL_VIDEO_OPENGL
3477  attrib = GL_CONTEXT_RELEASE_BEHAVIOR;
3478 #else
3480 #endif
3481  break;
3482  case SDL_GL_BUFFER_SIZE:
3483  {
3484  int rsize = 0, gsize = 0, bsize = 0, asize = 0;
3485 
3486  /* There doesn't seem to be a single flag in OpenGL for this! */
3487  if (SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &rsize) < 0) {
3488  return -1;
3489  }
3490  if (SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &gsize) < 0) {
3491  return -1;
3492  }
3493  if (SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &bsize) < 0) {
3494  return -1;
3495  }
3496  if (SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &asize) < 0) {
3497  return -1;
3498  }
3499 
3500  *value = rsize + gsize + bsize + asize;
3501  return 0;
3502  }
3504  {
3505  /* FIXME: How do we get this information? */
3506  *value = (_this->gl_config.accelerated != 0);
3507  return 0;
3508  }
3510  {
3512  return 0;
3513  }
3515  {
3517  return 0;
3518  }
3520  {
3522  return 0;
3523  }
3524  case SDL_GL_CONTEXT_EGL:
3525  /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */
3526  {
3528  *value = 1;
3529  }
3530  else {
3531  *value = 0;
3532  }
3533  return 0;
3534  }
3535  case SDL_GL_CONTEXT_FLAGS:
3536  {
3537  *value = _this->gl_config.flags;
3538  return 0;
3539  }
3541  {
3543  return 0;
3544  }
3546  {
3548  return 0;
3549  }
3551  {
3553  return 0;
3554  }
3556  {
3558  return 0;
3559  }
3560  default:
3561  return SDL_SetError("Unknown OpenGL attribute");
3562  }
3563 
3564 #if SDL_VIDEO_OPENGL
3565  glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
3566  if (!glGetStringFunc) {
3567  return -1;
3568  }
3569 
3570  if (attachmentattrib && isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {
3571  glGetFramebufferAttachmentParameterivFunc = SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameteriv");
3572 
3573  if (glGetFramebufferAttachmentParameterivFunc) {
3574  glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *) value);
3575  } else {
3576  return -1;
3577  }
3578  } else
3579 #endif
3580  {
3581  void (APIENTRY *glGetIntegervFunc) (GLenum pname, GLint * params);
3582  glGetIntegervFunc = SDL_GL_GetProcAddress("glGetIntegerv");
3583  if (glGetIntegervFunc) {
3584  glGetIntegervFunc(attrib, (GLint *) value);
3585  } else {
3586  return -1;
3587  }
3588  }
3589 
3590  glGetErrorFunc = SDL_GL_GetProcAddress("glGetError");
3591  if (!glGetErrorFunc) {
3592  return -1;
3593  }
3594 
3595  error = glGetErrorFunc();
3596  if (error != GL_NO_ERROR) {
3597  if (error == GL_INVALID_ENUM) {
3598  return SDL_SetError("OpenGL error: GL_INVALID_ENUM");
3599  } else if (error == GL_INVALID_VALUE) {
3600  return SDL_SetError("OpenGL error: GL_INVALID_VALUE");
3601  }
3602  return SDL_SetError("OpenGL error: %08X", error);
3603  }
3604  return 0;
3605 #else
3606  return SDL_Unsupported();
3607 #endif /* SDL_VIDEO_OPENGL */
3608 }
3609 
3612 {
3615 
3616  if (!(window->flags & SDL_WINDOW_OPENGL)) {
3617  SDL_SetError("The specified window isn't an OpenGL window");
3618  return NULL;
3619  }
3620 
3622 
3623  /* Creating a context is assumed to make it current in the SDL driver. */
3624  if (ctx) {
3626  _this->current_glctx = ctx;
3629  }
3630  return ctx;
3631 }
3632 
3633 int
3635 {
3636  int retval;
3637 
3638  if (window == SDL_GL_GetCurrentWindow() &&
3640  /* We're already current. */
3641  return 0;
3642  }
3643 
3644  if (!ctx) {
3645  window = NULL;
3646  } else if (window) {
3648 
3649  if (!(window->flags & SDL_WINDOW_OPENGL)) {
3650  return SDL_SetError("The specified window isn't an OpenGL window");
3651  }
3652  } else if (!_this->gl_allow_no_surface) {
3653  return SDL_SetError("Use of OpenGL without a window is not supported on this platform");
3654  }
3655 
3657  if (retval == 0) {
3659  _this->current_glctx = ctx;
3662  }
3663  return retval;
3664 }
3665 
3666 SDL_Window *
3668 {
3669  if (!_this) {
3671  return NULL;
3672  }
3674 }
3675 
3678 {
3679  if (!_this) {
3681  return NULL;
3682  }
3684 }
3685 
3687 {
3689 
3690  if (_this->GL_GetDrawableSize) {
3692  } else {
3694  }
3695 }
3696 
3697 int
3699 {
3700  if (!_this) {
3701  return SDL_UninitializedVideo();
3702  } else if (SDL_GL_GetCurrentContext() == NULL) {
3703  return SDL_SetError("No OpenGL context has been made current");
3704  } else if (_this->GL_SetSwapInterval) {
3705  return _this->GL_SetSwapInterval(_this, interval);
3706  } else {
3707  return SDL_SetError("Setting the swap interval is not supported");
3708  }
3709 }
3710 
3711 int
3713 {
3714  if (!_this) {
3715  return 0;
3716  } else if (SDL_GL_GetCurrentContext() == NULL) {
3717  return 0;
3718  } else if (_this->GL_GetSwapInterval) {
3719  return _this->GL_GetSwapInterval(_this);
3720  } else {
3721  return 0;
3722  }
3723 }
3724 
3725 void
3727 {
3729 
3730  if (!(window->flags & SDL_WINDOW_OPENGL)) {
3731  SDL_SetError("The specified window isn't an OpenGL window");
3732  return;
3733  }
3734 
3735  if (SDL_GL_GetCurrentWindow() != window) {
3736  SDL_SetError("The specified window has not been made current");
3737  return;
3738  }
3739 
3741 }
3742 
3743 void
3745 {
3746  if (!_this || !context) {
3747  return;
3748  }
3749 
3750  if (SDL_GL_GetCurrentContext() == context) {
3752  }
3753 
3755 }
3756 
3757 #if 0 /* FIXME */
3758 /*
3759  * Utility function used by SDL_WM_SetIcon(); flags & 1 for color key, flags
3760  * & 2 for alpha channel.
3761  */
3762 static void
3763 CreateMaskFromColorKeyOrAlpha(SDL_Surface * icon, Uint8 * mask, int flags)
3764 {
3765  int x, y;
3766  Uint32 colorkey;
3767 #define SET_MASKBIT(icon, x, y, mask) \
3768  mask[(y*((icon->w+7)/8))+(x/8)] &= ~(0x01<<(7-(x%8)))
3769 
3770  colorkey = icon->format->colorkey;
3771  switch (icon->format->BytesPerPixel) {
3772  case 1:
3773  {
3774  Uint8 *pixels;
3775  for (y = 0; y < icon->h; ++y) {
3776  pixels = (Uint8 *) icon->pixels + y * icon->pitch;
3777  for (x = 0; x < icon->w; ++x) {
3778  if (*pixels++ == colorkey) {
3779  SET_MASKBIT(icon, x, y, mask);
3780  }
3781  }
3782  }
3783  }
3784  break;
3785 
3786  case 2:
3787  {
3788  Uint16 *pixels;
3789  for (y = 0; y < icon->h; ++y) {
3790  pixels = (Uint16 *) icon->pixels + y * icon->pitch / 2;
3791  for (x = 0; x < icon->w; ++x) {
3792  if ((flags & 1) && *pixels == colorkey) {
3793  SET_MASKBIT(icon, x, y, mask);
3794  } else if ((flags & 2)
3795  && (*pixels & icon->format->Amask) == 0) {
3796  SET_MASKBIT(icon, x, y, mask);
3797  }
3798  pixels++;
3799  }
3800  }
3801  }
3802  break;
3803 
3804  case 4:
3805  {
3806  Uint32 *pixels;
3807  for (y = 0; y < icon->h; ++y) {
3808  pixels = (Uint32 *) icon->pixels + y * icon->pitch / 4;
3809  for (x = 0; x < icon->w; ++x) {
3810  if ((flags & 1) && *pixels == colorkey) {
3811  SET_MASKBIT(icon, x, y, mask);
3812  } else if ((flags & 2)
3813  && (*pixels & icon->format->Amask) == 0) {
3814  SET_MASKBIT(icon, x, y, mask);
3815  }
3816  pixels++;
3817  }
3818  }
3819  }
3820  break;
3821  }
3822 }
3823 
3824 /*
3825  * Sets the window manager icon for the display window.
3826  */
3827 void
3828 SDL_WM_SetIcon(SDL_Surface * icon, Uint8 * mask)
3829 {
3830  if (icon && _this->SetIcon) {
3831  /* Generate a mask if necessary, and create the icon! */
3832  if (mask == NULL) {
3833  int mask_len = icon->h * (icon->w + 7) / 8;
3834  int flags = 0;
3835  mask = (Uint8 *) SDL_malloc(mask_len);
3836  if (mask == NULL) {
3837  return;
3838  }
3839  SDL_memset(mask, ~0, mask_len);
3840  if (icon->flags & SDL_SRCCOLORKEY)
3841  flags |= 1;
3842  if (icon->flags & SDL_SRCALPHA)
3843  flags |= 2;
3844  if (flags) {
3845  CreateMaskFromColorKeyOrAlpha(icon, mask, flags);
3846  }
3847  _this->SetIcon(_this, icon, mask);
3848  SDL_free(mask);
3849  } else {
3850  _this->SetIcon(_this, icon, mask);
3851  }
3852  }
3853 }
3854 #endif
3855 
3856 SDL_bool
3858 {
3860 
3861  if (!info) {
3862  SDL_InvalidParamError("info");
3863  return SDL_FALSE;
3864  }
3865  info->subsystem = SDL_SYSWM_UNKNOWN;
3866 
3867  if (!_this->GetWindowWMInfo) {
3868  SDL_Unsupported();
3869  return SDL_FALSE;
3870  }
3871  return (_this->GetWindowWMInfo(_this, window, info));
3872 }
3873 
3874 void
3876 {
3877  SDL_Window *window;
3878 
3879  /* First, enable text events */
3882 
3883  /* Then show the on-screen keyboard, if any */
3885  if (window && _this && _this->ShowScreenKeyboard) {
3887  }
3888 
3889  /* Finally start the text input system */
3890  if (_this && _this->StartTextInput) {
3892  }
3893 }
3894 
3895 SDL_bool
3897 {
3899 }
3900 
3901 void
3903 {
3904  SDL_Window *window;
3905 
3906  /* Stop the text input system */
3907  if (_this && _this->StopTextInput) {
3909  }
3910 
3911  /* Hide the on-screen keyboard, if any */
3913  if (window && _this && _this->HideScreenKeyboard) {
3915  }
3916 
3917  /* Finally disable text events */
3920 }
3921 
3922 void
3924 {
3925  if (_this && _this->SetTextInputRect) {
3927  }
3928 }
3929 
3930 SDL_bool
3932 {
3935  }
3936  return SDL_FALSE;
3937 }
3938 
3939 SDL_bool
3941 {
3942  if (window && _this && _this->IsScreenKeyboardShown) {
3944  }
3945  return SDL_FALSE;
3946 }
3947 
3948 #if SDL_VIDEO_DRIVER_ANDROID
3950 #endif
3951 #if SDL_VIDEO_DRIVER_WINDOWS
3953 #endif
3954 #if SDL_VIDEO_DRIVER_WINRT
3955 #include "winrt/SDL_winrtmessagebox.h"
3956 #endif
3957 #if SDL_VIDEO_DRIVER_COCOA
3958 #include "cocoa/SDL_cocoamessagebox.h"
3959 #endif
3960 #if SDL_VIDEO_DRIVER_UIKIT
3961 #include "uikit/SDL_uikitmessagebox.h"
3962 #endif
3963 #if SDL_VIDEO_DRIVER_X11
3964 #include "x11/SDL_x11messagebox.h"
3965 #endif
3966 #if SDL_VIDEO_DRIVER_HAIKU
3967 #include "haiku/SDL_bmessagebox.h"
3968 #endif
3969 #if SDL_VIDEO_DRIVER_OS2
3970 #include "os2/SDL_os2messagebox.h"
3971 #endif
3972 
3973 #if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT || SDL_VIDEO_DRIVER_COCOA || SDL_VIDEO_DRIVER_UIKIT || SDL_VIDEO_DRIVER_X11 || SDL_VIDEO_DRIVER_HAIKU || SDL_VIDEO_DRIVER_OS2
3975 {
3976  SDL_SysWMinfo info;
3977  SDL_Window *window = messageboxdata->window;
3978 
3979  if (!window) {
3980  return SDL_TRUE;
3981  }
3982 
3983  SDL_VERSION(&info.version);
3984  if (!SDL_GetWindowWMInfo(window, &info)) {
3985  return SDL_TRUE;
3986  } else {
3987  return (info.subsystem == drivertype);
3988  }
3989 }
3990 #endif
3991 
3992 int
3993 SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
3994 {
3995  int dummybutton;
3996  int retval = -1;
3997  SDL_bool relative_mode;
3998  int show_cursor_prev;
3999  SDL_bool mouse_captured;
4000  SDL_Window *current_window;
4001  SDL_MessageBoxData mbdata;
4002 
4003  if (!messageboxdata) {
4004  return SDL_InvalidParamError("messageboxdata");
4005  } else if (messageboxdata->numbuttons < 0) {
4006  return SDL_SetError("Invalid number of buttons");
4007  }
4008 
4009  current_window = SDL_GetKeyboardFocus();
4010  mouse_captured = current_window && ((SDL_GetWindowFlags(current_window) & SDL_WINDOW_MOUSE_CAPTURE) != 0);
4011  relative_mode = SDL_GetRelativeMouseMode();
4014  show_cursor_prev = SDL_ShowCursor(1);
4016 
4017  if (!buttonid) {
4018  buttonid = &dummybutton;
4019  }
4020 
4021  SDL_memcpy(&mbdata, messageboxdata, sizeof(*messageboxdata));
4022  if (!mbdata.title) mbdata.title = "";
4023  if (!mbdata.message) mbdata.message = "";
4024  messageboxdata = &mbdata;
4025 
4026  if (_this && _this->ShowMessageBox) {
4027  retval = _this->ShowMessageBox(_this, messageboxdata, buttonid);
4028  }
4029 
4030  /* It's completely fine to call this function before video is initialized */
4031 #if SDL_VIDEO_DRIVER_ANDROID
4032  if (retval == -1 &&
4033  Android_ShowMessageBox(messageboxdata, buttonid) == 0) {
4034  retval = 0;
4035  }
4036 #endif
4037 #if SDL_VIDEO_DRIVER_WINDOWS
4038  if (retval == -1 &&
4040  WIN_ShowMessageBox(messageboxdata, buttonid) == 0) {
4041  retval = 0;
4042  }
4043 #endif
4044 #if SDL_VIDEO_DRIVER_WINRT
4045  if (retval == -1 &&
4046  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_WINRT) &&
4047  WINRT_ShowMessageBox(messageboxdata, buttonid) == 0) {
4048  retval = 0;
4049  }
4050 #endif
4051 #if SDL_VIDEO_DRIVER_COCOA
4052  if (retval == -1 &&
4053  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_COCOA) &&
4054  Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0) {
4055  retval = 0;
4056  }
4057 #endif
4058 #if SDL_VIDEO_DRIVER_UIKIT
4059  if (retval == -1 &&
4060  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_UIKIT) &&
4061  UIKit_ShowMessageBox(messageboxdata, buttonid) == 0) {
4062  retval = 0;
4063  }
4064 #endif
4065 #if SDL_VIDEO_DRIVER_X11
4066  if (retval == -1 &&
4067  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_X11) &&
4068  X11_ShowMessageBox(messageboxdata, buttonid) == 0) {
4069  retval = 0;
4070  }
4071 #endif
4072 #if SDL_VIDEO_DRIVER_HAIKU
4073  if (retval == -1 &&
4074  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_HAIKU) &&
4075  HAIKU_ShowMessageBox(messageboxdata, buttonid) == 0) {
4076  retval = 0;
4077  }
4078 #endif
4079 #if SDL_VIDEO_DRIVER_OS2
4080  if (retval == -1 &&
4081  SDL_MessageboxValidForDriver(messageboxdata, SDL_SYSWM_OS2) &&
4082  OS2_ShowMessageBox(messageboxdata, buttonid) == 0) {
4083  retval = 0;
4084  }
4085 #endif
4086  if (retval == -1) {
4087  SDL_SetError("No message system available");
4088  }
4089 
4090  if (current_window) {
4091  SDL_RaiseWindow(current_window);
4092  if (mouse_captured) {
4094  }
4095  }
4096 
4097  SDL_ShowCursor(show_cursor_prev);
4098  SDL_SetRelativeMouseMode(relative_mode);
4099 
4100  return retval;
4101 }
4102 
4103 int
4104 SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window)
4105 {
4106 #ifdef __EMSCRIPTEN__
4107  /* !!! FIXME: propose a browser API for this, get this #ifdef out of here? */
4108  /* Web browsers don't (currently) have an API for a custom message box
4109  that can block, but for the most common case (SDL_ShowSimpleMessageBox),
4110  we can use the standard Javascript alert() function. */
4111  if (!title) title = "";
4112  if (!message) message = "";
4113  EM_ASM_({
4114  alert(UTF8ToString($0) + "\n\n" + UTF8ToString($1));
4115  }, title, message);
4116  return 0;
4117 #else
4120 
4121  SDL_zero(data);
4122  data.flags = flags;
4123  data.title = title;
4124  data.message = message;
4125  data.numbuttons = 1;
4126  data.buttons = &button;
4127  data.window = window;
4128 
4129  SDL_zero(button);
4132  button.text = "OK";
4133 
4134  return SDL_ShowMessageBox(&data, NULL);
4135 #endif
4136 }
4137 
4138 SDL_bool
4140 {
4142 }
4143 
4144 int
4146 {
4148 
4149  if (!_this->SetWindowHitTest) {
4150  return SDL_Unsupported();
4151  } else if (_this->SetWindowHitTest(window, callback != NULL) == -1) {
4152  return -1;
4153  }
4154 
4155  window->hit_test = callback;
4156  window->hit_test_data = userdata;
4157 
4158  return 0;
4159 }
4160 
4161 float
4162 SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
4163 {
4164  float den2 = hinches * hinches + vinches * vinches;
4165  if (den2 <= 0.0f) {
4166  return 0.0f;
4167  }
4168 
4169  return (float)(SDL_sqrt((double)hpix * (double)hpix + (double)vpix * (double)vpix) /
4170  SDL_sqrt((double)den2));
4171 }
4172 
4173 /*
4174  * Functions used by iOS application delegates
4175  */
4177 {
4179 }
4180 
4182 {
4184 }
4185 
4187 {
4188  if (_this) {
4189  SDL_Window *window;
4190  for (window = _this->windows; window != NULL; window = window->next) {
4193  }
4194  }
4196 }
4197 
4199 {
4201 }
4202 
4204 {
4206 }
4207 
4209 {
4211 
4212  if (_this) {
4213  SDL_Window *window;
4214  for (window = _this->windows; window != NULL; window = window->next) {
4217  }
4218  }
4219 }
4220 
4221 #define NOT_A_VULKAN_WINDOW "The specified window isn't a Vulkan window"
4222 
4224 {
4225  int retval;
4226  if (!_this) {
4228  return -1;
4229  }
4232  return SDL_SetError("Vulkan loader library already loaded");
4233  }
4234  retval = 0;
4235  } else {
4236  if (!_this->Vulkan_LoadLibrary) {
4237  return SDL_SetError("Vulkan support is either not configured in SDL "
4238  "or not available in current SDL video driver "
4239  "(%s) or platform", _this->name);
4240  }
4242  }
4243  if (retval == 0) {
4245  }
4246  return retval;
4247 }
4248 
4250 {
4251  if (!_this) {
4253  return NULL;
4254  }
4256  SDL_SetError("No Vulkan loader has been loaded");
4257  return NULL;
4258  }
4260 }
4261 
4263 {
4264  if (!_this) {
4266  return;
4267  }
4268  if (_this->vulkan_config.loader_loaded > 0) {
4269  if (--_this->vulkan_config.loader_loaded > 0) {
4270  return;
4271  }
4272  if (_this->Vulkan_UnloadLibrary) {
4274  }
4275  }
4276 }
4277 
4279 {
4280  if (window) {
4282 
4283  if (!(window->flags & SDL_WINDOW_VULKAN))
4284  {
4286  return SDL_FALSE;
4287  }
4288  }
4289 
4290  if (!count) {
4291  SDL_InvalidParamError("count");
4292  return SDL_FALSE;
4293  }
4294 
4296 }
4297 
4299  VkInstance instance,
4300  VkSurfaceKHR *surface)
4301 {
4303 
4304  if (!(window->flags & SDL_WINDOW_VULKAN)) {
4306  return SDL_FALSE;
4307  }
4308 
4309  if (!instance) {
4310  SDL_InvalidParamError("instance");
4311  return SDL_FALSE;
4312  }
4313 
4314  if (!surface) {
4315  SDL_InvalidParamError("surface");
4316  return SDL_FALSE;
4317  }
4318 
4319  return _this->Vulkan_CreateSurface(_this, window, instance, surface);
4320 }
4321 
4323 {
4325 
4328  } else {
4330  }
4331 }
4332 
4335 {
4337 
4338  if (!(window->flags & SDL_WINDOW_METAL)) {
4339  SDL_SetError("The specified window isn't a Metal window");
4340  return NULL;
4341  }
4342 
4343  if (_this->Metal_CreateView) {
4344  return _this->Metal_CreateView(_this, window);
4345  } else {
4346  SDL_SetError("Metal is not supported.");
4347  return NULL;
4348  }
4349 }
4350 
4351 void
4353 {
4354  if (_this && view && _this->Metal_DestroyView) {
4355  _this->Metal_DestroyView(_this, view);
4356  }
4357 }
4358 
4359 void *
4361 {
4362  if (_this && _this->Metal_GetLayer) {
4363  if (view) {
4364  return _this->Metal_GetLayer(_this, view);
4365  } else {
4366  SDL_InvalidParamError("view");
4367  return NULL;
4368  }
4369  } else {
4370  SDL_SetError("Metal is not supported.");
4371  return NULL;
4372  }
4373 }
4374 
4376 {
4378 
4381  } else {
4383  }
4384 }
4385 
4386 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_INIT_EVENTS
Definition: SDL.h:86
#define SDL_INIT_VIDEO
Definition: SDL.h:82
SDL_bool Android_JNI_ShouldMinimizeOnFocusLoss(void)
#define SDL_assert(condition)
Definition: SDL_assert.h:171
int SDL_SendDisplayEvent(SDL_VideoDisplay *display, Uint8 displayevent, int data1)
#define SDL_sqrt
#define SDL_SetError
#define SDL_memset
#define SDL_TLSCreate
#define SDL_strchr
#define SDL_RenderPresent
#define SDL_InitSubSystem
#define SDL_TLSSet
#define SDL_DestroyRenderer
#define SDL_GetMouseState
#define SDL_DestroyTexture
#define SDL_ShowCursor
#define SDL_CalculateGammaRamp
#define SDL_WarpMouseInWindow
#define SDL_qsort
#define SDL_SetRelativeMouseMode
#define SDL_CreateTexture
#define SDL_CaptureMouse
#define SDL_GetKeyboardFocus
#define SDL_GetRenderDriverInfo
#define SDL_TLSGet
#define SDL_EnclosePoints
#define SDL_CreateRenderer
#define SDL_getenv
#define SDL_malloc
#define SDL_strlen
#define SDL_realloc
#define SDL_strcasecmp
#define SDL_EventState
#define SDL_UpdateTexture
#define SDL_ConvertSurfaceFormat
#define SDL_PixelFormatEnumToMasks
#define SDL_free
#define SDL_strdup
#define SDL_strcmp
#define SDL_GetNumRenderDrivers
#define SDL_memcmp
#define SDL_GetRendererInfo
#define SDL_CreateRGBSurfaceFrom
#define SDL_strstr
#define SDL_GetMouseFocus
#define SDL_GetHintBoolean
#define SDL_RenderCopy
#define SDL_sscanf
#define SDL_memcpy
#define SDL_FreeSurface
#define SDL_Init
#define SDL_atoi
#define SDL_QuitSubSystem
#define SDL_memmove
#define SDL_calloc
#define SDL_GetHint
#define SDL_GetRelativeMouseMode
#define SDL_strncasecmp
#define SDL_itoa
#define SDL_RenderSetViewport
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
#define SDL_OutOfMemory()
Definition: SDL_error.h:88
#define SDL_Unsupported()
Definition: SDL_error.h:89
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:90
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:1035
@ SDL_TEXTEDITING
Definition: SDL_events.h:100
@ SDL_DROPTEXT
Definition: SDL_events.h:148
@ SDL_APP_LOWMEMORY
Definition: SDL_events.h:67
@ SDL_APP_WILLENTERFOREGROUND
Definition: SDL_events.h:79
@ SDL_TEXTINPUT
Definition: SDL_events.h:101
@ SDL_APP_DIDENTERFOREGROUND
Definition: SDL_events.h:83
@ SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
@ SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
@ SDL_APP_TERMINATING
Definition: SDL_events.h:63
@ SDL_DROPFILE
Definition: SDL_events.h:147
#define SDL_GetEventState(type)
Definition: SDL_events.h:808
#define SDL_DISABLE
Definition: SDL_events.h:794
#define SDL_ENABLE
Definition: SDL_events.h:795
const GLubyte GLuint red
Definition: SDL_glfuncs.h:80
#define SDL_HINT_DISPLAY_USABLE_BOUNDS
Override for SDL_GetDisplayUsableBounds()
Definition: SDL_hints.h:1430
#define SDL_HINT_RENDER_DRIVER
A variable specifying which render driver to use.
Definition: SDL_hints.h:85
#define SDL_HINT_VIDEO_EXTERNAL_CONTEXT
A variable controlling whether the graphics context is externally managed.
Definition: SDL_hints.h:180
#define SDL_HINT_FRAMEBUFFER_ACCELERATION
A variable controlling how 3D acceleration is used to accelerate the SDL screen surface.
Definition: SDL_hints.h:65
#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER
A variable controlling whether the screensaver is enabled.
Definition: SDL_hints.h:165
#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS
Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to false.
Definition: SDL_hints.h:377
#define SDL_HINT_ALLOW_TOPMOST
If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it....
Definition: SDL_hints.h:739
#define SDL_HINT_VIDEO_HIGHDPI_DISABLED
If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS)
Definition: SDL_hints.h:839
int SDL_KeyboardInit(void)
Definition: SDL_keyboard.c:566
void SDL_ResetKeyboard(void)
Definition: SDL_keyboard.c:576
void SDL_SetKeyboardFocus(SDL_Window *window)
Definition: SDL_keyboard.c:634
void SDL_KeyboardQuit(void)
Definition: SDL_keyboard.c:891
@ SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT
@ SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT
void * SDL_MetalView
A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS).
Definition: SDL_metal.h:44
SDL_Mouse * SDL_GetMouse(void)
Definition: SDL_mouse.c:175
void SDL_SetMouseFocus(SDL_Window *window)
Definition: SDL_mouse.c:208
int SDL_MouseInit(void)
Definition: SDL_mouse.c:132
void SDL_MouseQuit(void)
Definition: SDL_mouse.c:659
#define GL_DOUBLEBUFFER
Definition: SDL_opengl.h:521
unsigned char GLubyte
Definition: SDL_opengl.h:183
#define GL_INVALID_VALUE
Definition: SDL_opengl.h:721
#define GL_STENCIL_BITS
Definition: SDL_opengl.h:474
#define GL_SAMPLES
Definition: SDL_opengl.h:1840
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
#define GL_VERSION
Definition: SDL_opengl.h:715
#define GL_GREEN_BITS
Definition: SDL_opengl.h:514
#define APIENTRY
Definition: SDL_opengl.h:139
#define GL_BACK_LEFT
Definition: SDL_opengl.h:499
unsigned int GLenum
Definition: SDL_opengl.h:176
#define GL_STENCIL
Definition: SDL_opengl.h:526
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
unsigned int GLuint
Definition: SDL_opengl.h:185
#define GL_ACCUM_ALPHA_BITS
Definition: SDL_opengl.h:383
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
#define GL_DEPTH_BITS
Definition: SDL_opengl.h:328
#define GL_SAMPLE_BUFFERS
Definition: SDL_opengl.h:1839
#define GL_NO_ERROR
Definition: SDL_opengl.h:719
#define GL_BLUE_BITS
Definition: SDL_opengl.h:515
#define GL_DEPTH
Definition: SDL_opengl.h:525
#define GL_EXTENSIONS
Definition: SDL_opengl.h:716
#define GL_ALPHA_BITS
Definition: SDL_opengl.h:512
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLuint start
Definition: SDL_opengl.h:1571
int GLint
Definition: SDL_opengl.h:182
#define GL_ACCUM_GREEN_BITS
Definition: SDL_opengl.h:381
#define GL_ACCUM_BLUE_BITS
Definition: SDL_opengl.h:382
#define GL_STEREO
Definition: SDL_opengl.h:522
#define GL_VENDOR
Definition: SDL_opengl.h:713
#define GL_INVALID_ENUM
Definition: SDL_opengl.h:720
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
#define GL_RED_BITS
Definition: SDL_opengl.h:513
#define GL_ACCUM_RED_BITS
Definition: SDL_opengl.h:380
GLboolean GLboolean GLboolean b
#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
GLbyte GLbyte blue
GLenum func
GLdouble GLdouble GLdouble GLdouble top
GLenum mode
GLenum src
GLuint GLuint * names
const GLfloat * params
#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
GLuint index
#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
GLenum pname
GLint left
GLboolean GLboolean GLboolean GLboolean a
GLuint GLsizei const GLchar * message
GLuint const GLchar * name
#define GL_FRAMEBUFFER
GLbitfield flags
GLboolean enable
GLsizei const GLchar *const * path
GLint GLint bottom
GLbyte green
GLsizei const GLfloat * value
#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
GLenum attachment
GLenum GLint GLuint mask
#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
#define GL_CONTEXT_RELEASE_BEHAVIOR
GLdouble GLdouble right
GLenum target
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
#define SDL_BITSPERPIXEL(X)
Definition: SDL_pixels.h:127
#define SDL_ISPIXELFORMAT_ALPHA(format)
Definition: SDL_pixels.h:154
#define SDL_PIXELLAYOUT(X)
Definition: SDL_pixels.h:126
@ SDL_PIXELFORMAT_RGB888
Definition: SDL_pixels.h:246
@ SDL_PIXELFORMAT_ARGB8888
Definition: SDL_pixels.h:257
@ SDL_PIXELFORMAT_UNKNOWN
Definition: SDL_pixels.h:173
#define SDL_PIXELTYPE(X)
Definition: SDL_pixels.h:124
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
SDL_bool SDL_GetSpanEnclosingRect(int width, int height, int numrects, const SDL_Rect *rects, SDL_Rect *span)
Definition: SDL_rect.c:468
@ SDL_TEXTUREACCESS_STREAMING
Definition: SDL_render.h:104
uint16_t Uint16
Definition: SDL_stdinc.h:197
#define SDL_zero(x)
Definition: SDL_stdinc.h:426
SDL_bool
Definition: SDL_stdinc.h:168
@ SDL_TRUE
Definition: SDL_stdinc.h:170
@ SDL_FALSE
Definition: SDL_stdinc.h:169
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:121
uint8_t Uint8
Definition: SDL_stdinc.h:185
#define SDL_min(x, y)
Definition: SDL_stdinc.h:412
uint32_t Uint32
Definition: SDL_stdinc.h:209
#define SDL_max(x, y)
Definition: SDL_stdinc.h:413
#define SDL_DONTFREE
Definition: SDL_surface.h:55
#define FULLSCREEN_VISIBLE(W)
Definition: SDL_sysvideo.h:117
VideoBootStrap UIKIT_bootstrap
VideoBootStrap OS2DIVE_bootstrap
VideoBootStrap DUMMY_bootstrap
VideoBootStrap DirectFB_bootstrap
VideoBootStrap Android_bootstrap
VideoBootStrap HAIKU_bootstrap
VideoBootStrap Wayland_bootstrap
VideoBootStrap PND_bootstrap
VideoBootStrap VIVANTE_bootstrap
VideoBootStrap RPI_bootstrap
VideoBootStrap X11_bootstrap
VideoBootStrap Emscripten_bootstrap
VideoBootStrap NACL_bootstrap
VideoBootStrap COCOA_bootstrap
VideoBootStrap OFFSCREEN_bootstrap
VideoBootStrap WINRT_bootstrap
VideoBootStrap WINDOWS_bootstrap
VideoBootStrap KMSDRM_LEGACY_bootstrap
VideoBootStrap PSP_bootstrap
VideoBootStrap OS2VMAN_bootstrap
VideoBootStrap KMSDRM_bootstrap
SDL_SYSWM_TYPE
Definition: SDL_syswm.h:128
@ SDL_SYSWM_X11
Definition: SDL_syswm.h:131
@ SDL_SYSWM_UNKNOWN
Definition: SDL_syswm.h:129
@ SDL_SYSWM_OS2
Definition: SDL_syswm.h:140
@ SDL_SYSWM_HAIKU
Definition: SDL_syswm.h:141
@ SDL_SYSWM_WINDOWS
Definition: SDL_syswm.h:130
@ SDL_SYSWM_UIKIT
Definition: SDL_syswm.h:134
@ SDL_SYSWM_COCOA
Definition: SDL_syswm.h:133
@ SDL_SYSWM_WINRT
Definition: SDL_syswm.h:137
void SDL_TicksInit(void)
void SDL_TouchQuit(void)
Definition: SDL_touch.c:464
int SDL_TouchInit(void)
Definition: SDL_touch.c:45
#define SDL_VERSION(x)
Macro to determine SDL version program was compiled against.
Definition: SDL_version.h:79
void SDL_HideWindow(SDL_Window *window)
Hide a window.
Definition: SDL_video.c:2279
void * SDL_Vulkan_GetVkGetInstanceProcAddr(void)
Get the address of the vkGetInstanceProcAddr function.
Definition: SDL_video.c:4249
void SDL_Vulkan_GetDrawableSize(SDL_Window *window, int *w, int *h)
Get the size of a window's underlying drawable in pixels (for use with setting viewport,...
Definition: SDL_video.c:4322
SDL_bool SDL_HasScreenKeyboardSupport(void)
Returns whether the platform has some screen keyboard support.
Definition: SDL_video.c:3931
#define CHECK_DISPLAY_INDEX(displayIndex, retval)
Definition: SDL_video.c:139
int SDL_SetWindowModalFor(SDL_Window *modal_window, SDL_Window *parent_window)
Sets the window as a modal for another window (TODO: reconsider this function and/or its name)
Definition: SDL_video.c:2531
int SDL_UpdateWindowSurface(SDL_Window *window)
Copy the window surface to the screen.
Definition: SDL_video.c:2444
SDL_DisplayMode * SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode *mode, SDL_DisplayMode *closest)
Get the closest match to the requested display mode.
Definition: SDL_video.c:1000
void SDL_GL_GetDrawableSize(SDL_Window *window, int *w, int *h)
Get the size of a window's underlying drawable in pixels (for use with glViewport).
Definition: SDL_video.c:3686
static int SDL_SetDisplayModeForDisplay(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
Definition: SDL_video.c:1013
void SDL_SetWindowPosition(SDL_Window *window, int x, int y)
Set the position of a window.
Definition: SDL_video.c:1975
SDL_bool SDL_IsScreenKeyboardShown(SDL_Window *window)
Returns whether the screen keyboard is shown for given window.
Definition: SDL_video.c:3940
const char * SDL_GetWindowTitle(SDL_Window *window)
Get the title of a window, in UTF-8 format.
Definition: SDL_video.c:1877
static SDL_bool ShouldUseTextureFramebuffer()
Definition: SDL_video.c:174
#define NOT_A_VULKAN_WINDOW
Definition: SDL_video.c:4221
static void SDL_DestroyWindowTexture(SDL_VideoDevice *unused, SDL_Window *window)
Definition: SDL_video.c:404
Uint32 SDL_GetWindowFlags(SDL_Window *window)
Get the window flags.
Definition: SDL_video.c:1852
int SDL_GetWindowDisplayIndex(SDL_Window *window)
Get the display index associated with a window.
Definition: SDL_video.c:1070
void SDL_Metal_DestroyView(SDL_MetalView view)
Destroy an existing SDL_MetalView object.
Definition: SDL_video.c:4352
SDL_bool SDL_GL_ExtensionSupported(const char *extension)
Return true if an OpenGL extension is supported for the current context.
Definition: SDL_video.c:3072
int SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode *mode)
Fill in information about the current display mode.
Definition: SDL_video.c:879
int SDL_GL_SetSwapInterval(int interval)
Set the swap interval for the current OpenGL context.
Definition: SDL_video.c:3698
#define SDL_WINDOWTEXTUREDATA
Definition: SDL_video.c:163
SDL_bool SDL_ShouldAllowTopmost(void)
Definition: SDL_video.c:4139
void SDL_OnApplicationWillEnterForeground(void)
Definition: SDL_video.c:4203
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2747
SDL_bool SDL_GetWindowWMInfo(SDL_Window *window, struct SDL_SysWMinfo *info)
This function allows access to driver-dependent window information.
Definition: SDL_video.c:3857
void SDL_GetWindowMaximumSize(SDL_Window *window, int *max_w, int *max_h)
Get the maximum size of a window's client area.
Definition: SDL_video.c:2252
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2717
static int SDL_CreateWindowTexture(SDL_VideoDevice *unused, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
Definition: SDL_video.c:264
SDL_bool SDL_HasWindows(void)
Definition: SDL_video.c:1822
void SDL_GL_SwapWindow(SDL_Window *window)
Swap the OpenGL buffers for a window, if double-buffering is supported.
Definition: SDL_video.c:3726
Uint32 SDL_GetWindowPixelFormat(SDL_Window *window)
Get the pixel format associated with the window.
Definition: SDL_video.c:1198
int SDL_VideoInit(const char *driver_name)
Initialize the video subsystem, optionally specifying a video driver.
Definition: SDL_video.c:469
SDL_Window * SDL_GL_GetCurrentWindow(void)
Get the currently active OpenGL window.
Definition: SDL_video.c:3667
#define FULLSCREEN_MASK
Definition: SDL_video.c:152
SDL_DisplayOrientation SDL_GetDisplayOrientation(int displayIndex)
Get the orientation of a display.
Definition: SDL_video.c:781
void SDL_SetWindowGrab(SDL_Window *window, SDL_bool grabbed)
Set a window's input grab mode.
Definition: SDL_video.c:2667
void SDL_EnableScreenSaver()
Allow the screen to be blanked by a screensaver.
Definition: SDL_video.c:2916
int SDL_GetDisplayMode(int displayIndex, int index, SDL_DisplayMode *mode)
Fill in information about a specific display mode.
Definition: SDL_video.c:847
static SDL_bool CanMinimizeWindow(SDL_Window *window)
Definition: SDL_video.c:2327
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2796
void * SDL_GetDisplayDriverData(int displayIndex)
Definition: SDL_video.c:680
#define CREATE_FLAGS
Definition: SDL_video.c:1388
static SDL_INLINE void PrepareDragAndDropSupport(SDL_Window *window)
Definition: SDL_video.c:1403
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2704
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2698
static SDL_bool ShouldMinimizeOnFocusLoss(SDL_Window *window)
Definition: SDL_video.c:2769
int SDL_GetWindowBordersSize(SDL_Window *window, int *top, int *left, int *bottom, int *right)
Get the size of a window's borders (decorations) around the client area.
Definition: SDL_video.c:2157
int SDL_GL_GetSwapInterval(void)
Get the swap interval for the current OpenGL context.
Definition: SDL_video.c:3712
int SDL_GetWindowDisplayMode(SDL_Window *window, SDL_DisplayMode *mode)
Fill in information about the display mode used when a fullscreen window is visible.
Definition: SDL_video.c:1161
static int SDL_UpdateFullscreenMode(SDL_Window *window, SDL_bool fullscreen)
Definition: SDL_video.c:1224
int SDL_UpdateWindowSurfaceRects(SDL_Window *window, const SDL_Rect *rects, int numrects)
Copy a number of rectangles on the window surface to the screen.
Definition: SDL_video.c:2458
static SDL_VideoDevice * _this
Definition: SDL_video.c:126
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2710
int SDL_GetDisplayDPI(int displayIndex, float *ddpi, float *hdpi, float *vdpi)
Get the dots/pixels-per-inch for a display.
Definition: SDL_video.c:761
void SDL_SetWindowTitle(SDL_Window *window, const char *title)
Set the title of a window, in UTF-8 format.
Definition: SDL_video.c:1860
void SDL_RestoreWindow(SDL_Window *window)
Restore the size and position of a minimized or maximized window.
Definition: SDL_video.c:2356
SDL_GLContext SDL_GL_CreateContext(SDL_Window *window)
Create an OpenGL context for use with an OpenGL window, and make it current.
Definition: SDL_video.c:3611
void SDL_DisableScreenSaver()
Prevent the screen from being blanked by a screensaver.
Definition: SDL_video.c:2931
int SDL_SetWindowFullscreen(SDL_Window *window, Uint32 flags)
Set a window's fullscreen state.
Definition: SDL_video.c:2370
static int cmpmodes(const void *A, const void *B)
Definition: SDL_video.c:424
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2739
void SDL_SetWindowMaximumSize(SDL_Window *window, int max_w, int max_h)
Set the maximum size of a window's client area.
Definition: SDL_video.c:2222
SDL_MetalView SDL_Metal_CreateView(SDL_Window *window)
Create a CAMetalLayer-backed NSView/UIView and attach it to the specified window.
Definition: SDL_video.c:4334
static int SDL_GetNumDisplayModesForDisplay(SDL_VideoDisplay *display)
Definition: SDL_video.c:828
SDL_Window * SDL_CreateWindowFrom(const void *data)
Create an SDL window from an existing native window.
Definition: SDL_video.c:1632
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2723
void SDL_Metal_GetDrawableSize(SDL_Window *window, int *w, int *h)
Get the size of a window's underlying drawable in pixels (for use with setting viewport,...
Definition: SDL_video.c:4375
static void SDL_FinishWindowCreation(SDL_Window *window, Uint32 flags)
Definition: SDL_video.c:1424
void SDL_SetWindowBordered(SDL_Window *window, SDL_bool bordered)
Set the border state of a window.
Definition: SDL_video.c:2061
int SDL_GetDisplayBounds(int displayIndex, SDL_Rect *rect)
Get the desktop area represented by a display, with the primary display located at 0,...
Definition: SDL_video.c:702
SDL_bool SDL_GetWindowGrab(SDL_Window *window)
Get a window's input grab mode.
Definition: SDL_video.c:2683
void SDL_StartTextInput(void)
Start accepting Unicode text input events. This function will show the on-screen keyboard if supporte...
Definition: SDL_video.c:3875
int SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
Create a modal message box.
Definition: SDL_video.c:3993
SDL_Window * SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
Create a window with the specified position, dimensions, and flags.
Definition: SDL_video.c:1446
int SDL_GetNumVideoDisplays(void)
Returns the number of available video displays.
Definition: SDL_video.c:655
int SDL_SetWindowInputFocus(SDL_Window *window)
Explicitly sets input focus to the window.
Definition: SDL_video.c:2544
SDL_bool SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, unsigned *count, const char **names)
Definition: SDL_video.c:4278
#define CHECK_WINDOW_MAGIC(window, retval)
Definition: SDL_video.c:128
static int SDL_UninitializedVideo()
Definition: SDL_video.c:445
SDL_Surface * SDL_GetWindowSurface(SDL_Window *window)
Get the SDL surface associated with the window.
Definition: SDL_video.c:2424
int SDL_Vulkan_LoadLibrary(const char *path)
Dynamically load a Vulkan loader library.
Definition: SDL_video.c:4223
void SDL_GetWindowPosition(SDL_Window *window, int *x, int *y)
Get the position of a window.
Definition: SDL_video.c:2019
int SDL_GL_MakeCurrent(SDL_Window *window, SDL_GLContext ctx)
Set up an OpenGL context for rendering into an OpenGL window.
Definition: SDL_video.c:3634
SDL_bool SDL_IsVideoContextExternal(void)
Definition: SDL_video.c:688
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:587
const char * SDL_GetDisplayName(int displayIndex)
Get the name of a display in UTF-8 encoding.
Definition: SDL_video.c:694
int SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect *rect)
Get the usable desktop area represented by a display, with the primary display located at 0,...
Definition: SDL_video.c:737
SDL_GLContext SDL_GL_GetCurrentContext(void)
Get the currently active OpenGL context.
Definition: SDL_video.c:3677
void SDL_ToggleDragAndDropSupport(void)
Definition: SDL_video.c:1412
SDL_Window * SDL_GetFocusWindow(void)
Definition: SDL_video.c:2812
void SDL_ShowWindow(SDL_Window *window)
Show a window.
Definition: SDL_video.c:2264
int SDL_RecreateWindow(SDL_Window *window, Uint32 flags)
Definition: SDL_video.c:1673
void SDL_GL_UnloadLibrary(void)
Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary().
Definition: SDL_video.c:3047
float SDL_GetWindowBrightness(SDL_Window *window)
Get the brightness (gamma correction) for a window.
Definition: SDL_video.c:2487
static void SDL_RestoreMousePosition(SDL_Window *window)
Definition: SDL_video.c:1209
int SDL_GL_SetAttribute(SDL_GLattr attr, int value)
Set an OpenGL window attribute before window creation.
Definition: SDL_video.c:3241
int SDL_AddBasicVideoDisplay(const SDL_DisplayMode *desktop_mode)
Definition: SDL_video.c:593
int SDL_SetWindowOpacity(SDL_Window *window, float opacity)
Set the opacity for a window.
Definition: SDL_video.c:2495
int SDL_SetWindowBrightness(SDL_Window *window, float brightness)
Set the brightness (gamma correction) for a window.
Definition: SDL_video.c:2471
int SDL_GetNumVideoDrivers(void)
Get the number of video drivers compiled into SDL.
Definition: SDL_video.c:451
void SDL_GL_ResetAttributes()
Reset all previously set OpenGL context attributes to their default values.
Definition: SDL_video.c:3187
void SDL_OnApplicationDidBecomeActive(void)
Definition: SDL_video.c:4208
void SDL_UpdateWindowGrab(SDL_Window *window)
Definition: SDL_video.c:2636
int SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode *mode)
Fill in information about the desktop display mode.
Definition: SDL_video.c:865
void SDL_SetWindowMinimumSize(SDL_Window *window, int min_w, int min_h)
Set the minimum size of a window's client area.
Definition: SDL_video.c:2179
static SDL_INLINE SDL_bool isAtLeastGL3(const char *verstr)
Definition: SDL_video.c:3065
int SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window)
Create a simple modal message box.
Definition: SDL_video.c:4104
void * SDL_GL_GetProcAddress(const char *proc)
Get the address of an OpenGL function.
Definition: SDL_video.c:3025
void SDL_DelVideoDisplay(int index)
Definition: SDL_video.c:640
void SDL_OnApplicationDidEnterBackground(void)
Definition: SDL_video.c:4198
static SDL_DisplayMode * SDL_GetClosestDisplayModeForDisplay(SDL_VideoDisplay *display, const SDL_DisplayMode *mode, SDL_DisplayMode *closest)
Definition: SDL_video.c:893
void SDL_GL_DeleteContext(SDL_GLContext context)
Delete an OpenGL context.
Definition: SDL_video.c:3744
void SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon)
Set the icon for a window.
Definition: SDL_video.c:1885
const char * SDL_GetVideoDriver(int index)
Get the name of a built in video driver.
Definition: SDL_video.c:457
const char * SDL_GetCurrentVideoDriver()
Returns the name of the currently initialized video driver.
Definition: SDL_video.c:577
SDL_Window * SDL_GetGrabbedWindow(void)
Get the window that currently has an input grab enabled.
Definition: SDL_video.c:2691
void SDL_GetWindowSize(SDL_Window *window, int *w, int *h)
Get the size of a window's client area.
Definition: SDL_video.c:2145
static SDL_Surface * SDL_CreateWindowFramebuffer(SDL_Window *window)
Definition: SDL_video.c:2396
void SDL_SetTextInputRect(SDL_Rect *rect)
Set the rectangle used to type Unicode text inputs. This is used as a hint for IME and on-screen keyb...
Definition: SDL_video.c:3923
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display, SDL_bool send_event)
Definition: SDL_video.c:607
void SDL_DestroyWindow(SDL_Window *window)
Destroy a window.
Definition: SDL_video.c:2828
void SDL_MaximizeWindow(SDL_Window *window)
Make a window as large as possible.
Definition: SDL_video.c:2311
void SDL_MinimizeWindow(SDL_Window *window)
Minimize a window to an iconic representation.
Definition: SDL_video.c:2336
static int ParseDisplayUsableBoundsHint(SDL_Rect *rect)
Definition: SDL_video.c:730
SDL_Window * SDL_GetWindowFromID(Uint32 id)
Get a window from a stored ID, or NULL if it doesn't exist.
Definition: SDL_video.c:1836
static VideoBootStrap * bootstrap[]
Definition: SDL_video.c:60
Uint32 SDL_GetWindowID(SDL_Window *window)
Get the numeric ID of a window, for logging purposes.
Definition: SDL_video.c:1828
void SDL_SetWindowSize(SDL_Window *window, int w, int h)
Set the size of a window's client area.
Definition: SDL_video.c:2097
int SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
Get the actual value for an attribute from the current context.
Definition: SDL_video.c:3362
SDL_VideoDisplay * SDL_GetDisplay(int displayIndex)
Definition: SDL_video.c:1062
static int SDL_UpdateWindowTexture(SDL_VideoDevice *unused, SDL_Window *window, const SDL_Rect *rects, int numrects)
Definition: SDL_video.c:374
void * SDL_GetWindowData(SDL_Window *window, const char *name)
Retrieve the data pointer associated with a window.
Definition: SDL_video.c:1954
int SDL_GL_LoadLibrary(const char *path)
Dynamically load an OpenGL library.
Definition: SDL_video.c:2996
float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
Definition: SDL_video.c:4162
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2752
static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype)
Definition: SDL_video.c:3974
static SDL_INLINE SDL_bool IsAcceptingDragAndDrop(void)
Definition: SDL_video.c:1392
void SDL_StopTextInput(void)
Stop receiving any text input events. This function will hide the on-screen keyboard if supported.
Definition: SDL_video.c:3902
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
Definition: SDL_video.c:792
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
Definition: SDL_video.c:1130
int SDL_GetWindowGammaRamp(SDL_Window *window, Uint16 *red, Uint16 *green, Uint16 *blue)
Get the gamma ramp for a window.
Definition: SDL_video.c:2591
void SDL_SetWindowResizable(SDL_Window *window, SDL_bool resizable)
Set the user-resizable state of a window.
Definition: SDL_video.c:2079
int SDL_SetWindowGammaRamp(SDL_Window *window, const Uint16 *red, const Uint16 *green, const Uint16 *blue)
Set the gamma ramp for a window.
Definition: SDL_video.c:2557
void SDL_GetWindowMinimumSize(SDL_Window *window, int *min_w, int *min_h)
Get the minimum size of a window's client area.
Definition: SDL_video.c:2210
void SDL_VideoQuit(void)
Shuts down the video subsystem.
Definition: SDL_video.c:2946
int SDL_GetIndexOfDisplay(SDL_VideoDisplay *display)
Definition: SDL_video.c:665
int SDL_SetWindowDisplayMode(SDL_Window *window, const SDL_DisplayMode *mode)
Set the display mode used when a fullscreen window is visible.
Definition: SDL_video.c:1141
int SDL_GetNumDisplayModes(int displayIndex)
Returns the number of available display modes.
Definition: SDL_video.c:839
SDL_bool SDL_Vulkan_CreateSurface(SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface)
Create a Vulkan rendering surface for a window.
Definition: SDL_video.c:4298
void SDL_Vulkan_UnloadLibrary(void)
Unload the Vulkan loader library previously loaded by SDL_Vulkan_LoadLibrary().
Definition: SDL_video.c:4262
void * SDL_SetWindowData(SDL_Window *window, const char *name, void *userdata)
Associate an arbitrary named pointer with a window.
Definition: SDL_video.c:1907
void SDL_OnApplicationDidReceiveMemoryWarning(void)
Definition: SDL_video.c:4181
#define GL_NUM_EXTENSIONS
SDL_bool SDL_IsTextInputActive(void)
Return whether or not Unicode text input events are enabled.
Definition: SDL_video.c:3896
void SDL_RaiseWindow(SDL_Window *window)
Raise a window above other windows and set the input focus.
Definition: SDL_video.c:2298
void SDL_GL_DeduceMaxSupportedESProfile(int *major, int *minor)
Definition: SDL_video.c:3162
void SDL_OnApplicationWillResignActive(void)
Definition: SDL_video.c:4186
void * SDL_Metal_GetLayer(SDL_MetalView view)
Get a pointer to the backing CAMetalLayer for the given view.
Definition: SDL_video.c:4360
int SDL_GetWindowOpacity(SDL_Window *window, float *out_opacity)
Get the opacity of a window.
Definition: SDL_video.c:2519
int SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *userdata)
Provide a callback that decides if a window region has special properties.
Definition: SDL_video.c:4145
SDL_bool SDL_IsScreenSaverEnabled()
Returns whether the screensaver is currently enabled (default off).
Definition: SDL_video.c:2907
void SDL_OnApplicationWillTerminate(void)
Definition: SDL_video.c:4176
#define SDL_WINDOWPOS_ISCENTERED(X)
Definition: SDL_video.h:140
SDL_HitTestResult(* SDL_HitTest)(SDL_Window *win, const SDL_Point *area, void *data)
Callback used for hit-testing.
Definition: SDL_video.h:1045
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:131
@ SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH
Definition: SDL_video.h:249
SDL_GLattr
OpenGL configuration attributes.
Definition: SDL_video.h:201
@ SDL_GL_FRAMEBUFFER_SRGB_CAPABLE
Definition: SDL_video.h:225
@ SDL_GL_CONTEXT_RELEASE_BEHAVIOR
Definition: SDL_video.h:226
@ SDL_GL_DOUBLEBUFFER
Definition: SDL_video.h:207
@ SDL_GL_STENCIL_SIZE
Definition: SDL_video.h:209
@ SDL_GL_CONTEXT_MAJOR_VERSION
Definition: SDL_video.h:219
@ SDL_GL_CONTEXT_RESET_NOTIFICATION
Definition: SDL_video.h:227
@ SDL_GL_CONTEXT_EGL
Definition: SDL_video.h:221
@ SDL_GL_ACCUM_ALPHA_SIZE
Definition: SDL_video.h:213
@ SDL_GL_MULTISAMPLESAMPLES
Definition: SDL_video.h:216
@ SDL_GL_CONTEXT_MINOR_VERSION
Definition: SDL_video.h:220
@ SDL_GL_STEREO
Definition: SDL_video.h:214
@ SDL_GL_MULTISAMPLEBUFFERS
Definition: SDL_video.h:215
@ SDL_GL_ACCUM_GREEN_SIZE
Definition: SDL_video.h:211
@ SDL_GL_BLUE_SIZE
Definition: SDL_video.h:204
@ SDL_GL_SHARE_WITH_CURRENT_CONTEXT
Definition: SDL_video.h:224
@ SDL_GL_RETAINED_BACKING
Definition: SDL_video.h:218
@ SDL_GL_RED_SIZE
Definition: SDL_video.h:202
@ SDL_GL_ALPHA_SIZE
Definition: SDL_video.h:205
@ SDL_GL_BUFFER_SIZE
Definition: SDL_video.h:206
@ SDL_GL_ACCELERATED_VISUAL
Definition: SDL_video.h:217
@ SDL_GL_ACCUM_BLUE_SIZE
Definition: SDL_video.h:212
@ SDL_GL_DEPTH_SIZE
Definition: SDL_video.h:208
@ SDL_GL_ACCUM_RED_SIZE
Definition: SDL_video.h:210
@ SDL_GL_CONTEXT_FLAGS
Definition: SDL_video.h:222
@ SDL_GL_CONTEXT_PROFILE_MASK
Definition: SDL_video.h:223
@ SDL_GL_CONTEXT_NO_ERROR
Definition: SDL_video.h:228
@ SDL_GL_GREEN_SIZE
Definition: SDL_video.h:203
@ SDL_WINDOW_ALLOW_HIGHDPI
Definition: SDL_video.h:112
@ SDL_WINDOW_FOREIGN
Definition: SDL_video.h:111
@ SDL_WINDOW_TOOLTIP
Definition: SDL_video.h:119
@ SDL_WINDOW_SHOWN
Definition: SDL_video.h:101
@ SDL_WINDOW_MOUSE_CAPTURE
Definition: SDL_video.h:115
@ SDL_WINDOW_VULKAN
Definition: SDL_video.h:121
@ SDL_WINDOW_OPENGL
Definition: SDL_video.h:100
@ SDL_WINDOW_MINIMIZED
Definition: SDL_video.h:105
@ SDL_WINDOW_UTILITY
Definition: SDL_video.h:118
@ SDL_WINDOW_INPUT_GRABBED
Definition: SDL_video.h:107
@ SDL_WINDOW_RESIZABLE
Definition: SDL_video.h:104
@ SDL_WINDOW_FULLSCREEN_DESKTOP
Definition: SDL_video.h:110
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:99
@ SDL_WINDOW_MAXIMIZED
Definition: SDL_video.h:106
@ SDL_WINDOW_METAL
Definition: SDL_video.h:122
@ SDL_WINDOW_HIDDEN
Definition: SDL_video.h:102
@ SDL_WINDOW_POPUP_MENU
Definition: SDL_video.h:120
@ SDL_WINDOW_BORDERLESS
Definition: SDL_video.h:103
@ SDL_WINDOW_INPUT_FOCUS
Definition: SDL_video.h:108
@ SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG
Definition: SDL_video.h:241
@ SDL_GL_CONTEXT_RESET_ISOLATION_FLAG
Definition: SDL_video.h:243
@ SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG
Definition: SDL_video.h:242
@ SDL_GL_CONTEXT_DEBUG_FLAG
Definition: SDL_video.h:240
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:195
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
@ SDL_GL_CONTEXT_PROFILE_COMPATIBILITY
Definition: SDL_video.h:234
@ SDL_GL_CONTEXT_PROFILE_ES
Definition: SDL_video.h:235
@ SDL_GL_CONTEXT_PROFILE_CORE
Definition: SDL_video.h:233
@ SDL_DISPLAYEVENT_DISCONNECTED
Definition: SDL_video.h:180
@ SDL_DISPLAYEVENT_CONNECTED
Definition: SDL_video.h:179
SDL_DisplayOrientation
Definition: SDL_video.h:184
@ SDL_ORIENTATION_UNKNOWN
Definition: SDL_video.h:185
@ SDL_GL_CONTEXT_RESET_NO_NOTIFICATION
Definition: SDL_video.h:254
struct xkb_state * state
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
Uint32 WINRT_DetectWindowFlags(SDL_Window *window)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
Definition: SDL_x11sym.h:50
#define NULL
Definition: begin_code.h:163
#define SDL_INLINE
Definition: begin_code.h:130
EGLSurface surface
Definition: eglext.h:248
EGLContext ctx
Definition: eglext.h:208
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
EGLSurface EGLint * rects
Definition: eglext.h:282
#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR
Definition: gl2ext.h:83
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF PF lsl PF PF PF else PF lsl PF lsl PF lsl PF endif SIZE macro preload_middle scratch_holds_offset if bpp if else PF PF endif endif endif endm macro preload_trailing base if bpp if bpp *pix_per_block PF PF lsl PF PF PF PF PF else PF lsl PF lsl PF PF PF PF PF base if bpp if narrow_case &&bpp<=dst_w_bpp) PF bic, WK0, base, #31 PF pld,[WK0] PF add, WK1, base, X, LSL #bpp_shift PF sub, WK1, WK1, #1 PF bic, WK1, WK1, #31 PF cmp, WK1, WK0 PF beq, 90f PF pld,[WK1]90:.else PF bic, WK0, base, #31 PF pld,[WK0] PF add, WK1, base, X, lsl #bpp_shift PF sub, WK1, WK1, #1 PF bic, WK1, WK1, #31 PF cmp, WK1, WK0 PF beq, 92f91:PF add, WK0, WK0, #32 PF cmp, WK0, WK1 PF pld,[WK0] PF bne, 91b92:.endif .endif.endm.macro conditional_process1_helper cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, 0 .if decrementx sub &cond X, X, #8 *numbytes/dst_w_bpp .endif process_tail cond, numbytes, firstreg .if !((flags) &FLAG_PROCESS_DOES_STORE) pixst cond, numbytes, firstreg, DST .endif.endm.macro conditional_process1 cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx .if(flags) &FLAG_BRANCH_OVER .ifc cond, mi bpl 100f .endif .ifc cond, cs bcc 100f .endif .ifc cond, ne beq 100f .endif conditional_process1_helper, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx100:.else conditional_process1_helper cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx .endif.endm.macro conditional_process2 test, cond1, cond2, process_head, process_tail, numbytes1, numbytes2, firstreg1, firstreg2, unaligned_src, unaligned_mask, decrementx .if(flags) &(FLAG_DST_READWRITE|FLAG_BRANCH_OVER|FLAG_PROCESS_CORRUPTS_PSR|FLAG_PROCESS_DOES_STORE) test conditional_process1 cond1, process_head, process_tail, numbytes1, firstreg1, unaligned_src, unaligned_mask, decrementx .if(flags) &FLAG_PROCESS_CORRUPTS_PSR test .endif conditional_process1 cond2, process_head, process_tail, numbytes2, firstreg2, unaligned_src, unaligned_mask, decrementx .else test process_head cond1, numbytes1, firstreg1, unaligned_src, unaligned_mask, 0 process_head cond2, numbytes2, firstreg2, unaligned_src, unaligned_mask, 0 .if decrementx sub &cond1 X, X, #8 *numbytes1/dst_w_bpp sub &cond2 X, X, #8 *numbytes2/dst_w_bpp .endif process_tail cond1, numbytes1, firstreg1 process_tail cond2, numbytes2, firstreg2 pixst cond1, numbytes1, firstreg1, DST pixst cond2, numbytes2, firstreg2, DST .endif.endm.macro test_bits_1_0_ptr .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 movs SCRATCH, X, lsl #32-1 .else movs SCRATCH, WK0, lsl #32-1 .endif.endm.macro test_bits_3_2_ptr .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 movs SCRATCH, X, lsl #32-3 .else movs SCRATCH, WK0, lsl #32-3 .endif.endm.macro leading_15bytes process_head, process_tail .set DECREMENT_X, 1 .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 .set DECREMENT_X, 0 sub X, X, WK0, lsr #dst_bpp_shift str X,[sp, #LINE_SAVED_REG_COUNT *4] mov X, WK0 .endif .if dst_w_bpp==8 conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, DECREMENT_X .elseif dst_w_bpp==16 test_bits_1_0_ptr conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, DECREMENT_X .endif conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, DECREMENT_X .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 ldr X,[sp, #LINE_SAVED_REG_COUNT *4] .endif.endm.macro test_bits_3_2_pix movs SCRATCH, X, lsl #dst_bpp_shift+32-3.endm.macro test_bits_1_0_pix .if dst_w_bpp==8 movs SCRATCH, X, lsl #dst_bpp_shift+32-1 .else movs SCRATCH, X, lsr #1 .endif.endm.macro trailing_15bytes process_head, process_tail, unaligned_src, unaligned_mask conditional_process2 test_bits_3_2_pix, cs, mi, process_head, process_tail, 8, 4, 0, 2, unaligned_src, unaligned_mask, 0 .if dst_w_bpp==16 test_bits_1_0_pix conditional_process1 cs, process_head, process_tail, 2, 0, unaligned_src, unaligned_mask, 0 .elseif dst_w_bpp==8 conditional_process2 test_bits_1_0_pix, cs, mi, process_head, process_tail, 2, 1, 0, 1, unaligned_src, unaligned_mask, 0 .endif.endm.macro wide_case_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, dst_alignment110:.set SUBBLOCK, 0 .rept pix_per_block *dst_w_bpp/128 process_head, 16, 0, unaligned_src, unaligned_mask, 1 .if(src_bpp > 0) &&(mask_bpp==0) &&((flags) &FLAG_PROCESS_PRESERVES_SCRATCH) preload_middle src_bpp, SRC, 1 .elseif(src_bpp==0) &&(mask_bpp > 0) &&((flags) &FLAG_PROCESS_PRESERVES_SCRATCH) preload_middle mask_bpp, MASK, 1 .else preload_middle src_bpp, SRC, 0 preload_middle mask_bpp, MASK, 0 .endif .if(dst_r_bpp > 0) &&((SUBBLOCK % 2)==0) &&(((flags) &FLAG_NO_PRELOAD_DST)==0) PF pld,[DST, #32 *prefetch_distance - dst_alignment] .endif process_tail, 16, 0 .if !((flags) &FLAG_PROCESS_DOES_STORE) pixst, 16, 0, DST .endif .set SUBBLOCK, SUBBLOCK+1 .endr subs X, X, #pix_per_block bhs 110b.endm.macro wide_case_inner_loop_and_trailing_pixels process_head, process_tail, process_inner_loop, exit_label, unaligned_src, unaligned_mask .if dst_r_bpp > tst bne process_inner_loop DST_PRELOAD_BIAS endif preload_trailing SRC preload_trailing MASK DST endif add medium_case_inner_loop_and_trailing_pixels unaligned_mask endm macro medium_case_inner_loop_and_trailing_pixels unused
The structure that defines a display mode.
Definition: SDL_video.h:54
void * driverdata
Definition: SDL_video.h:59
Uint32 format
Definition: SDL_video.h:55
Individual button data.
MessageBox structure containing title, text, window, etc.
SDL_Window * window
const char * title
const char * message
SDL_bool relative_mode
Definition: SDL_mouse_c.h:87
Uint8 BytesPerPixel
Definition: SDL_pixels.h:329
The structure that defines a point (integer)
Definition: SDL_rect.h:49
int x
Definition: SDL_rect.h:50
int y
Definition: SDL_rect.h:51
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:78
int h
Definition: SDL_rect.h:80
int w
Definition: SDL_rect.h:80
int y
Definition: SDL_rect.h:79
int x
Definition: SDL_rect.h:79
Information on the capabilities of a render driver or context.
Definition: SDL_render.h:79
const char * name
Definition: SDL_render.h:80
Uint32 texture_formats[16]
Definition: SDL_render.h:83
Uint32 num_texture_formats
Definition: SDL_render.h:82
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71
SDL_PixelFormat * format
Definition: SDL_surface.h:73
Uint32 flags
Definition: SDL_surface.h:72
void * pixels
Definition: SDL_surface.h:76
SDL_SYSWM_TYPE subsystem
Definition: SDL_syswm.h:219
SDL_version version
Definition: SDL_syswm.h:218
int(* SetDisplayMode)(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
Definition: SDL_sysvideo.h:206
int(* GetDisplayBounds)(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
Definition: SDL_sysvideo.h:183
void(* SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon)
Definition: SDL_sysvideo.h:215
int(* CreateWindowFramebuffer)(_THIS, SDL_Window *window, Uint32 *format, void **pixels, int *pitch)
Definition: SDL_sysvideo.h:237
int framebuffer_srgb_capable
Definition: SDL_sysvideo.h:360
void(* HideScreenKeyboard)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:304
int(* ShowMessageBox)(_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid)
Definition: SDL_sysvideo.h:313
struct SDL_VideoDevice::@441 vulkan_config
void(* Metal_GetDrawableSize)(_THIS, SDL_Window *window, int *w, int *h)
Definition: SDL_sysvideo.h:285
int(* SetWindowHitTest)(SDL_Window *window, SDL_bool enabled)
Definition: SDL_sysvideo.h:316
char driver_path[256]
Definition: SDL_sysvideo.h:364
void(* GL_DeleteContext)(_THIS, SDL_GLContext context)
Definition: SDL_sysvideo.h:265
const char * name
Definition: SDL_sysvideo.h:153
void(* ShowWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:224
int(* GL_MakeCurrent)(_THIS, SDL_Window *window, SDL_GLContext context)
Definition: SDL_sysvideo.h:260
void(* RestoreWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:229
SDL_GLContext current_glctx
Definition: SDL_sysvideo.h:374
void(* SetWindowFullscreen)(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
Definition: SDL_sysvideo.h:232
void(* Metal_DestroyView)(_THIS, SDL_MetalView view)
Definition: SDL_sysvideo.h:283
int(* GetDisplayUsableBounds)(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
Definition: SDL_sysvideo.h:188
struct SDL_VideoDevice::@440 gl_config
void(* SuspendScreenSaver)(_THIS)
Definition: SDL_sysvideo.h:294
int(* Vulkan_LoadLibrary)(_THIS, const char *path)
Definition: SDL_sysvideo.h:272
SDL_bool(* Vulkan_GetInstanceExtensions)(_THIS, SDL_Window *window, unsigned *count, const char **names)
Definition: SDL_sysvideo.h:274
int(* CreateSDLWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:212
SDL_GLContext(* GL_CreateContext)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:259
void(* SetWindowSize)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:217
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr
Definition: SDL_sysvideo.h:387
int(* SetWindowModalFor)(_THIS, SDL_Window *modal_window, SDL_Window *parent_window)
Definition: SDL_sysvideo.h:222
int(* UpdateWindowFramebuffer)(_THIS, SDL_Window *window, const SDL_Rect *rects, int numrects)
Definition: SDL_sysvideo.h:238
int(* GetDisplayDPI)(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hdpi, float *vdpi)
Definition: SDL_sysvideo.h:193
void *(* Metal_GetLayer)(_THIS, SDL_MetalView view)
Definition: SDL_sysvideo.h:284
void(* SetWindowPosition)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:216
int(* GL_SetSwapInterval)(_THIS, int interval)
Definition: SDL_sysvideo.h:262
void(* GL_UnloadLibrary)(_THIS)
Definition: SDL_sysvideo.h:258
void(* SetWindowMinimumSize)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:218
int(* SetWindowGammaRamp)(_THIS, SDL_Window *window, const Uint16 *ramp)
Definition: SDL_sysvideo.h:233
SDL_bool is_dummy
Definition: SDL_sysvideo.h:323
void(* VideoQuit)(_THIS)
Definition: SDL_sysvideo.h:168
void *(* GL_GetProcAddress)(_THIS, const char *proc)
Definition: SDL_sysvideo.h:257
SDL_MetalView(* Metal_CreateView)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:282
SDL_bool suspend_screensaver
Definition: SDL_sysvideo.h:324
void(* SetWindowResizable)(_THIS, SDL_Window *window, SDL_bool resizable)
Definition: SDL_sysvideo.h:231
SDL_bool(* HasScreenKeyboardSupport)(_THIS)
Definition: SDL_sysvideo.h:302
void(* Vulkan_UnloadLibrary)(_THIS)
Definition: SDL_sysvideo.h:273
void(* GetDisplayModes)(_THIS, SDL_VideoDisplay *display)
Definition: SDL_sysvideo.h:198
char loader_path[256]
Definition: SDL_sysvideo.h:390
SDL_bool(* IsScreenKeyboardShown)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:305
SDL_TLSID current_glwin_tls
Definition: SDL_sysvideo.h:375
SDL_VideoDisplay * displays
Definition: SDL_sysvideo.h:326
SDL_Window * grabbed_window
Definition: SDL_sysvideo.h:328
void(* free)(_THIS)
Definition: SDL_sysvideo.h:409
void(* Vulkan_GetDrawableSize)(_THIS, SDL_Window *window, int *w, int *h)
Definition: SDL_sysvideo.h:276
int(* GL_GetSwapInterval)(_THIS)
Definition: SDL_sysvideo.h:263
int(* GetWindowGammaRamp)(_THIS, SDL_Window *window, Uint16 *ramp)
Definition: SDL_sysvideo.h:234
int(* GetWindowBordersSize)(_THIS, SDL_Window *window, int *top, int *left, int *bottom, int *right)
Definition: SDL_sysvideo.h:220
void(* GL_GetDrawableSize)(_THIS, SDL_Window *window, int *w, int *h)
Definition: SDL_sysvideo.h:261
void(* DestroyWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:236
void(* StartTextInput)(_THIS)
Definition: SDL_sysvideo.h:297
int(* GL_LoadLibrary)(_THIS, const char *path)
Definition: SDL_sysvideo.h:256
int(* GL_SwapWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:264
void(* SetWindowMaximumSize)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:219
void(* SetWindowTitle)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:214
SDL_bool gl_allow_no_surface
Definition: SDL_sysvideo.h:381
int(* SetWindowInputFocus)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:223
void(* DestroyWindowFramebuffer)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:239
void(* GL_DefaultProfileConfig)(_THIS, int *mask, int *major, int *minor)
Definition: SDL_sysvideo.h:266
void(* MinimizeWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:228
int(* VideoInit)(_THIS)
Definition: SDL_sysvideo.h:162
void(* HideWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:225
SDL_bool(* GetWindowWMInfo)(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
Definition: SDL_sysvideo.h:249
void(* SetTextInputRect)(_THIS, SDL_Rect *rect)
Definition: SDL_sysvideo.h:299
SDL_bool(* Vulkan_CreateSurface)(_THIS, SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface)
Definition: SDL_sysvideo.h:275
void(* AcceptDragAndDrop)(SDL_Window *window, SDL_bool accept)
Definition: SDL_sysvideo.h:319
char * clipboard_text
Definition: SDL_sysvideo.h:331
void(* SetWindowGrab)(_THIS, SDL_Window *window, SDL_bool grabbed)
Definition: SDL_sysvideo.h:235
SDL_Window * windows
Definition: SDL_sysvideo.h:327
Uint32 next_object_id
Definition: SDL_sysvideo.h:330
void(* StopTextInput)(_THIS)
Definition: SDL_sysvideo.h:298
int(* CreateSDLWindowFrom)(_THIS, SDL_Window *window, const void *data)
Definition: SDL_sysvideo.h:213
SDL_TLSID current_glctx_tls
Definition: SDL_sysvideo.h:376
SDL_Window * current_glwin
Definition: SDL_sysvideo.h:373
void(* MaximizeWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:227
void(* OnWindowEnter)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:240
int(* SetWindowOpacity)(_THIS, SDL_Window *window, float opacity)
Definition: SDL_sysvideo.h:221
int share_with_current_context
Definition: SDL_sysvideo.h:357
void(* ShowScreenKeyboard)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:303
void(* SetWindowBordered)(_THIS, SDL_Window *window, SDL_bool bordered)
Definition: SDL_sysvideo.h:230
void(* RaiseWindow)(_THIS, SDL_Window *window)
Definition: SDL_sysvideo.h:226
SDL_DisplayMode desktop_mode
Definition: SDL_sysvideo.h:132
SDL_DisplayOrientation orientation
Definition: SDL_sysvideo.h:134
SDL_VideoDevice * device
Definition: SDL_sysvideo.h:138
SDL_DisplayMode * display_modes
Definition: SDL_sysvideo.h:131
SDL_Window * fullscreen_window
Definition: SDL_sysvideo.h:136
SDL_DisplayMode current_mode
Definition: SDL_sysvideo.h:133
The type used to identify a window.
Definition: SDL_sysvideo.h:75
SDL_Window * next
Definition: SDL_sysvideo.h:115
Uint32 flags
Definition: SDL_sysvideo.h:84
SDL_bool is_destroying
Definition: SDL_sysvideo.h:102
SDL_Window * prev
Definition: SDL_sysvideo.h:114
SDL_Texture * texture
Definition: SDL_video.c:167
SDL_Renderer * renderer
Definition: SDL_video.c:166
struct SDL_WindowUserData * next
Definition: SDL_sysvideo.h:70
const char * name
Definition: SDL_sysvideo.h:414
SDL_VideoDevice *(* create)(int devindex)
Definition: SDL_sysvideo.h:416
static SDL_Renderer * renderer
SDL_Texture * button
SDL_bool retval
SDL_Rect rect
Definition: testrelative.c:27
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
static screen_context_t context
Definition: video.c:25
VideoBootStrap QNX_bootstrap
Definition: video.c:355