1 /+
2 +            Copyright 2022 – 2024 Aya Partridge
3 +          Copyright 2018 - 2022 Michael D. Parker
4 + Distributed under the Boost Software License, Version 1.0.
5 +     (See accompanying file LICENSE_1_0.txt or copy at
6 +           http://www.boost.org/LICENSE_1_0.txt)
7 +/
8 module sdl.video;
9 
10 import bindbc.sdl.config;
11 import bindbc.sdl.codegen;
12 
13 import sdl.rect: SDL_Rect;
14 import sdl.stdinc: SDL_bool;
15 import sdl.surface: SDL_Surface;
16 
17 struct SDL_DisplayMode{
18 	uint format;
19 	int w;
20 	int h;
21 	int refresh_rate;
22 	void* driverdata;
23 }
24 
25 struct SDL_Window;
26 
27 alias SDL_WindowFlags = uint;
28 enum: SDL_WindowFlags{
29 	SDL_WINDOW_FULLSCREEN          = 0x0000_0001,
30 	SDL_WINDOW_OPENGL              = 0x0000_0002,
31 	SDL_WINDOW_SHOWN               = 0x0000_0004,
32 	SDL_WINDOW_HIDDEN              = 0x0000_0008,
33 	SDL_WINDOW_BORDERLESS          = 0x0000_0010,
34 	SDL_WINDOW_RESIZABLE           = 0x0000_0020,
35 	SDL_WINDOW_MINIMIZED           = 0x0000_0040,
36 	SDL_WINDOW_MAXIMIZED           = 0x0000_0080,
37 	SDL_WINDOW_INPUT_GRABBED       = 0x0000_0100,
38 	SDL_WINDOW_INPUT_FOCUS         = 0x0000_0200,
39 	SDL_WINDOW_MOUSE_FOCUS         = 0x0000_0400,
40 	SDL_WINDOW_FULLSCREEN_DESKTOP  = 0x0000_1000 | SDL_WINDOW_FULLSCREEN,
41 	SDL_WINDOW_FOREIGN             = 0x0000_0800,
42 }
43 static if(sdlSupport >= SDLSupport.v2_0_1)
44 enum: SDL_WindowFlags{
45 	SDL_WINDOW_ALLOW_HIGHDPI       = 0x0000_2000,
46 }
47 static if(sdlSupport >= SDLSupport.v2_0_4)
48 enum: SDL_WindowFlags{
49 	SDL_WINDOW_MOUSE_CAPTURE       = 0x0000_4000,
50 }
51 static if(sdlSupport >= SDLSupport.v2_0_5)
52 enum: SDL_WindowFlags{
53 	SDL_WINDOW_ALWAYS_ON_TOP       = 0x0000_8000,
54 	SDL_WINDOW_SKIP_TASKBAR        = 0x0001_0000,
55 	SDL_WINDOW_UTILITY             = 0x0002_0000,
56 	SDL_WINDOW_TOOLTIP             = 0x0004_0000,
57 	SDL_WINDOW_POPUP_MENU          = 0x0008_0000,
58 }
59 static if(sdlSupport >= SDLSupport.v2_0_6)
60 enum: SDL_WindowFlags{
61 	SDL_WINDOW_VULKAN              = 0x1000_0000,
62 }
63 static if(sdlSupport >= SDLSupport.v2_0_6)
64 enum: SDL_WindowFlags{
65 	SDL_WINDOW_METAL               = 0x2000_0000,
66 }
67 static if(sdlSupport >= SDLSupport.v2_0_16)
68 enum: SDL_WindowFlags{
69 	SDL_WINDOW_MOUSE_GRABBED       = SDL_WINDOW_INPUT_GRABBED,
70 	SDL_WINDOW_KEYBOARD_GRABBED    = 0x0010_0000,
71 }
72 
73 enum: uint{
74 	SDL_WINDOWPOS_UNDEFINED_MASK = 0x1FFF0000,
75 	SDL_WINDOWPOS_UNDEFINED = SDL_WINDOWPOS_UNDEFINED_DISPLAY(0),
76 	SDL_WINDOWPOS_CENTERED_MASK = 0x2FFF0000,
77 	SDL_WINDOWPOS_CENTRED_MASK = SDL_WINDOWPOS_CENTERED_MASK,
78 	SDL_WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED_DISPLAY(0),
79 	SDL_WINDOWPOS_CENTRED = SDL_WINDOWPOS_CENTERED,
80 }
81 
82 pragma(inline, true) nothrow @nogc pure @safe{
83 	uint SDL_WINDOWPOS_UNDEFINED_DISPLAY(uint x){ return SDL_WINDOWPOS_UNDEFINED_MASK | x; }
84 	uint SDL_WINDOWPOS_ISUNDEFINED(uint x){ return (x & 0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK; }
85 	uint SDL_WINDOWPOS_CENTERED_DISPLAY(uint x){ return SDL_WINDOWPOS_CENTERED_MASK | x; }
86 	uint SDL_WINDOWPOS_ISCENTERED(uint x){ return (x & 0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK; }
87 }
88 
89 alias SDL_WindowEventID = ubyte;
90 enum: SDL_WindowEventID{
91 	SDL_WINDOWEVENT_NONE             = 0,
92 	SDL_WINDOWEVENT_SHOWN            = 1,
93 	SDL_WINDOWEVENT_HIDDEN           = 2,
94 	SDL_WINDOWEVENT_EXPOSED          = 3,
95 	SDL_WINDOWEVENT_MOVED            = 4,
96 	SDL_WINDOWEVENT_RESIZED          = 5,
97 	SDL_WINDOWEVENT_SIZE_CHANGED     = 6,
98 	SDL_WINDOWEVENT_MINIMIZED        = 7,
99 	SDL_WINDOWEVENT_MAXIMIZED        = 8,
100 	SDL_WINDOWEVENT_RESTORED         = 9,
101 	SDL_WINDOWEVENT_ENTER            = 10,
102 	SDL_WINDOWEVENT_LEAVE            = 11,
103 	SDL_WINDOWEVENT_FOCUS_GAINED     = 12,
104 	SDL_WINDOWEVENT_FOCUS_LOST       = 13,
105 	SDL_WINDOWEVENT_CLOSE            = 14,
106 }
107 static if(sdlSupport >= SDLSupport.v2_0_5)
108 enum: SDL_WindowEventID{
109 	SDL_WINDOWEVENT_TAKE_FOCUS       = 15,
110 	SDL_WINDOWEVENT_HIT_TEST         = 16,
111 }
112 static if(sdlSupport >= SDLSupport.v2_0_18)
113 enum: SDL_WindowEventID{
114 	SDL_WINDOWEVENT_ICCPROF_CHANGED  = 17,
115 	SDL_WINDOWEVENT_DISPLAY_CHANGED  = 18,
116 }
117 
118 static if(sdlSupport >= SDLSupport.v2_0_9){
119 	alias SDL_DisplayEventID = int;
120 	enum: SDL_DisplayEventID{
121 		SDL_DISPLAYEVENT_NONE          = 0,
122 		SDL_DISPLAYEVENT_ORIENTATION   = 1,
123 	}
124 	static if(sdlSupport >= SDLSupport.v2_0_14)
125 	enum: SDL_DisplayEventID{
126 		SDL_DISPLAYEVENT_CONNECTED     = 2,
127 		SDL_DISPLAYEVENT_DISCONNECTED  = 3,
128 	}
129 	static if(sdlSupport >= SDLSupport.v2_28)
130 	enum: SDL_DisplayEventID{
131 		SDL_DISPLAYEVENT_MOVED         = 4,
132 	}
133 }
134 
135 static if(sdlSupport >= SDLSupport.v2_0_9){
136 	alias SDL_DisplayOrientation = int;
137 	enum: SDL_DisplayOrientation{
138 		SDL_ORIENTATION_UNKNOWN            = 0,
139 		SDL_ORIENTATION_LANDSCAPE          = 1,
140 		SDL_ORIENTATION_LANDSCAPE_FLIPPED  = 2,
141 		SDL_ORIENTATION_PORTRAIT           = 3,
142 		SDL_ORIENTATION_PORTRAIT_FLIPPED   = 4,
143 	}
144 }
145 
146 static if(sdlSupport >= SDLSupport.v2_0_16){
147 	alias SDL_FlashOperation = int;
148 	enum: SDL_FlashOperation{
149 		SDL_FLASH_CANCEL         = 0,
150 		SDL_FLASH_BRIEFLY        = 1,
151 		SDL_FLASH_UNTIL_FOCUSED  = 2,
152 	}
153 }
154 
155 alias SDL_GLContext = void*;
156 
157 alias SDL_GLattr = int;
158 enum: SDL_GLattr{
159 	SDL_GL_RED_SIZE                    = 0,
160 	SDL_GL_GREEN_SIZE                  = 1,
161 	SDL_GL_BLUE_SIZE                   = 2,
162 	SDL_GL_ALPHA_SIZE                  = 3,
163 	SDL_GL_BUFFER_SIZE                 = 4,
164 	SDL_GL_DOUBLEBUFFER                = 5,
165 	SDL_GL_DEPTH_SIZE                  = 6,
166 	SDL_GL_STENCIL_SIZE                = 7,
167 	SDL_GL_ACCUM_RED_SIZE              = 8,
168 	SDL_GL_ACCUM_GREEN_SIZE            = 9,
169 	SDL_GL_ACCUM_BLUE_SIZE             = 10,
170 	SDL_GL_ACCUM_ALPHA_SIZE            = 11,
171 	SDL_GL_STEREO                      = 12,
172 	SDL_GL_MULTISAMPLEBUFFERS          = 13,
173 	SDL_GL_MULTISAMPLESAMPLES          = 14,
174 	SDL_GL_ACCELERATED_VISUAL          = 15,
175 	SDL_GL_RETAINED_BACKING            = 16,
176 	SDL_GL_CONTEXT_MAJOR_VERSION       = 17,
177 	SDL_GL_CONTEXT_MINOR_VERSION       = 18,
178 	SDL_GL_CONTEXT_EGL                 = 19,
179 	SDL_GL_CONTEXT_FLAGS               = 20,
180 	SDL_GL_CONTEXT_PROFILE_MASK        = 21,
181 	SDL_GL_SHARE_WITH_CURRENT_CONTEXT  = 22,
182 }
183 static if(sdlSupport >= SDLSupport.v2_0_1)
184 enum: SDL_GLattr{
185 	SDL_GL_FRAMEBUFFER_SRGB_CAPABLE    = 23,
186 }
187 static if(sdlSupport >= SDLSupport.v2_0_4)
188 enum: SDL_GLattr{
189 	deprecated("Please use `SDL_GL_CONTEXT_RELEASE_BEHAVIOR` instead") SDL_GL_RELEASE_BEHAVIOR = 24, //NOTE: this name was a typo to begin with
190 	SDL_GL_CONTEXT_RELEASE_BEHAVIOR    = 24,
191 }
192 static if(sdlSupport >= SDLSupport.v2_0_6)
193 enum: SDL_GLattr{
194 	SDL_GL_CONTEXT_RESET_NOTIFICATION  = 25,
195 	SDL_GL_CONTEXT_NO_ERROR            = 26,
196 }
197 static if(sdlSupport >= SDLSupport.v2_0_6)
198 enum: SDL_GLattr{
199 	SDL_GL_FLOATBUFFERS                = 27,
200 }
201 
202 alias SDL_GLprofile = int;
203 enum: SDL_GLprofile{
204 	SDL_GL_CONTEXT_PROFILE_CORE             = 0x0001,
205 	SDL_GL_CONTEXT_PROFILE_COMPATIBILITY    = 0x0002,
206 	SDL_GL_CONTEXT_PROFILE_ES               = 0x0004,
207 }
208 
209 alias SDL_GLcontextFlag = int;
210 enum: SDL_GLcontextFlag{
211 	SDL_GL_CONTEXT_DEBUG_FLAG                 = 0x0001,
212 	SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG    = 0x0002,
213 	SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG         = 0x0004,
214 	SDL_GL_CONTEXT_RESET_ISOLATION_FLAG       = 0x0008,
215 }
216 
217 static if(sdlSupport >= SDLSupport.v2_0_4){
218 	alias SDL_GLcontextReleaseFlag = int;
219 	enum: SDL_GLcontextReleaseFlag{
220 		SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE     = 0x0000,
221 		SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH    = 0x0001,
222 	}
223 	
224 	alias SDL_HitTestResult = int;
225 	enum: SDL_HitTestResult{
226 		SDL_HITTEST_NORMAL              = 0,
227 		SDL_HITTEST_DRAGGABLE           = 1,
228 		SDL_HITTEST_RESIZE_TOPLEFT      = 2,
229 		SDL_HITTEST_RESIZE_TOP          = 3,
230 		SDL_HITTEST_RESIZE_TOPRIGHT     = 4,
231 		SDL_HITTEST_RESIZE_RIGHT        = 5,
232 		SDL_HITTEST_RESIZE_BOTTOMRIGHT  = 6,
233 		SDL_HITTEST_RESIZE_BOTTOM       = 7,
234 		SDL_HITTEST_RESIZE_BOTTOMLEFT   = 8,
235 		SDL_HITTEST_RESIZE_LEFT         = 9,
236 	}
237 	
238 	import sdl.rect: SDL_Point;
239 	alias SDL_HitTest = extern(C) SDL_HitTestResult function(SDL_Window* win, const(SDL_Point)* area, void* data) nothrow;
240 }
241 
242 static if(sdlSupport >= SDLSupport.v2_0_6){
243 	alias SDL_GLContextResetNotification = int;
244 	enum: SDL_GLContextResetNotification{
245 		SDL_GL_CONTEXT_RESET_NO_NOTIFICATION    = 0x0000,
246 		SDL_GL_CONTEXT_RESET_LOSE_CONTEXT       = 0x0001,
247 	}
248 }
249 
250 mixin(joinFnBinds((){
251 	FnBind[] ret = [
252 		{q{int}, q{SDL_GetNumVideoDrivers}, q{}},
253 		{q{const(char)*}, q{SDL_GetVideoDriver}, q{int index}},
254 		{q{int}, q{SDL_VideoInit}, q{const(char)* driverName}},
255 		{q{void}, q{SDL_VideoQuit}, q{}},
256 		{q{const(char)*}, q{SDL_GetCurrentVideoDriver}, q{}},
257 		{q{int}, q{SDL_GetNumVideoDisplays}, q{}},
258 		{q{const(char)*}, q{SDL_GetDisplayName}, q{int displayIndex}},
259 		{q{int}, q{SDL_GetDisplayBounds}, q{int displayIndex, SDL_Rect* rect}},
260 		{q{int}, q{SDL_GetNumDisplayModes}, q{int displayIndex}},
261 		{q{int}, q{SDL_GetDisplayMode}, q{int displayIndex, int modeIndex, SDL_DisplayMode* mode}},
262 		{q{int}, q{SDL_GetDesktopDisplayMode}, q{int displayIndex, SDL_DisplayMode* mode}},
263 		{q{int}, q{SDL_GetCurrentDisplayMode}, q{int displayIndex, SDL_DisplayMode* mode}},
264 		{q{SDL_DisplayMode*}, q{SDL_GetClosestDisplayMode}, q{int displayIndex, const(SDL_DisplayMode)* mode, SDL_DisplayMode* closest}},
265 		{q{int}, q{SDL_GetWindowDisplayIndex}, q{SDL_Window* window}},
266 		{q{int}, q{SDL_SetWindowDisplayMode}, q{SDL_Window* window, const(SDL_DisplayMode)* mode}},
267 		{q{int}, q{SDL_GetWindowDisplayMode}, q{SDL_Window* window, SDL_DisplayMode* mode}},
268 		{q{uint}, q{SDL_GetWindowPixelFormat}, q{SDL_Window* window}},
269 		{q{SDL_Window*}, q{SDL_CreateWindow}, q{const(char)* title, int x, int y, int w, int h, SDL_WindowFlags flags}},
270 		{q{SDL_Window*}, q{SDL_CreateWindowFrom}, q{const(void)* data}},
271 		{q{uint}, q{SDL_GetWindowID}, q{SDL_Window* window}},
272 		{q{SDL_Window*}, q{SDL_GetWindowFromID}, q{uint id}},
273 		{q{SDL_WindowFlags}, q{SDL_GetWindowFlags}, q{SDL_Window* window}},
274 		{q{void}, q{SDL_SetWindowTitle}, q{SDL_Window* window, const(char)* title}},
275 		{q{const(char)*}, q{SDL_GetWindowTitle}, q{SDL_Window* window}},
276 		{q{void}, q{SDL_SetWindowIcon}, q{SDL_Window* window, SDL_Surface* icon}},
277 		{q{void*}, q{SDL_SetWindowData}, q{SDL_Window* window, const(char)* name, void* userData}},
278 		{q{void*}, q{SDL_GetWindowData}, q{SDL_Window* window, const(char)* name}},
279 		{q{void}, q{SDL_SetWindowPosition}, q{SDL_Window* window, int x, int y}},
280 		{q{void}, q{SDL_GetWindowPosition}, q{SDL_Window* window, int* x, int* y}},
281 		{q{void}, q{SDL_SetWindowSize}, q{SDL_Window* window, int w, int h}},
282 		{q{void}, q{SDL_GetWindowSize}, q{SDL_Window* window, int* w, int* h}},
283 		{q{void}, q{SDL_SetWindowMinimumSize}, q{SDL_Window* window, int minW, int minH}},
284 		{q{void}, q{SDL_GetWindowMinimumSize}, q{SDL_Window* window, int* w, int* h}},
285 		{q{void}, q{SDL_SetWindowMaximumSize}, q{SDL_Window* window, int maxW, int maxH}},
286 		{q{void}, q{SDL_GetWindowMaximumSize}, q{SDL_Window* window, int* w, int* h}},
287 		{q{void}, q{SDL_SetWindowBordered}, q{SDL_Window* window, SDL_bool bordered}},
288 		{q{void}, q{SDL_ShowWindow}, q{SDL_Window* window}},
289 		{q{void}, q{SDL_HideWindow}, q{SDL_Window* window}},
290 		{q{void}, q{SDL_RaiseWindow}, q{SDL_Window* window}},
291 		{q{void}, q{SDL_MaximizeWindow}, q{SDL_Window* window}},
292 		{q{void}, q{SDL_MinimizeWindow}, q{SDL_Window* window}},
293 		{q{void}, q{SDL_RestoreWindow}, q{SDL_Window* window}},
294 		{q{int}, q{SDL_SetWindowFullscreen}, q{SDL_Window* window, SDL_WindowFlags flags}},
295 		{q{SDL_Surface*}, q{SDL_GetWindowSurface}, q{SDL_Window* window}},
296 		{q{int}, q{SDL_UpdateWindowSurface}, q{SDL_Window* window}},
297 		{q{int}, q{SDL_UpdateWindowSurfaceRects}, q{SDL_Window* window, SDL_Rect* rects, int numRects}},
298 		{q{void}, q{SDL_SetWindowGrab}, q{SDL_Window* window, SDL_bool grabbed}},
299 		{q{SDL_bool}, q{SDL_GetWindowGrab}, q{SDL_Window* window}},
300 		{q{int}, q{SDL_SetWindowBrightness}, q{SDL_Window* window, float brightness}},
301 		{q{float}, q{SDL_GetWindowBrightness}, q{SDL_Window* window}},
302 		{q{int}, q{SDL_SetWindowGammaRamp}, q{SDL_Window* window, const(ushort)* red, const(ushort)* green, const(ushort)* blue}},
303 		{q{int}, q{SDL_GetWindowGammaRamp}, q{SDL_Window* window, ushort* red, ushort* green, ushort* blue}},
304 		{q{void}, q{SDL_DestroyWindow}, q{SDL_Window* window}},
305 		{q{SDL_bool}, q{SDL_IsScreenSaverEnabled}, q{}},
306 		{q{void}, q{SDL_EnableScreenSaver}, q{}},
307 		{q{void}, q{SDL_DisableScreenSaver}, q{}},
308 		{q{int}, q{SDL_GL_LoadLibrary}, q{const(char)* path}},
309 		{q{void*}, q{SDL_GL_GetProcAddress}, q{const(char)* proc}},
310 		{q{void}, q{SDL_GL_UnloadLibrary}, q{}},
311 		{q{SDL_bool}, q{SDL_GL_ExtensionSupported}, q{const(char)* extension}},
312 		{q{int}, q{SDL_GL_SetAttribute}, q{SDL_GLattr attr, int value}},
313 		{q{int}, q{SDL_GL_GetAttribute}, q{SDL_GLattr attr, int* value}},
314 		{q{SDL_GLContext}, q{SDL_GL_CreateContext}, q{SDL_Window* window}},
315 		{q{int}, q{SDL_GL_MakeCurrent}, q{SDL_Window* window, SDL_GLContext context}},
316 		{q{SDL_Window*}, q{SDL_GL_GetCurrentWindow}, q{}},
317 		{q{SDL_GLContext}, q{SDL_GL_GetCurrentContext}, q{}},
318 		{q{int}, q{SDL_GL_SetSwapInterval}, q{int interval}},
319 		{q{int}, q{SDL_GL_GetSwapInterval}, q{}},
320 		{q{void}, q{SDL_GL_SwapWindow}, q{SDL_Window* window}},
321 		{q{void}, q{SDL_GL_DeleteContext}, q{SDL_GLContext context}},
322 	];
323 	if(sdlSupport >= SDLSupport.v2_0_1){
324 		FnBind[] add = [
325 			{q{void}, q{SDL_GL_GetDrawableSize}, q{SDL_Window* window, int* w, int* h}},
326 		];
327 		ret ~= add;
328 	}
329 	if(sdlSupport >= SDLSupport.v2_0_2){
330 		FnBind[] add = [
331 			{q{void}, q{SDL_GL_ResetAttributes}, q{}},
332 		];
333 		ret ~= add;
334 	}
335 	if(sdlSupport >= SDLSupport.v2_0_4){
336 		FnBind[] add = [
337 			{q{int}, q{SDL_GetDisplayDPI}, q{int displayIndex, float* ddpi, float* hdpi, float* vdpi}},
338 			{q{SDL_Window*}, q{SDL_GetGrabbedWindow}, q{}},
339 			{q{int}, q{SDL_SetWindowHitTest}, q{SDL_Window* window, SDL_HitTest callback, void* callbackData}},
340 		];
341 		ret ~= add;
342 	}
343 	if(sdlSupport >= SDLSupport.v2_0_5){
344 		FnBind[] add = [
345 			{q{int}, q{SDL_GetDisplayUsableBounds}, q{int displayIndex, SDL_Rect* rect}},
346 			{q{int}, q{SDL_GetWindowBordersSize}, q{SDL_Window* window, int* top, int* left, int* bottom, int* right}},
347 			{q{int}, q{SDL_GetWindowOpacity}, q{SDL_Window* window, float* opacity}},
348 			{q{int}, q{SDL_SetWindowInputFocus}, q{SDL_Window* window}},
349 			{q{int}, q{SDL_SetWindowModalFor}, q{SDL_Window* modalWindow, SDL_Window* parentWindow}},
350 			{q{int}, q{SDL_SetWindowOpacity}, q{SDL_Window* window, float opacity}},
351 			{q{void}, q{SDL_SetWindowResizable}, q{SDL_Window* window, SDL_bool resizable}},
352 		];
353 		ret ~= add;
354 	}
355 	if(sdlSupport >= SDLSupport.v2_0_9){
356 		FnBind[] add = [
357 			{q{SDL_DisplayOrientation}, q{SDL_GetDisplayOrientation}, q{int displayIndex}},
358 		];
359 		ret ~= add;
360 	}
361 	if(sdlSupport >= SDLSupport.v2_0_16){
362 		FnBind[] add = [
363 			{q{int}, q{SDL_FlashWindow}, q{SDL_Window* window, SDL_FlashOperation operation}},
364 			{q{void}, q{SDL_SetWindowAlwaysOnTop}, q{SDL_Window* window, SDL_bool on_top}},
365 			{q{void}, q{SDL_SetWindowKeyboardGrab}, q{SDL_Window* window, SDL_bool grabbed}},
366 			{q{SDL_bool}, q{SDL_GetWindowKeyboardGrab}, q{SDL_Window * window}},
367 			{q{void}, q{SDL_SetWindowMouseGrab}, q{SDL_Window* window, SDL_bool grabbed}},
368 			{q{SDL_bool}, q{SDL_GetWindowMouseGrab}, q{SDL_Window* window}},
369 		];
370 		ret ~= add;
371 	}
372 	if(sdlSupport >= SDLSupport.v2_0_18){
373 		FnBind[] add = [
374 			{q{void*}, q{SDL_GetWindowICCProfile}, q{SDL_Window* window, size_t* size}},
375 			{q{int}, q{SDL_SetWindowMouseRect}, q{SDL_Window* window, const(SDL_Rect)* rect}},
376 			{q{const(SDL_Rect)*}, q{SDL_GetWindowMouseRect}, q{SDL_Window* window}},
377 		];
378 		ret ~= add;
379 	}
380 	if(sdlSupport >= SDLSupport.v2_24){
381 		FnBind[] add = [
382 			{q{int}, q{SDL_GetPointDisplayIndex}, q{const(SDL_Point)* point}},
383 			{q{int}, q{SDL_GetRectDisplayIndex}, q{const(SDL_Rect)* rect}},
384 		];
385 		ret ~= add;
386 	}
387 	if(sdlSupport >= SDLSupport.v2_26){
388 		FnBind[] add = [
389 			{q{void}, q{SDL_GetWindowSizeInPixels}, q{SDL_Window* window, int* w, int* h}},
390 		];
391 		ret ~= add;
392 	}
393 	if(sdlSupport >= SDLSupport.v2_28){
394 		FnBind[] add = [
395 			{q{SDL_bool}, q{SDL_HasWindowSurface}, q{SDL_Window* window}},
396 			{q{int}, q{SDL_DestroyWindowSurface}, q{SDL_Window* window}},
397 		];
398 		ret ~= add;
399 	}
400 	return ret;
401 }()));