1 
2 //          Copyright 2018 - 2022 Michael D. Parker
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.sdl.bind.sdlvideo;
8 
9 import bindbc.sdl.config;
10 import bindbc.sdl.bind.sdlrect : SDL_Rect;
11 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
12 import bindbc.sdl.bind.sdlsurface : SDL_Surface;
13 
14 struct SDL_DisplayMode {
15     uint format;
16     int w;
17     int h;
18     int refresh_rate;
19     void* driverdata;
20 }
21 
22 struct SDL_Window;
23 
24 // SDL_WindowFlags
25 enum uint SDL_WINDOW_FULLSCREEN = 0x00000001;
26 enum uint SDL_WINDOW_OPENGL = 0x00000002;
27 enum uint SDL_WINDOW_SHOWN = 0x00000004;
28 enum uint SDL_WINDOW_HIDDEN = 0x00000008;
29 enum uint SDL_WINDOW_BORDERLESS = 0x00000010;
30 enum uint SDL_WINDOW_RESIZABLE = 0x00000020;
31 enum uint SDL_WINDOW_MINIMIZED = 0x00000040;
32 enum uint SDL_WINDOW_MAXIMIZED = 0x00000080;
33 enum uint SDL_WINDOW_INPUT_GRABBED = 0x00000100;
34 enum uint SDL_WINDOW_INPUT_FOCUS = 0x00000200;
35 enum uint SDL_WINDOW_MOUSE_FOCUS = 0x00000400;
36 enum uint SDL_WINDOW_FULLSCREEN_DESKTOP = SDL_WINDOW_FULLSCREEN | 0x00001000;
37 enum uint SDL_WINDOW_FOREIGN = 0x00000800;
38 static if(sdlSupport >= SDLSupport.sdl201) {
39     enum uint SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000;
40 }
41 static if(sdlSupport >= SDLSupport.sdl204) {
42     enum uint SDL_WINDOW_MOUSE_CAPTURE = 0x00004000;
43 }
44 static if(sdlSupport >= SDLSupport.sdl205) {
45     enum uint SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000;
46     enum uint SDL_WINDOW_SKIP_TASKBAR  = 0x00010000;
47     enum uint SDL_WINDOW_UTILITY = 0x00020000;
48     enum uint SDL_WINDOW_TOOLTIP = 0x00040000;
49     enum uint SDL_WINDOW_POPUP_MENU = 0x00080000;
50 }
51 static if(sdlSupport >= SDLSupport.sdl206) {
52     enum uint SDL_WINDOW_VULKAN = 0x10000000;
53 }
54 static if(sdlSupport >= SDLSupport.sdl206) {
55     enum uint SDL_WINDOW_METAL = 0x20000000;
56 }
57 static if(sdlSupport >= SDLSupport.sdl2016) {
58     enum uint SDL_WINDOW_MOUSE_GRABBED = SDL_WINDOW_INPUT_GRABBED;
59     enum uint SDL_WINDOW_KEYBOARD_GRABBED = 0x00100000;
60 }
61 alias SDL_WindowFlags = uint;
62 
63 enum uint SDL_WINDOWPOS_UNDEFINED_MASK = 0x1FFF0000;
64 enum uint SDL_WINDOWPOS_UNDEFINED = SDL_WINDOWPOS_UNDEFINED_DISPLAY(0);
65 
66 enum uint SDL_WINDOWPOS_CENTERED_MASK = 0x2FFF0000;
67 enum uint SDL_WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED_DISPLAY(0);
68 
69 @safe @nogc nothrow pure {
70     uint SDL_WINDOWPOS_UNDEFINED_DISPLAY(uint x) { return SDL_WINDOWPOS_UNDEFINED_MASK | x; }
71     uint SDL_WINDOWPOS_ISUNDEFINED(uint x) { return (x & 0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK; }
72     uint SDL_WINDOWPOS_CENTERED_DISPLAY(uint x) { return SDL_WINDOWPOS_CENTERED_MASK | x; }
73     uint SDL_WINDOWPOS_ISCENTERED(uint x) { return (x & 0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK; }
74 }
75 
76 static if(sdlSupport >= SDLSupport.sdl2018) {
77     enum SDL_WindowEventID : ubyte {
78         SDL_WINDOWEVENT_NONE,
79         SDL_WINDOWEVENT_SHOWN,
80         SDL_WINDOWEVENT_HIDDEN,
81         SDL_WINDOWEVENT_EXPOSED,
82         SDL_WINDOWEVENT_MOVED,
83         SDL_WINDOWEVENT_RESIZED,
84         SDL_WINDOWEVENT_SIZE_CHANGED,
85         SDL_WINDOWEVENT_MINIMIZED,
86         SDL_WINDOWEVENT_MAXIMIZED,
87         SDL_WINDOWEVENT_RESTORED,
88         SDL_WINDOWEVENT_ENTER,
89         SDL_WINDOWEVENT_LEAVE,
90         SDL_WINDOWEVENT_FOCUS_GAINED,
91         SDL_WINDOWEVENT_FOCUS_LOST,
92         SDL_WINDOWEVENT_CLOSE,
93         SDL_WINDOWEVENT_TAKE_FOCUS,
94         SDL_WINDOWEVENT_HIT_TEST,
95         SDL_WINDOWEVENT_ICCPROF_CHANGED,
96         SDL_WINDOWEVENT_DISPLAY_CHANGED,
97     }
98 
99 }
100 else static if(sdlSupport >= SDLSupport.sdl205) {
101     enum SDL_WindowEventID : ubyte {
102         SDL_WINDOWEVENT_NONE,
103         SDL_WINDOWEVENT_SHOWN,
104         SDL_WINDOWEVENT_HIDDEN,
105         SDL_WINDOWEVENT_EXPOSED,
106         SDL_WINDOWEVENT_MOVED,
107         SDL_WINDOWEVENT_RESIZED,
108         SDL_WINDOWEVENT_SIZE_CHANGED,
109         SDL_WINDOWEVENT_MINIMIZED,
110         SDL_WINDOWEVENT_MAXIMIZED,
111         SDL_WINDOWEVENT_RESTORED,
112         SDL_WINDOWEVENT_ENTER,
113         SDL_WINDOWEVENT_LEAVE,
114         SDL_WINDOWEVENT_FOCUS_GAINED,
115         SDL_WINDOWEVENT_FOCUS_LOST,
116         SDL_WINDOWEVENT_CLOSE,
117         SDL_WINDOWEVENT_TAKE_FOCUS,
118         SDL_WINDOWEVENT_HIT_TEST,
119     }
120 
121 }
122 else {
123     enum SDL_WindowEventID : ubyte {
124         SDL_WINDOWEVENT_NONE,
125         SDL_WINDOWEVENT_SHOWN,
126         SDL_WINDOWEVENT_HIDDEN,
127         SDL_WINDOWEVENT_EXPOSED,
128         SDL_WINDOWEVENT_MOVED,
129         SDL_WINDOWEVENT_RESIZED,
130         SDL_WINDOWEVENT_SIZE_CHANGED,
131         SDL_WINDOWEVENT_MINIMIZED,
132         SDL_WINDOWEVENT_MAXIMIZED,
133         SDL_WINDOWEVENT_RESTORED,
134         SDL_WINDOWEVENT_ENTER,
135         SDL_WINDOWEVENT_LEAVE,
136         SDL_WINDOWEVENT_FOCUS_GAINED,
137         SDL_WINDOWEVENT_FOCUS_LOST,
138         SDL_WINDOWEVENT_CLOSE,
139     }
140 }
141 mixin(expandEnum!SDL_WindowEventID);
142 
143 static if(sdlSupport >= SDLSupport.sdl2014) {
144     enum SDL_DisplayEventID {
145         SDL_DISPLAYEVENT_NONE,
146         SDL_DISPLAYEVENT_ORIENTATION,
147         SDL_DISPLAYEVENT_CONNECTED,
148         SDL_DISPLAYEVENT_DISCONNECTED,
149     }
150     mixin(expandEnum!SDL_DisplayEventID);
151 }
152 else static if(sdlSupport >= SDLSupport.sdl209) {
153     enum SDL_DisplayEventID {
154         SDL_DISPLAYEVENT_NONE,
155         SDL_DISPLAYEVENT_ORIENTATION,
156     }
157     mixin(expandEnum!SDL_DisplayEventID);
158 }
159 
160 static if(sdlSupport >= SDLSupport.sdl209) {
161     enum SDL_DisplayOrientation {
162         SDL_ORIENTATION_UNKNOWN,
163         SDL_ORIENTATION_LANDSCAPE,
164         SDL_ORIENTATION_LANDSCAPE_FLIPPED,
165         SDL_ORIENTATION_PORTRAIT,
166         SDL_ORIENTATION_PORTRAIT_FLIPPED,
167     }
168     mixin(expandEnum!SDL_DisplayOrientation);
169 }
170 
171 static if(sdlSupport >= SDLSupport.sdl2016) {
172     enum SDL_FlashOperation {
173         SDL_FLASH_CANCEL,
174         SDL_FLASH_BRIEFLY,
175         SDL_FLASH_UNTIL_FOCUSED
176     }
177     mixin(expandEnum!SDL_FlashOperation);
178 }
179 
180 alias SDL_GLContext = void*;
181 
182 static if(sdlSupport >= SDLSupport.sdl206) {
183     enum SDL_GLattr {
184         SDL_GL_RED_SIZE,
185         SDL_GL_GREEN_SIZE,
186         SDL_GL_BLUE_SIZE,
187         SDL_GL_ALPHA_SIZE,
188         SDL_GL_BUFFER_SIZE,
189         SDL_GL_DOUBLEBUFFER,
190         SDL_GL_DEPTH_SIZE,
191         SDL_GL_STENCIL_SIZE,
192         SDL_GL_ACCUM_RED_SIZE,
193         SDL_GL_ACCUM_GREEN_SIZE,
194         SDL_GL_ACCUM_BLUE_SIZE,
195         SDL_GL_ACCUM_ALPHA_SIZE,
196         SDL_GL_STEREO,
197         SDL_GL_MULTISAMPLEBUFFERS,
198         SDL_GL_MULTISAMPLESAMPLES,
199         SDL_GL_ACCELERATED_VISUAL,
200         SDL_GL_RETAINED_BACKING,
201         SDL_GL_CONTEXT_MAJOR_VERSION,
202         SDL_GL_CONTEXT_MINOR_VERSION,
203         SDL_GL_CONTEXT_EGL,
204         SDL_GL_CONTEXT_FLAGS,
205         SDL_GL_CONTEXT_PROFILE_MASK,
206         SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
207         SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
208         SDL_GL_RELEASE_BEHAVIOR,
209         SDL_GL_CONTEXT_RESET_NOTIFICATION,
210         SDL_GL_CONTEXT_NO_ERROR,
211     }
212 }
213 else static if(sdlSupport >= SDLSupport.sdl204) {
214     enum SDL_GLattr {
215         SDL_GL_RED_SIZE,
216         SDL_GL_GREEN_SIZE,
217         SDL_GL_BLUE_SIZE,
218         SDL_GL_ALPHA_SIZE,
219         SDL_GL_BUFFER_SIZE,
220         SDL_GL_DOUBLEBUFFER,
221         SDL_GL_DEPTH_SIZE,
222         SDL_GL_STENCIL_SIZE,
223         SDL_GL_ACCUM_RED_SIZE,
224         SDL_GL_ACCUM_GREEN_SIZE,
225         SDL_GL_ACCUM_BLUE_SIZE,
226         SDL_GL_ACCUM_ALPHA_SIZE,
227         SDL_GL_STEREO,
228         SDL_GL_MULTISAMPLEBUFFERS,
229         SDL_GL_MULTISAMPLESAMPLES,
230         SDL_GL_ACCELERATED_VISUAL,
231         SDL_GL_RETAINED_BACKING,
232         SDL_GL_CONTEXT_MAJOR_VERSION,
233         SDL_GL_CONTEXT_MINOR_VERSION,
234         SDL_GL_CONTEXT_EGL,
235         SDL_GL_CONTEXT_FLAGS,
236         SDL_GL_CONTEXT_PROFILE_MASK,
237         SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
238         SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
239         SDL_GL_RELEASE_BEHAVIOR,
240     }
241 }
242 else static if(sdlSupport >= SDLSupport.sdl201) {
243     enum SDL_GLattr {
244         SDL_GL_RED_SIZE,
245         SDL_GL_GREEN_SIZE,
246         SDL_GL_BLUE_SIZE,
247         SDL_GL_ALPHA_SIZE,
248         SDL_GL_BUFFER_SIZE,
249         SDL_GL_DOUBLEBUFFER,
250         SDL_GL_DEPTH_SIZE,
251         SDL_GL_STENCIL_SIZE,
252         SDL_GL_ACCUM_RED_SIZE,
253         SDL_GL_ACCUM_GREEN_SIZE,
254         SDL_GL_ACCUM_BLUE_SIZE,
255         SDL_GL_ACCUM_ALPHA_SIZE,
256         SDL_GL_STEREO,
257         SDL_GL_MULTISAMPLEBUFFERS,
258         SDL_GL_MULTISAMPLESAMPLES,
259         SDL_GL_ACCELERATED_VISUAL,
260         SDL_GL_RETAINED_BACKING,
261         SDL_GL_CONTEXT_MAJOR_VERSION,
262         SDL_GL_CONTEXT_MINOR_VERSION,
263         SDL_GL_CONTEXT_EGL,
264         SDL_GL_CONTEXT_FLAGS,
265         SDL_GL_CONTEXT_PROFILE_MASK,
266         SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
267         SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
268     }
269 }
270 else {
271     enum SDL_GLattr {
272         SDL_GL_RED_SIZE,
273         SDL_GL_GREEN_SIZE,
274         SDL_GL_BLUE_SIZE,
275         SDL_GL_ALPHA_SIZE,
276         SDL_GL_BUFFER_SIZE,
277         SDL_GL_DOUBLEBUFFER,
278         SDL_GL_DEPTH_SIZE,
279         SDL_GL_STENCIL_SIZE,
280         SDL_GL_ACCUM_RED_SIZE,
281         SDL_GL_ACCUM_GREEN_SIZE,
282         SDL_GL_ACCUM_BLUE_SIZE,
283         SDL_GL_ACCUM_ALPHA_SIZE,
284         SDL_GL_STEREO,
285         SDL_GL_MULTISAMPLEBUFFERS,
286         SDL_GL_MULTISAMPLESAMPLES,
287         SDL_GL_ACCELERATED_VISUAL,
288         SDL_GL_RETAINED_BACKING,
289         SDL_GL_CONTEXT_MAJOR_VERSION,
290         SDL_GL_CONTEXT_MINOR_VERSION,
291         SDL_GL_CONTEXT_EGL,
292         SDL_GL_CONTEXT_FLAGS,
293         SDL_GL_CONTEXT_PROFILE_MASK,
294         SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
295     }
296 }
297 mixin(expandEnum!SDL_GLattr);
298 
299 enum SDL_GLprofile  {
300     SDL_GL_CONTEXT_PROFILE_CORE = 0x0001,
301     SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002,
302     SDL_GL_CONTEXT_PROFILE_ES = 0x0004,
303 }
304 mixin(expandEnum!SDL_GLprofile);
305 
306 enum {
307     SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001,
308     SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002,
309     SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004,
310     SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008,
311 }
312 alias SDL_GLcontextFlag = int;
313 
314 static if(sdlSupport >= SDLSupport.sdl204) {
315     enum SDL_GLcontextReleaseFlag {
316         SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE    = 0x0000,
317         SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH   = 0x0001,
318     }
319     mixin(expandEnum!SDL_GLcontextReleaseFlag);
320 
321     enum SDL_HitTestResult {
322         SDL_HITTEST_NORMAL,
323         SDL_HITTEST_DRAGGABLE,
324         SDL_HITTEST_RESIZE_TOPLEFT,
325         SDL_HITTEST_RESIZE_TOP,
326         SDL_HITTEST_RESIZE_TOPRIGHT,
327         SDL_HITTEST_RESIZE_RIGHT,
328         SDL_HITTEST_RESIZE_BOTTOMRIGHT,
329         SDL_HITTEST_RESIZE_BOTTOM,
330         SDL_HITTEST_RESIZE_BOTTOMLEFT,
331         SDL_HITTEST_RESIZE_LEFT,
332     }
333     mixin(expandEnum!SDL_HitTestResult);
334 
335     import bindbc.sdl.bind.sdlrect : SDL_Point;
336     extern(C) nothrow alias SDL_HitTest = SDL_HitTestResult function(SDL_Window*,const(SDL_Point)*,void*);
337 }
338 
339 static if(sdlSupport >= SDLSupport.sdl206) {
340     enum SDL_GLContextResetNotification {
341         SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000,
342         SDL_GL_CONTEXT_RESET_LOSE_CONTEXT    = 0x0001,
343     }
344     mixin(expandEnum!SDL_GLContextResetNotification);
345 }
346 
347  
348 
349 static if(staticBinding) {
350     extern(C) @nogc nothrow {
351         int SDL_GetNumVideoDrivers();
352         const(char)* SDL_GetVideoDriver(int index);
353         int SDL_VideoInit(const(char)* driver_name);
354         void SDL_VideoQuit();
355         const(char)* SDL_GetCurrentVideoDriver();
356         int SDL_GetNumVideoDisplays();
357         const(char)* SDL_GetDisplayName(int displayIndex);
358         int SDL_GetDisplayBounds(int displayIndex, SDL_Rect* rect);
359         int SDL_GetNumDisplayModes(int displayIndex);
360         int SDL_GetDisplayMode(int displayIndex, int modeIndex, SDL_DisplayMode* mode);
361         int SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode* mode);
362         int SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode* mode);
363         SDL_DisplayMode* SDL_GetClosestDisplayMode(int displayIndex, const(SDL_DisplayMode)* mode, SDL_DisplayMode* closest);
364         int SDL_GetWindowDisplayIndex(SDL_Window* window);
365         int SDL_SetWindowDisplayMode(SDL_Window* window, const(SDL_DisplayMode)* mode);
366         int SDL_GetWindowDisplayMode(SDL_Window* window, SDL_DisplayMode* mode);
367         uint SDL_GetWindowPixelFormat(SDL_Window* window);
368         SDL_Window* SDL_CreateWindow(const(char)* title, int x, int y, int w, int h, SDL_WindowFlags flags);
369         SDL_Window* SDL_CreateWindowFrom(const(void)* data);
370         uint SDL_GetWindowID(SDL_Window* window);
371         SDL_Window* SDL_GetWindowFromID(uint id);
372         SDL_WindowFlags SDL_GetWindowFlags(SDL_Window* window);
373         void SDL_SetWindowTitle(SDL_Window* window, const(char)* title);
374         const(char)* SDL_GetWindowTitle(SDL_Window* window);
375         void SDL_SetWindowIcon(SDL_Window* window, SDL_Surface* icon);
376         void* SDL_SetWindowData(SDL_Window* window, const(char)* name, void* userdata);
377         void* SDL_GetWindowData(SDL_Window* window, const(char)* name);
378         void SDL_SetWindowPosition(SDL_Window* window, int x, int y);
379         void SDL_GetWindowPosition(SDL_Window* window, int* x, int* y);
380         void SDL_SetWindowSize(SDL_Window* window, int w, int h);
381         void SDL_GetWindowSize(SDL_Window* window, int* w, int* h);
382         void SDL_SetWindowMinimumSize(SDL_Window* window, int min_w, int min_h);
383         void SDL_GetWindowMinimumSize(SDL_Window* window, int* w, int* h);
384         void SDL_SetWindowMaximumSize(SDL_Window* window, int max_w, int max_h);
385         void SDL_GetWindowMaximumSize(SDL_Window* window, int* w, int* h);
386         void SDL_SetWindowBordered(SDL_Window* window, SDL_bool bordered);
387         void SDL_ShowWindow(SDL_Window* window);
388         void SDL_HideWindow(SDL_Window* window);
389         void SDL_RaiseWindow(SDL_Window* window);
390         void SDL_MaximizeWindow(SDL_Window* window);
391         void SDL_MinimizeWindow(SDL_Window* window);
392         void SDL_RestoreWindow(SDL_Window* window);
393         int SDL_SetWindowFullscreen(SDL_Window* window, SDL_WindowFlags flags);
394         SDL_Surface* SDL_GetWindowSurface(SDL_Window* window);
395         int SDL_UpdateWindowSurface(SDL_Window* window);
396         int SDL_UpdateWindowSurfaceRects(SDL_Window* window, SDL_Rect* rects, int numrects);
397         void SDL_SetWindowGrab(SDL_Window* window, SDL_bool grabbed);
398         SDL_bool SDL_GetWindowGrab(SDL_Window* window);
399         int SDL_SetWindowBrightness(SDL_Window* window, float brightness);
400         float SDL_GetWindowBrightness(SDL_Window* window);
401         int SDL_SetWindowGammaRamp(SDL_Window* window, const(ushort)* red, const(ushort)* green, const(ushort)* blue);
402         int SDL_GetWindowGammaRamp(SDL_Window* window, ushort* red, ushort* green, ushort* blue);
403         void SDL_DestroyWindow(SDL_Window* window);
404         SDL_bool SDL_IsScreenSaverEnabled();
405         void SDL_EnableScreenSaver();
406         void SDL_DisableScreenSaver();
407         int SDL_GL_LoadLibrary(const(char)* path);
408         void* SDL_GL_GetProcAddress(const(char)* proc);
409         void SDL_GL_UnloadLibrary();
410         SDL_bool SDL_GL_ExtensionSupported(const(char)* extension);
411         int SDL_GL_SetAttribute(SDL_GLattr attr, int value);
412         int SDL_GL_GetAttribute(SDL_GLattr attr, int* value);
413         SDL_GLContext SDL_GL_CreateContext(SDL_Window* window);
414         int SDL_GL_MakeCurrent(SDL_Window* window, SDL_GLContext context);
415         SDL_Window* SDL_GL_GetCurrentWindow();
416         SDL_GLContext SDL_GL_GetCurrentContext();
417         int SDL_GL_SetSwapInterval(int interval);
418         int SDL_GL_GetSwapInterval();
419         void SDL_GL_SwapWindow(SDL_Window* window);
420         void SDL_GL_DeleteContext(SDL_GLContext context);
421 
422         static if(sdlSupport >= SDLSupport.sdl201) {
423             void SDL_GL_GetDrawableSize(SDL_Window* window, int* w, int* h);
424         }
425         static if(sdlSupport >= SDLSupport.sdl202) {
426             void SDL_GL_ResetAttributes();
427         }
428         static if(sdlSupport >= SDLSupport.sdl204) {
429             int SDL_GetDisplayDPI(int displayIndex, float* ddpi, float* hdpi, float* vdpi);
430             SDL_Window* SDL_GetGrabbedWindow();
431             int SDL_SetWindowHitTest(SDL_Window* window, SDL_HitTest callback, void* callback_data);
432         }
433         static if(sdlSupport >= SDLSupport.sdl205) {
434             int SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect* rect);
435             int SDL_GetWindowBordersSize(SDL_Window* window, int* top, int* left, int* bottom, int* right);
436             int SDL_GetWindowOpacity(SDL_Window* window, float* opacity);
437             int SDL_SetWindowInputFocus(SDL_Window* window);
438             int SDL_SetWindowModalFor(SDL_Window* modal_window, SDL_Window* parent_window);
439             int SDL_SetWindowOpacity(SDL_Window* window, float opacity);
440             void SDL_SetWindowResizable(SDL_Window* window, SDL_bool resizable);
441         }
442         static if(sdlSupport >= SDLSupport.sdl209) {
443             SDL_DisplayOrientation SDL_GetDisplayOrientation(int displayIndex);
444         }
445         static if(sdlSupport >= SDLSupport.sdl2016) {
446             int SDL_FlashWindow(SDL_Window* window, SDL_FlashOperation operation);
447             void SDL_SetWindowAlwaysOnTop(SDL_Window* window, SDL_bool on_top);
448             void SDL_SetWindowKeyboardGrab(SDL_Window* window, SDL_bool grabbed);
449             SDL_bool SDL_GetWindowKeyboardGrab(SDL_Window * window);
450             void SDL_SetWindowMouseGrab(SDL_Window* window, SDL_bool grabbed);
451             SDL_bool SDL_GetWindowMouseGrab(SDL_Window* window);
452         }
453         static if(sdlSupport >= SDLSupport.sdl2018) {
454             void* SDL_GetWindowICCProfile(SDL_Window* window, size_t* size);
455             int SDL_SetWindowMouseRect(SDL_Window* window, const(SDL_Rect)* rect);
456             const(SDL_Rect)* SDL_GetWindowMouseRect(SDL_Window* window);
457             
458         }
459     }
460 }
461 else {
462     extern(C) @nogc nothrow {
463         alias pSDL_GetNumVideoDrivers = int function();
464         alias pSDL_GetVideoDriver = const(char)* function(int index);
465         alias pSDL_VideoInit = int function(const(char)* driver_name);
466         alias pSDL_VideoQuit = void function();
467         alias pSDL_GetCurrentVideoDriver = const(char)* function();
468         alias pSDL_GetNumVideoDisplays = int function();
469         alias pSDL_GetDisplayName = const(char)* function(int displayIndex);
470         alias pSDL_GetDisplayBounds = int function(int displayIndex, SDL_Rect* rect);
471         alias pSDL_GetNumDisplayModes = int function(int displayIndex);
472         alias pSDL_GetDisplayMode = int function(int displayIndex, int modeIndex, SDL_DisplayMode* mode);
473         alias pSDL_GetDesktopDisplayMode = int function(int displayIndex, SDL_DisplayMode* mode);
474         alias pSDL_GetCurrentDisplayMode = int function(int displayIndex, SDL_DisplayMode* mode);
475         alias pSDL_GetClosestDisplayMode = SDL_DisplayMode* function(int displayIndex, const(SDL_DisplayMode)* mode, SDL_DisplayMode* closest);
476         alias pSDL_GetWindowDisplayIndex = int function(SDL_Window* window);
477         alias pSDL_SetWindowDisplayMode = int function(SDL_Window* window, const(SDL_DisplayMode)* mode);
478         alias pSDL_GetWindowDisplayMode = int function(SDL_Window* window, SDL_DisplayMode* mode);
479         alias pSDL_GetWindowPixelFormat = uint function(SDL_Window* window);
480         alias pSDL_CreateWindow = SDL_Window* function(const(char)* title, int x, int y, int w, int h, SDL_WindowFlags flags);
481         alias pSDL_CreateWindowFrom = SDL_Window* function(const(void)* data);
482         alias pSDL_GetWindowID = uint function(SDL_Window* window);
483         alias pSDL_GetWindowFromID = SDL_Window* function(uint id);
484         alias pSDL_GetWindowFlags = SDL_WindowFlags function(SDL_Window* window);
485         alias pSDL_SetWindowTitle = void function(SDL_Window* window, const(char)* title);
486         alias pSDL_GetWindowTitle = const(char)* function(SDL_Window* window);
487         alias pSDL_SetWindowIcon = void function(SDL_Window* window, SDL_Surface* icon);
488         alias pSDL_SetWindowData = void* function(SDL_Window* window, const(char)* name, void* userdata);
489         alias pSDL_GetWindowData = void* function(SDL_Window* window, const(char)* name);
490         alias pSDL_SetWindowPosition = void function(SDL_Window* window, int x, int y);
491         alias pSDL_GetWindowPosition = void function(SDL_Window* window, int* x, int* y);
492         alias pSDL_SetWindowSize = void function(SDL_Window* window, int w, int h);
493         alias pSDL_GetWindowSize = void function(SDL_Window* window, int* w, int* h);
494         alias pSDL_SetWindowMinimumSize = void function(SDL_Window* window, int min_w, int min_h);
495         alias pSDL_GetWindowMinimumSize = void function(SDL_Window* window, int* w, int* h);
496         alias pSDL_SetWindowMaximumSize = void function(SDL_Window* window, int max_w, int max_h);
497         alias pSDL_GetWindowMaximumSize = void function(SDL_Window* window, int* w, int* h);
498         alias pSDL_SetWindowBordered = void function(SDL_Window* window, SDL_bool bordered);
499         alias pSDL_ShowWindow = void function(SDL_Window* window);
500         alias pSDL_HideWindow = void function(SDL_Window* window);
501         alias pSDL_RaiseWindow = void function(SDL_Window* window);
502         alias pSDL_MaximizeWindow = void function(SDL_Window* window);
503         alias pSDL_MinimizeWindow = void function(SDL_Window* window);
504         alias pSDL_RestoreWindow = void function(SDL_Window* window);
505         alias pSDL_SetWindowFullscreen = int function(SDL_Window* window, SDL_WindowFlags flags);
506         alias pSDL_GetWindowSurface = SDL_Surface* function(SDL_Window* window);
507         alias pSDL_UpdateWindowSurface = int function(SDL_Window* window);
508         alias pSDL_UpdateWindowSurfaceRects = int function(SDL_Window* window, SDL_Rect* rects, int numrects);
509         alias pSDL_SetWindowGrab = void function(SDL_Window* window, SDL_bool grabbed);
510         alias pSDL_GetWindowGrab = SDL_bool function(SDL_Window* window);
511         alias pSDL_SetWindowBrightness = int function(SDL_Window* window, float brightness);
512         alias pSDL_GetWindowBrightness = float function(SDL_Window* window);
513         alias pSDL_SetWindowGammaRamp = int function(SDL_Window* window, const(ushort)* red, const(ushort)* green, const(ushort)* blue);
514         alias pSDL_GetWindowGammaRamp = int function(SDL_Window* window, ushort* red, ushort* green, ushort* blue);
515         alias pSDL_DestroyWindow = void function(SDL_Window* window);
516         alias pSDL_IsScreenSaverEnabled = SDL_bool function();
517         alias pSDL_EnableScreenSaver = void function();
518         alias pSDL_DisableScreenSaver = void function();
519         alias pSDL_GL_LoadLibrary = int function(const(char)* path);
520         alias pSDL_GL_GetProcAddress = void* function(const(char)* proc);
521         alias pSDL_GL_UnloadLibrary = void function();
522         alias pSDL_GL_ExtensionSupported = SDL_bool function(const(char)* extension);
523         alias pSDL_GL_SetAttribute = int function(SDL_GLattr attr, int value);
524         alias pSDL_GL_GetAttribute = int function(SDL_GLattr attr, int* value);
525         alias pSDL_GL_CreateContext = SDL_GLContext function(SDL_Window* window);
526         alias pSDL_GL_MakeCurrent = int function(SDL_Window* window, SDL_GLContext context);
527         alias pSDL_GL_GetCurrentWindow = SDL_Window* function();
528         alias pSDL_GL_GetCurrentContext = SDL_GLContext function();
529         alias pSDL_GL_SetSwapInterval = int function(int interval);
530         alias pSDL_GL_GetSwapInterval = int function();
531         alias pSDL_GL_SwapWindow = void function(SDL_Window* window);
532         alias pSDL_GL_DeleteContext = void function(SDL_GLContext context);
533     }
534 
535     __gshared {
536         pSDL_GetNumVideoDrivers SDL_GetNumVideoDrivers;
537         pSDL_GetVideoDriver SDL_GetVideoDriver;
538         pSDL_VideoInit SDL_VideoInit;
539         pSDL_VideoQuit SDL_VideoQuit;
540         pSDL_GetCurrentVideoDriver SDL_GetCurrentVideoDriver;
541         pSDL_GetNumVideoDisplays SDL_GetNumVideoDisplays;
542         pSDL_GetDisplayName SDL_GetDisplayName;
543         pSDL_GetDisplayBounds SDL_GetDisplayBounds;
544         pSDL_GetNumDisplayModes SDL_GetNumDisplayModes;
545         pSDL_GetDisplayMode SDL_GetDisplayMode;
546         pSDL_GetDesktopDisplayMode SDL_GetDesktopDisplayMode;
547         pSDL_GetCurrentDisplayMode SDL_GetCurrentDisplayMode;
548         pSDL_GetClosestDisplayMode SDL_GetClosestDisplayMode;
549         pSDL_GetWindowDisplayIndex SDL_GetWindowDisplayIndex;
550         pSDL_SetWindowDisplayMode SDL_SetWindowDisplayMode;
551         pSDL_GetWindowDisplayMode SDL_GetWindowDisplayMode;
552         pSDL_GetWindowPixelFormat SDL_GetWindowPixelFormat;
553         pSDL_CreateWindow SDL_CreateWindow;
554         pSDL_CreateWindowFrom SDL_CreateWindowFrom;
555         pSDL_GetWindowID SDL_GetWindowID;
556         pSDL_GetWindowFromID SDL_GetWindowFromID;
557         pSDL_GetWindowFlags SDL_GetWindowFlags;
558         pSDL_SetWindowTitle SDL_SetWindowTitle;
559         pSDL_GetWindowTitle SDL_GetWindowTitle;
560         pSDL_SetWindowIcon SDL_SetWindowIcon;
561         pSDL_SetWindowData SDL_SetWindowData;
562         pSDL_GetWindowData SDL_GetWindowData;
563         pSDL_SetWindowPosition SDL_SetWindowPosition;
564         pSDL_GetWindowPosition SDL_GetWindowPosition;
565         pSDL_SetWindowSize SDL_SetWindowSize;
566         pSDL_GetWindowSize SDL_GetWindowSize;
567         pSDL_SetWindowMinimumSize SDL_SetWindowMinimumSize;
568         pSDL_GetWindowMinimumSize SDL_GetWindowMinimumSize;
569         pSDL_SetWindowMaximumSize SDL_SetWindowMaximumSize;
570         pSDL_GetWindowMaximumSize SDL_GetWindowMaximumSize;
571         pSDL_SetWindowBordered SDL_SetWindowBordered;
572         pSDL_ShowWindow SDL_ShowWindow;
573         pSDL_HideWindow SDL_HideWindow;
574         pSDL_RaiseWindow SDL_RaiseWindow;
575         pSDL_MaximizeWindow SDL_MaximizeWindow;
576         pSDL_MinimizeWindow SDL_MinimizeWindow;
577         pSDL_RestoreWindow SDL_RestoreWindow;
578         pSDL_SetWindowFullscreen SDL_SetWindowFullscreen;
579         pSDL_GetWindowSurface SDL_GetWindowSurface;
580         pSDL_UpdateWindowSurface SDL_UpdateWindowSurface;
581         pSDL_UpdateWindowSurfaceRects SDL_UpdateWindowSurfaceRects;
582         pSDL_SetWindowGrab SDL_SetWindowGrab;
583         pSDL_GetWindowGrab SDL_GetWindowGrab;
584         pSDL_SetWindowBrightness SDL_SetWindowBrightness;
585         pSDL_GetWindowBrightness SDL_GetWindowBrightness;
586         pSDL_SetWindowGammaRamp SDL_SetWindowGammaRamp;
587         pSDL_GetWindowGammaRamp SDL_GetWindowGammaRamp;
588         pSDL_DestroyWindow SDL_DestroyWindow;
589         pSDL_IsScreenSaverEnabled SDL_IsScreenSaverEnabled;
590         pSDL_EnableScreenSaver SDL_EnableScreenSaver;
591         pSDL_DisableScreenSaver SDL_DisableScreenSaver;
592         pSDL_GL_LoadLibrary SDL_GL_LoadLibrary;
593         pSDL_GL_GetProcAddress SDL_GL_GetProcAddress;
594         pSDL_GL_UnloadLibrary SDL_GL_UnloadLibrary;
595         pSDL_GL_ExtensionSupported SDL_GL_ExtensionSupported;
596         pSDL_GL_SetAttribute SDL_GL_SetAttribute;
597         pSDL_GL_GetAttribute SDL_GL_GetAttribute;
598         pSDL_GL_CreateContext SDL_GL_CreateContext;
599         pSDL_GL_MakeCurrent SDL_GL_MakeCurrent;
600         pSDL_GL_GetCurrentWindow SDL_GL_GetCurrentWindow;
601         pSDL_GL_GetCurrentContext SDL_GL_GetCurrentContext;
602         pSDL_GL_SetSwapInterval SDL_GL_SetSwapInterval;
603         pSDL_GL_GetSwapInterval SDL_GL_GetSwapInterval;
604         pSDL_GL_SwapWindow SDL_GL_SwapWindow;
605         pSDL_GL_DeleteContext SDL_GL_DeleteContext;
606     }
607 
608     static if(sdlSupport >= SDLSupport.sdl201) {
609         extern(C) @nogc nothrow {
610             alias pSDL_GL_GetDrawableSize = void function(SDL_Window* window, int* w, int* h);
611         }
612 
613         __gshared {
614             pSDL_GL_GetDrawableSize SDL_GL_GetDrawableSize;
615         }
616     }
617 
618     static if(sdlSupport >= SDLSupport.sdl202) {
619         extern(C) @nogc nothrow {
620             alias pSDL_GL_ResetAttributes = void function();
621         }
622 
623         __gshared {
624             pSDL_GL_ResetAttributes SDL_GL_ResetAttributes;
625         }
626     }
627 
628     static if(sdlSupport >= SDLSupport.sdl204) {
629         extern(C) @nogc nothrow {
630             alias pSDL_GetDisplayDPI = int function(int displayIndex, float* ddpi, float* hdpi, float* vdpi);
631             alias pSDL_GetGrabbedWindow = SDL_Window* function();
632             alias pSDL_SetWindowHitTest = int function(SDL_Window* window, SDL_HitTest callback, void* callback_data);
633         }
634 
635         __gshared {
636             pSDL_GetDisplayDPI SDL_GetDisplayDPI;
637             pSDL_GetGrabbedWindow SDL_GetGrabbedWindow;
638             pSDL_SetWindowHitTest SDL_SetWindowHitTest;
639         }
640     }
641 
642     static if(sdlSupport >= SDLSupport.sdl205) {
643         extern(C) @nogc nothrow {
644             alias pSDL_GetDisplayUsableBounds = int function(int displayIndex, SDL_Rect* rect);
645             alias pSDL_GetWindowBordersSize = int function(SDL_Window* window, int* top, int* left, int* bottom, int* right);
646             alias pSDL_GetWindowOpacity = int function(SDL_Window* window, float* opacity);
647             alias pSDL_SetWindowInputFocus = int function(SDL_Window* window);
648             alias pSDL_SetWindowModalFor = int function(SDL_Window* modal_window, SDL_Window* parent_window);
649             alias pSDL_SetWindowOpacity = int function(SDL_Window* window, float opacity);
650             alias pSDL_SetWindowResizable = void function(SDL_Window* window, SDL_bool resizable);
651         }
652 
653         __gshared {
654             pSDL_GetDisplayUsableBounds SDL_GetDisplayUsableBounds;
655             pSDL_GetWindowBordersSize SDL_GetWindowBordersSize;
656             pSDL_GetWindowOpacity SDL_GetWindowOpacity;
657             pSDL_SetWindowInputFocus SDL_SetWindowInputFocus;
658             pSDL_SetWindowModalFor SDL_SetWindowModalFor;
659             pSDL_SetWindowOpacity SDL_SetWindowOpacity;
660             pSDL_SetWindowResizable SDL_SetWindowResizable;
661         }
662     }
663 
664     static if(sdlSupport >= SDLSupport.sdl209) {
665         extern(C) @nogc nothrow {
666             alias pSDL_GetDisplayOrientation = SDL_DisplayOrientation function(int displayIndex);
667         }
668 
669         __gshared {
670             pSDL_GetDisplayOrientation SDL_GetDisplayOrientation;
671         }
672     }
673 
674     static if(sdlSupport >= SDLSupport.sdl2016) {
675         extern(C) @nogc nothrow {
676             alias pSDL_FlashWindow = int function(SDL_Window* window, SDL_FlashOperation operation);
677             alias pSDL_SetWindowAlwaysOnTop = void function(SDL_Window* window, SDL_bool on_top);
678             alias pSDL_SetWindowKeyboardGrab = void function(SDL_Window* window, SDL_bool grabbed);
679             alias pSDL_GetWindowKeyboardGrab = SDL_bool function(SDL_Window* window);
680             alias pSDL_SetWindowMouseGrab = void function(SDL_Window* window, SDL_bool grabbed);
681             alias pSDL_GetWindowMouseGrab = SDL_bool function(SDL_Window* window);
682         }
683 
684         __gshared {
685             pSDL_FlashWindow SDL_FlashWindow;
686             pSDL_SetWindowAlwaysOnTop SDL_SetWindowAlwaysOnTop;
687             pSDL_SetWindowKeyboardGrab SDL_SetWindowKeyboardGrab;
688             pSDL_GetWindowKeyboardGrab SDL_GetWindowKeyboardGrab;
689             pSDL_SetWindowMouseGrab SDL_SetWindowMouseGrab;
690             pSDL_GetWindowMouseGrab SDL_GetWindowMouseGrab;
691         }
692     }
693 
694     static if(sdlSupport >= SDLSupport.sdl2018) {
695         extern(C) @nogc nothrow {
696             alias pSDL_GetWindowICCProfile = void* function(SDL_Window* window, size_t* size);
697             alias pSDL_SetWindowMouseRect = int function(SDL_Window* window, const(SDL_Rect)* rect);
698             alias pSDL_GetWindowMouseRect = const(SDL_Rect)* function(SDL_Window* window);
699         }
700 
701         __gshared {
702             pSDL_GetWindowICCProfile SDL_GetWindowICCProfile;
703             pSDL_SetWindowMouseRect SDL_SetWindowMouseRect;
704             pSDL_GetWindowMouseRect SDL_GetWindowMouseRect;
705         }
706     }
707 }