1 /*
2 
3 Boost Software License - Version 1.0 - August 17th, 2003
4 
5 Permission is hereby granted, free of charge, to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use, reproduce, display, distribute,
8 execute, and transmit the Software, and to prepare derivative works of the
9 Software, and to permit third-parties to whom the Software is furnished to
10 do so, all subject to the following:
11 
12 The copyright notices in the Software and this entire statement, including
13 the above license grant, this restriction and the following disclaimer,
14 must be included in all copies of the Software, in whole or in part, and
15 all derivative works of the Software, unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.sdl2.internal.sdl_types;
29 
30 import core.stdc.config,
31        core.stdc.stdio;
32 import derelict.util.system;
33 
34 // SDL_version.h
35 struct SDL_version {
36     Uint8 major;
37     Uint8 minor;
38     Uint8 patch;
39 }
40 
41 enum : Uint8 {
42     SDL_MAJOR_VERSION = 2,
43     SDL_MINOR_VERSION = 0,
44     SDL_PATCHLEVEL = 5,
45 }
46 
47 @nogc nothrow pure {
48     void SDL_VERSION(SDL_version* x) {
49         x.major = SDL_MAJOR_VERSION;
50         x.minor = SDL_MINOR_VERSION;
51         x.patch = SDL_PATCHLEVEL;
52     }
53 
54     Uint32 SDL_VERSIONNUM(Uint8 X, Uint8 Y, Uint8 Z) {
55         return X*1000 + Y*100 + Z;
56     }
57 
58     Uint32 SDL_COMPILEDVERSION() {
59         return SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL);
60     }
61 
62     bool SDL_VERSION_ATLEAST(Uint8 X, Uint8 Y, Uint8 Z) {
63         return (SDL_COMPILEDVERSION() >= SDL_VERSIONNUM(X, Y, Z));
64     }
65 }
66 
67 // From SDL_stdinc.h
68 enum SDL_bool {
69     SDL_FALSE = 0,
70     SDL_TRUE = 1
71 }
72 mixin(MakeEnum!SDL_bool);
73 
74 alias Sint8 = byte;
75 alias Uint8 = ubyte;
76 alias Sint16 = short;
77 alias Uint16 = ushort;
78 alias Sint32 = int;
79 alias Uint32 = uint;
80 alias Sint64 = long;
81 alias Uint64 = ulong;
82 
83 @nogc nothrow pure
84 Uint32 SDL_FOURCC(char A, char B, char C, char D) {
85     return ((A << 0) | (B << 8) | (C << 16) | (D << 24));
86 }
87 
88 // SDL.h
89 enum : Uint32 {
90     SDL_INIT_TIMER = 0x00000001,
91     SDL_INIT_AUDIO = 0x00000010,
92     SDL_INIT_VIDEO = 0x00000020,
93     SDL_INIT_JOYSTICK = 0x00000200,
94     SDL_INIT_HAPTIC = 0x00001000,
95     SDL_INIT_GAMECONTROLLER = 0x00002000,
96     SDL_INIT_EVENTS = 0x00004000,
97     SDL_INIT_NOPARACHUTE = 0x00100000,
98     SDL_INIT_EVERYTHING =
99                 SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO |
100                 SDL_INIT_EVENTS | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC |
101                 SDL_INIT_GAMECONTROLLER
102 }
103 
104 // SDL_assert.h
105 enum SDL_AssertState : Uint32 {
106     SDL_ASSERTION_RETRY = 0,
107     SDL_ASSERTION_BREAK = 1,
108     SDL_ASSERTION_ABORT = 2,
109     SDL_ASSERTION_IGNORE = 3,
110     SDL_ASSERTION_ALWAYS_IGNORE = 4
111 }
112 mixin(MakeEnum!SDL_AssertState);
113 alias SDL_assert_state = SDL_AssertState;
114 
115 struct SDL_AssertData {
116     int always_ignore;
117     Uint32 trigger_count;
118     const(char) *condition;
119     const(char) *filename;
120     int linenum;
121     const(char) *function_;
122     const(SDL_AssertData) *next;
123 }
124 alias SDL_assert_data = SDL_AssertData;
125 
126 extern(C) nothrow alias SDL_AssertionHandler = SDL_AssertState function(const(SDL_AssertData)* data, void* userdata);
127 
128 // SDL_audio.h
129 enum SDL_AudioMask : Uint16 {
130     SDL_AUDIO_MASK_BITSIZE = 0xFF,
131     SDL_AUDIO_MASK_DATATYPE = 1<<8,
132     SDL_AUDIO_MASK_ENDIAN = 1<<12,
133     SDL_AUDIO_MASK_SIGNED = 1<<15,
134 }
135 mixin(MakeEnum!SDL_AudioMask);
136 
137 @nogc nothrow pure {
138     int SDL_AUDIO_BITSIZE(SDL_AudioFormat x) { return x & SDL_AUDIO_MASK_BITSIZE; }
139     int SDL_AUDIO_ISFLOAT(SDL_AudioFormat x) { return x & SDL_AUDIO_MASK_DATATYPE; }
140     int SDL_AUDIO_ISBIGENDIAN(SDL_AudioFormat x) { return x & SDL_AUDIO_MASK_ENDIAN; }
141     int SDL_AUDIO_ISSIGNED(SDL_AudioFormat x) { return x & SDL_AUDIO_MASK_SIGNED; }
142     int SDL_AUDIO_ISINT(SDL_AudioFormat x) { return !SDL_AUDIO_ISFLOAT(x); }
143     int SDL_AUDIO_ISLITTLEENDIAN(SDL_AudioFormat x) { return !SDL_AUDIO_ISBIGENDIAN(x); }
144     int SDL_AUDIO_ISUNSIGNED(SDL_AudioFormat x) { return !SDL_AUDIO_ISSIGNED(x); }
145 }
146 
147 enum SDL_AudioFormat : Uint16 {
148     AUDIO_U8 = 0x0008,
149     AUDIO_S8 = 0x8008,
150     AUDIO_U16LSB = 0x0010,
151     AUDIO_S16LSB = 0x8010,
152     AUDIO_U16MSB = 0x1010,
153     AUDIO_S16MSB = 0x9010,
154     AUDIO_U16 = AUDIO_U16LSB,
155     AUDIO_S16 = AUDIO_S16LSB,
156     AUDIO_S32LSB = 0x8020,
157     AUDIO_S32MSB = 0x9020,
158     AUDIO_S32 = AUDIO_S32LSB,
159     AUDIO_F32LSB = 0x8120,
160     AUDIO_F32MSB = 0x9120,
161     AUDIO_F32 = AUDIO_F32LSB,
162 }
163 mixin(MakeEnum!SDL_AudioFormat);
164 
165 version(LittleEndian) {
166     alias AUDIO_U16SYS = AUDIO_U16LSB;
167     alias AUDIO_S16SYS = AUDIO_S16LSB;
168     alias AUDIO_S32SYS = AUDIO_S32LSB;
169     alias AUDIO_F32SYS = AUDIO_F32LSB;
170 } else {
171     alias AUDIO_U16SYS = AUDIO_U16MSB;
172     alias AUDIO_S16SYS = AUDIO_S16MSB;
173     alias AUDIO_S32SYS = AUDIO_S32MSB;
174     alias AUDIO_F32SYS = AUDIO_F32MSB;
175 }
176 
177 enum {
178     SDL_AUDIO_ALLOW_FREQUENCY_CHANGE = 0x00000001,
179     SDL_AUDIO_ALLOW_FORMAT_CHANGE = 0x00000002,
180     SDL_AUDIO_ALLOW_CHANNELS_CHANGE = 0x00000004,
181     SDL_AUDIO_ALLOW_ANY_CHANGE = (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE),
182 }
183 
184 extern(C) nothrow alias SDL_AudioCallback = void function(void* userdata, Uint8* stream, int len);
185 struct SDL_AudioSpec {
186     int freq;
187     SDL_AudioFormat format;
188     Uint8 channels;
189     Uint8 silence;
190     Uint16 samples;
191     Uint16 padding;
192     Uint32 size;
193     SDL_AudioCallback callback;
194     void* userdata;
195 }
196 
197 extern(C) nothrow alias SDL_AudioFilter = void function(SDL_AudioCVT* cvt, SDL_AudioFormat format);
198 enum SDL_AUDIOCVT_MAX_FILTERS = 9;
199 
200 struct SDL_AudioCVT {
201     int needed;
202     SDL_AudioFormat src_format;
203     SDL_AudioFormat dst_format;
204     double rate_incr;
205     Uint8* buf;
206     int len;
207     int len_cvt;
208     int len_mult;
209     double len_ratio;
210     SDL_AudioFilter[SDL_AUDIOCVT_MAX_FILTERS + 1] filters;
211     int filter_index;
212 }
213 
214 alias Uint32 SDL_AudioDeviceID;
215 
216 enum SDL_AudioStatus {
217     SDL_AUDIO_STOPPED = 0,
218     SDL_AUDIO_PLAYING,
219     SDL_AUDIO_PAUSED,
220 }
221 mixin(MakeEnum!SDL_AudioStatus);
222 
223 enum SDL_MIX_MAXVOLUME = 128;
224 
225 // SDL_blendmode.h
226 enum SDL_BlendMode {
227     SDL_BLENDMODE_NONE = 0x00000000,
228     SDL_BLENDMODE_BLEND = 0x00000001,
229     SDL_BLENDMODE_ADD = 0x00000002,
230     SDL_BLENDMODE_MOD = 0x00000004,
231     SDL_BLENDMODE_INVALID = 0x7FFFFFFF,
232 }
233 mixin(MakeEnum!SDL_BlendMode);
234 
235 enum SDL_BlendOperation {
236     SDL_BLENDOPERATION_ADD = 0x1,
237     SDL_BLENDOPERATION_SUBTRACT = 0x2,
238     SDL_BLENDOPERATION_REV_SUBTRACT = 0x3,
239     SDL_BLENDOPERATION_MINIMUM = 0x4,
240     SDL_BLENDOPERATION_MAXIMUM = 0x5,
241 }
242 mixin(MakeEnum!SDL_BlendOperation);
243 
244 enum SDL_BlendFactor {
245     SDL_BLENDFACTOR_ZERO = 0x1,
246     SDL_BLENDFACTOR_ONE = 0x2,
247     SDL_BLENDFACTOR_SRC_COLOR = 0x3,
248     SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4,
249     SDL_BLENDFACTOR_SRC_ALPHA = 0x5,
250     SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6,
251     SDL_BLENDFACTOR_DST_COLOR = 0x7,
252     SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8,
253     SDL_BLENDFACTOR_DST_ALPHA = 0x9,
254     SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA,
255 }
256 mixin(MakeEnum!SDL_BlendFactor);
257 
258 // SDL_cpuinfo.h
259 enum  SDL_CACHELINE_SIZE = 128;
260 
261 // SDL_events.h
262 enum {
263     SDL_RELEASED = 0,
264     SDL_PRESSED = 1,
265 }
266 
267 enum SDL_EventType {
268     SDL_FIRSTEVENT = 0,
269     SDL_QUIT = 0x100,
270     SDL_APP_TERMINATING,
271     SDL_APP_LOWMEMORY,
272     SDL_APP_WILLENTERBACKGROUND,
273     SDL_APP_DIDENTERBACKGROUND,
274     SDL_APP_WILLENTERFOREGROUND,
275     SDL_APP_DIDENTERFOREGROUND,
276     SDL_WINDOWEVENT = 0x200,
277     SDL_SYSWMEVENT,
278     SDL_KEYDOWN = 0x300,
279     SDL_KEYUP,
280     SDL_TEXTEDITING,
281     SDL_TEXTINPUT,
282     SDL_KEYMAPCHANGED,
283     SDL_MOUSEMOTION = 0x400,
284     SDL_MOUSEBUTTONDOWN,
285     SDL_MOUSEBUTTONUP,
286     SDL_MOUSEWHEEL,
287     SDL_JOYAXISMOTION = 0x600,
288     SDL_JOYBALLMOTION,
289     SDL_JOYHATMOTION,
290     SDL_JOYBUTTONDOWN,
291     SDL_JOYBUTTONUP,
292     SDL_JOYDEVICEADDED,
293     SDL_JOYDEVICEREMOVED,
294     SDL_CONTROLLERAXISMOTION = 0x650,
295     SDL_CONTROLLERBUTTONDOWN,
296     SDL_CONTROLLERBUTTONUP,
297     SDL_CONTROLLERDEVICEADDED,
298     SDL_CONTROLLERDEVICEREMOVED,
299     SDL_CONTROLLERDEVICEREMAPPED,
300     SDL_FINGERDOWN = 0x700,
301     SDL_FINGERUP,
302     SDL_FINGERMOTION,
303     SDL_DOLLARGESTURE = 0x800,
304     SDL_DOLLARRECORD,
305     SDL_MULTIGESTURE,
306     SDL_CLIPBOARDUPDATE = 0x900,
307     SDL_DROPFILE = 0x1000,
308     SDL_DROPTEXT,
309     SDL_DROPBEGIN,
310     SDL_DROPCOMPLETE,
311     SDL_AUDIODEVICEADDED = 0x1100,
312     SDL_AUDIODEVICEREMOVED,
313     SDL_RENDER_TARGETS_RESET = 0x2000,
314     SDL_RENDER_DEVICE_RESET = 0x2001,
315     SDL_USEREVENT = 0x8000,
316     SDL_LASTEVENT = 0xFFFF
317 }
318 mixin(MakeEnum!SDL_EventType);
319 
320 struct SDL_CommonEvent {
321     SDL_EventType type;
322     Uint32 timestamp;
323 }
324 
325 struct SDL_WindowEvent {
326     SDL_EventType type;
327     Uint32 timestamp;
328     Uint32 windowID;
329     SDL_WindowEventID event;
330     Uint8 padding1;
331     Uint8 padding2;
332     Uint8 padding3;
333     Sint32 data1;
334     Sint32 data2;
335 }
336 
337 struct SDL_KeyboardEvent {
338     SDL_EventType type;
339     Uint32 timestamp;
340     Uint32 windowID;
341     Uint8 state;
342     Uint8 repeat;
343     Uint8 padding2;
344     Uint8 padding3;
345     SDL_Keysym keysym;
346 }
347 
348 enum SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;
349 struct SDL_TextEditingEvent {
350     SDL_EventType type;
351     Uint32 timestamp;
352     Uint32 windowID;
353     char[SDL_TEXTEDITINGEVENT_TEXT_SIZE] text;
354     Sint32 start;
355     Sint32 length;
356 }
357 
358 enum SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;
359 struct SDL_TextInputEvent {
360     SDL_EventType type;
361     Uint32 timestamp;
362     Uint32 windowID;
363     char[SDL_TEXTINPUTEVENT_TEXT_SIZE] text;
364 }
365 
366 struct SDL_MouseMotionEvent {
367     SDL_EventType type;
368     Uint32 timestamp;
369     Uint32 windowID;
370     Uint32 which;
371     Uint32 state;
372     Sint32 x;
373     Sint32 y;
374     Sint32 xrel;
375     Sint32 yrel;
376 }
377 
378 struct SDL_MouseButtonEvent {
379     SDL_EventType type;
380     Uint32 timestamp;
381     Uint32 windowID;
382     Uint32 which;
383     Uint8 button;
384     Uint8 state;
385     Uint8 clicks;
386     Uint8 padding1;
387     Sint32 x;
388     Sint32 y;
389 }
390 
391 struct SDL_MouseWheelEvent {
392     SDL_EventType type;
393     Uint32 timestamp;
394     Uint32 windowID;
395     Uint32 which;
396     Sint32 x;
397     Sint32 y;
398     Uint32 direction;
399 }
400 
401 struct SDL_JoyAxisEvent {
402     SDL_EventType type;
403     Uint32 timestamp;
404     SDL_JoystickID which;
405     Uint8 axis;
406     Uint8 padding1;
407     Uint8 padding2;
408     Uint8 padding3;
409     Sint16 value;
410     Uint16 padding4;
411 }
412 
413 struct SDL_JoyBallEvent {
414     SDL_EventType type;
415     Uint32 timestamp;
416     SDL_JoystickID which;
417     Uint8 ball;
418     Uint8 padding1;
419     Uint8 padding2;
420     Uint8 padding3;
421     Sint16 xrel;
422     Sint16 yrel;
423 }
424 
425 struct SDL_JoyHatEvent {
426     SDL_EventType type;
427     Uint32 timestamp;
428     SDL_JoystickID which;
429     Uint8 hat;
430     Uint8 value;
431     Uint8 padding1;
432     Uint8 padding2;
433 }
434 
435 struct SDL_JoyButtonEvent {
436     SDL_EventType type;
437     Uint32 timestamp;
438     SDL_JoystickID which;
439     Uint8 button;
440     Uint8 state;
441     Uint8 padding1;
442     Uint8 padding2;
443 }
444 
445 struct SDL_JoyDeviceEvent {
446     SDL_EventType type;
447     Uint32 timestamp;
448     Sint32 which;
449 }
450 
451 struct SDL_ControllerAxisEvent {
452     SDL_EventType type;
453     Uint32 timestamp;
454     SDL_JoystickID which;
455     Uint8 axis;
456     Uint8 padding1;
457     Uint8 padding2;
458     Uint8 padding3;
459     Sint16 value;
460     Uint16 padding4;
461 }
462 
463 struct SDL_ControllerButtonEvent {
464     SDL_EventType type;
465     Uint32 timestamp;
466     SDL_JoystickID which;
467     Uint8 button;
468     Uint8 state;
469     Uint8 padding1;
470     Uint8 padding2;
471 }
472 
473 struct SDL_ControllerDeviceEvent {
474     SDL_EventType type;
475     Uint32 timestamp;
476     Sint32 which;
477 }
478 
479 struct SDL_AudioDeviceEvent {
480     SDL_EventType type;
481     Uint32 timestamp;
482     Uint32 which;
483     Uint8 iscapture;
484     Uint8 padding1;
485     Uint8 padding2;
486     Uint8 padding3;
487 }
488 
489 struct SDL_TouchFingerEvent {
490     SDL_EventType type;
491     Uint32 timestamp;
492     SDL_TouchID touchId;
493     SDL_FingerID fingerId;
494     float x;
495     float y;
496     float dx;
497     float dy;
498     float pressure;
499 }
500 
501 struct SDL_MultiGestureEvent {
502     SDL_EventType type;
503     Uint32 timestamp;
504     SDL_TouchID touchId;
505     float dTheta;
506     float dDist;
507     float x;
508     float y;
509     Uint16 numFingers;
510     Uint16 padding;
511 }
512 
513 struct SDL_DollarGestureEvent {
514     SDL_EventType type;
515     Uint32 timestamp;
516     SDL_TouchID touchId;
517     SDL_GestureID gestureId;
518     Uint32 numFingers;
519     float error;
520     float x;
521     float y;
522 }
523 
524 struct SDL_DropEvent {
525     SDL_EventType type;
526     Uint32 timestamp;
527     char* file;
528     Uint32 windowID;    // Added in SDL 2.0.5!
529 }
530 
531 struct SDL_QuitEvent {
532     SDL_EventType type;
533     Uint32 timestamp;
534 }
535 
536 struct SDL_OSEvent {
537     SDL_EventType type;
538     Uint32 timestamp;
539 }
540 
541 struct SDL_UserEvent {
542     SDL_EventType type;
543     Uint32 timestamp;
544     Uint32 windowID;
545     Sint32 code;
546     void* data1;
547     void* data2;
548 }
549 
550 struct SDL_SysWMEvent {
551     SDL_EventType type;
552     Uint32 timestamp;
553     SDL_SysWMmsg* msg;
554 }
555 
556 union SDL_Event {
557     SDL_EventType type;
558     SDL_CommonEvent common;
559     SDL_WindowEvent window;
560     SDL_KeyboardEvent key;
561     SDL_TextEditingEvent edit;
562     SDL_TextInputEvent text;
563     SDL_MouseMotionEvent motion;
564     SDL_MouseButtonEvent button;
565     SDL_MouseWheelEvent wheel;
566     SDL_JoyAxisEvent jaxis;
567     SDL_JoyBallEvent jball;
568     SDL_JoyHatEvent jhat;
569     SDL_JoyButtonEvent jbutton;
570     SDL_JoyDeviceEvent jdevice;
571     SDL_ControllerAxisEvent caxis;
572     SDL_ControllerButtonEvent cbutton;
573     SDL_ControllerDeviceEvent cdevice;
574     SDL_AudioDeviceEvent adevice;
575     SDL_QuitEvent quit;
576     SDL_UserEvent user;
577     SDL_SysWMEvent syswm;
578     SDL_TouchFingerEvent tfinger;
579     SDL_MultiGestureEvent mgesture;
580     SDL_DollarGestureEvent dgesture;
581     SDL_DropEvent drop;
582 
583     Uint8[56] padding;
584 }
585 
586 enum SDL_eventaction {
587     SDL_ADDEVENT,
588     SDL_PEEKEVENT,
589     SDL_GETEVENT
590 }
591 mixin(MakeEnum!SDL_eventaction);
592 
593 extern(C) nothrow alias SDL_EventFilter = int function(void* userdata, SDL_Event* event);
594 
595 enum {
596     SDL_QUERY = -1,
597     SDL_IGNORE = 0,
598     SDL_DISABLE = 0,
599     SDL_ENABLE = 1,
600 }
601 
602 // SDL_gamecontroller.h
603 struct SDL_GameController;
604 enum SDL_GameControllerBindType {
605     SDL_CONTROLLER_BINDTYPE_NONE = 0,
606     SDL_CONTROLLER_BINDTYPE_BUTTON,
607     SDL_CONTROLLER_BINDTYPE_AXIS,
608     SDL_CONTROLLER_BINDTYPE_HAT,
609 }
610 mixin(MakeEnum!SDL_GameControllerBindType);
611 
612 struct SDL_GameControllerButtonBind {
613     SDL_GameControllerBindType bindType;
614     union value {
615         int button;
616         int axis;
617         struct hat {
618             int hat;
619             int hat_mask;
620         }
621     }
622     alias button = value.button;
623     alias axis = value.axis;
624     alias hat = value.hat;
625 }
626 
627 enum SDL_GameControllerAxis {
628     SDL_CONTROLLER_AXIS_INVALID = -1,
629     SDL_CONTROLLER_AXIS_LEFTX,
630     SDL_CONTROLLER_AXIS_LEFTY,
631     SDL_CONTROLLER_AXIS_RIGHTX,
632     SDL_CONTROLLER_AXIS_RIGHTY,
633     SDL_CONTROLLER_AXIS_TRIGGERLEFT,
634     SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
635     SDL_CONTROLLER_AXIS_MAX
636 }
637 mixin(MakeEnum!SDL_GameControllerAxis);
638 
639 enum SDL_GameControllerButton {
640     SDL_CONTROLLER_BUTTON_INVALID = -1,
641     SDL_CONTROLLER_BUTTON_A,
642     SDL_CONTROLLER_BUTTON_B,
643     SDL_CONTROLLER_BUTTON_X,
644     SDL_CONTROLLER_BUTTON_Y,
645     SDL_CONTROLLER_BUTTON_BACK,
646     SDL_CONTROLLER_BUTTON_GUIDE,
647     SDL_CONTROLLER_BUTTON_START,
648     SDL_CONTROLLER_BUTTON_LEFTSTICK,
649     SDL_CONTROLLER_BUTTON_RIGHTSTICK,
650     SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
651     SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
652     SDL_CONTROLLER_BUTTON_DPAD_UP,
653     SDL_CONTROLLER_BUTTON_DPAD_DOWN,
654     SDL_CONTROLLER_BUTTON_DPAD_LEFT,
655     SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
656     SDL_CONTROLLER_BUTTON_MAX
657 }
658 mixin(MakeEnum!SDL_GameControllerButton);
659 
660 // SDL_gesture.h
661 alias SDL_GestureID = Sint64;
662 
663 // SDL_haptic.h
664 struct SDL_Haptic;
665 
666 enum SDL_D_HapticFlags : Uint16 {
667     SDL_HAPTIC_CONSTANT = 1u<<0,
668     SDL_HAPTIC_SINE = 1u<<1,
669     SDL_HAPTIC_LEFTRIGHT = 1u<<2,
670     SDL_HAPTIC_TRIANGLE = 1u<<3,
671     SDL_HAPTIC_SAWTOOTHUP = 1u<<4,
672     SDL_HAPTIC_SAWTOOTHDOWN = 1u<<5,
673     SDL_HAPTIC_RAMP = 1u<<6,
674     SDL_HAPTIC_SPRING = 1u<<7,
675     SDL_HAPTIC_DAMPER = 1u<<8,
676     SDL_HAPTIC_INERTIA = 1u<<9,
677     SDL_HAPTIC_FRICTION = 1u<<10,
678     SDL_HAPTIC_CUSTOM = 1u<<11,
679     SDL_HAPTIC_GAIN = 1u<<12,
680     SDL_HAPTIC_AUTOCENTER = 1u<<13,
681     SDL_HAPTIC_STATUS = 1u<<14,
682     SDL_HAPTIC_PAUSE = 1u<<15,
683     SDL_HAPTIC_POLAR = 0,
684     SDL_HAPTIC_CARTESIAN = 1,
685     SDL_HAPTIC_SPHERICAL = 2,
686 }
687 mixin(MakeEnum!SDL_D_HapticFlags);
688 
689 enum SDL_HAPTIC_INFINITY = 4294967295U;
690 
691 struct SDL_HapticDirection {
692     Uint8 type;
693     Sint32[3] dir;
694 }
695 
696 struct SDL_HapticConstant {
697     SDL_D_HapticFlags type;
698     SDL_HapticDirection direction;
699     Uint32 length;
700     Uint16 delay;
701     Uint16 button;
702     Uint16 interval;
703     Sint16 level;
704     Uint16 attack_length;
705     Uint16 attack_level;
706     Uint16 fade_length;
707     Uint16 fade_level;
708 }
709 
710 struct SDL_HapticPeriodic {
711     SDL_D_HapticFlags type;
712     SDL_HapticDirection direction;
713     Uint32 length;
714     Uint32 delay;
715     Uint16 button;
716     Uint16 interval;
717     Uint16 period;
718     Sint16 magnitude;
719     Sint16 offset;
720     Uint16 phase;
721     Uint16 attack_length;
722     Uint16 attack_level;
723     Uint16 fade_length;
724     Uint16 fade_level;
725 }
726 
727 struct SDL_HapticCondition {
728     SDL_D_HapticFlags type;
729     SDL_HapticDirection direciton;
730     Uint32 length;
731     Uint16 delay;
732     Uint16 button;
733     Uint16 interval;
734     Uint16[3] right_sat;
735     Uint16[3] left_sat;
736     Sint16[3] right_coeff;
737     Sint16[3] left_coeff;
738     Uint16[3] deadband;
739     Uint16[3] center;
740 }
741 
742 struct SDL_HapticRamp {
743     SDL_D_HapticFlags type;
744     SDL_HapticDirection direction;
745     Uint32 length;
746     Uint16 delay;
747     Uint16 button;
748     Uint16 interval;
749     Sint16 start;
750     Sint16 end;
751     Uint16 attack_length;
752     Uint16 attack_level;
753     Uint16 fade_length;
754     Uint16 fade_level;
755 }
756 
757 struct SDL_HapticLeftRight {
758     SDL_D_HapticFlags type;
759     Uint32 length;
760     Uint16 large_magnitude;
761     Uint16 small_magnitude;
762 }
763 
764 struct SDL_HapticCustom {
765     SDL_D_HapticFlags type;
766     SDL_HapticDirection direction;
767     Uint32 length;
768     Uint16 delay;
769     Uint16 button;
770     Uint16 interval;
771     Uint8 channels;
772     Uint16 period;
773     Uint16 samples;
774     Uint16* data;
775     Uint16 attack_length;
776     Uint16 attack_level;
777     Uint16 fade_length;
778     Uint16 fade_level;
779 }
780 
781 union SDL_HapticEffect {
782     SDL_D_HapticFlags type;
783     SDL_HapticConstant constant;
784     SDL_HapticPeriodic periodic;
785     SDL_HapticCondition condition;
786     SDL_HapticRamp ramp;
787     SDL_HapticLeftRight leftright;
788     SDL_HapticCustom custom;
789 }
790 
791 // SDL_hints.h
792 enum : string
793 {
794     SDL_HINT_FRAMEBUFFER_ACCELERATION = "SDL_FRAMEBUFFER_ACCELERATION",
795     SDL_HINT_RENDER_DRIVER = "SDL_RENDER_DRIVER",
796     SDL_HINT_RENDER_OPENGL_SHADERS = "SDL_RENDER_OPENGL_SHADERS",
797     SDL_HINT_RENDER_DIRECT3D_THREADSAFE = "SDL_RENDER_DIRECT3D_THREADSAFE",
798     SDL_HINT_RENDER_DIRECT3D11_DEBUG = "SDL_RENDER_DIRECT3D11_DEBUG",
799     SDL_HINT_RENDER_LOGICAL_SIZE_MODE = "SDL_RENDER_LOGICAL_SIZE_MODE",
800     SDL_HINT_RENDER_SCALE_QUALITY = "SDL_RENDER_SCALE_QUALITY",
801     SDL_HINT_RENDER_VSYNC = "SDL_RENDER_VSYNC",
802     SDL_HINT_VIDEO_ALLOW_SCREENSAVER = "SDL_VIDEO_ALLOW_SCREENSAVER",
803     SDL_HINT_VIDEO_X11_XVIDMODE = "SDL_VIDEO_X11_XVIDMODE",
804     SDL_HINT_VIDEO_X11_XINERAMA = "SDL_VIDEO_X11_XINERAMA",
805     SDL_HINT_VIDEO_X11_XRANDR = "SDL_VIDEO_X11_XRANDR",
806     SDL_HINT_VIDEO_X11_NET_WM_PING = "SDL_VIDEO_X11_NET_WM_PING",
807     SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN = "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN",
808     SDL_HINT_WINDOWS_INTRESOURCE_ICON = "SDL_WINDOWS_INTRESOURCE_ICON",
809     SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL = "SDL_WINDOWS_INTRESOURCE_ICON_SMALL",
810     SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP = "SDL_WINDOWS_ENABLE_MESSAGELOOP",
811     SDL_HINT_GRAB_KEYBOARD = "SDL_GRAB_KEYBOARD",
812     SDL_HINT_MOUSE_NORMAL_SPEED_SCALE = "SDL_MOUSE_NORMAL_SPEED_SCALE",
813     SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE = "SDL_MOUSE_RELATIVE_SPEED_SCALE",
814     SDL_HINT_MOUSE_RELATIVE_MODE_WARP = "SDL_MOUSE_RELATIVE_MODE_WARP",
815     SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH = "SDL_MOUSE_FOCUS_CLICKTHROUGH",
816     SDL_HINT_TOUCH_MOUSE_EVENTS = "SDL_TOUCH_MOUSE_EVENTS",
817     SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS = "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS",
818     SDL_HINT_IDLE_TIMER_DISABLED = "SDL_IOS_IDLE_TIMER_DISABLED",
819     SDL_HINT_ORIENTATIONS = "SDL_IOS_ORIENTATIONS",
820     SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS = "SDL_APPLE_TV_CONTROLLER_UI_EVENTS",
821     SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION = "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION",
822     SDL_HINT_ACCELEROMETER_AS_JOYSTICK = "SDL_ACCELEROMETER_AS_JOYSTICK",
823     SDL_HINT_XINPUT_ENABLED = "SDL_XINPUT_ENABLED",
824     SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING = "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING",
825     SDL_HINT_GAMECONTROLLERCONFIG = "SDL_GAMECONTROLLERCONFIG",
826     SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES = "SDL_GAMECONTROLLER_IGNORE_DEVICES",
827     SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT = "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT",
828     SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS = "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS",
829     SDL_HINT_ALLOW_TOPMOST = "SDL_ALLOW_TOPMOST",
830     SDL_HINT_TIMER_RESOLUTION = "SDL_TIMER_RESOLUTION",
831     SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION = "SDL_QTWAYLAND_CONTENT_ORIENTATION",
832     SDL_HINT_QTWAYLAND_WINDOW_FLAGS = "SDL_QTWAYLAND_WINDOW_FLAGS",
833     SDL_HINT_THREAD_STACK_SIZE = "SDL_THREAD_STACK_SIZE",
834     SDL_HINT_VIDEO_HIGHDPI_DISABLED = "SDL_VIDEO_HIGHDPI_DISABLED",
835     SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK = "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK",
836     SDL_HINT_VIDEO_WIN_D3DCOMPILER = "SDL_VIDEO_WIN_D3DCOMPILER",
837     SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT = "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT",
838     SDL_HINT_WINRT_PRIVACY_POLICY_URL = "SDL_WINRT_PRIVACY_POLICY_URL",
839     SDL_HINT_WINRT_PRIVACY_POLICY_LABEL = "SDL_WINRT_PRIVACY_POLICY_LABEL",
840     SDL_HINT_WINRT_HANDLE_BACK_BUTTON = "SDL_WINRT_HANDLE_BACK_BUTTON",
841     SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES = "SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES",
842     SDL_HINT_MAC_BACKGROUND_APP = "SDL_MAC_BACKGROUND_APP",
843     SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION = "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION",
844     SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION = "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION",
845     SDL_HINT_IME_INTERNAL_EDITING = "SDL_IME_INTERNAL_EDITING",
846     SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH = "SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH",
847     SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT = "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT",
848     SDL_HINT_NO_SIGNAL_HANDLERS = "SDL_NO_SIGNAL_HANDLERS",
849     SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 = "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4",
850     SDL_HINT_BMP_SAVE_LEGACY_FORMAT = "SDL_BMP_SAVE_LEGACY_FORMAT",
851     SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING = "SDL_WINDOWS_DISABLE_THREAD_NAMING",
852     SDL_HINT_RPI_VIDEO_LAYER = "SDL_RPI_VIDEO_LAYER",
853     SDL_HINT_OPENGL_ES_DRIVER = "SDL_OPENGL_ES_DRIVER",
854     SDL_HINT_AUDIO_RESAMPLING_MODE = "SDL_AUDIO_RESAMPLING_MODE",
855 }
856 
857 enum SDL_HintPriority {
858     SDL_HINT_DEFAULT,
859     SDL_HINT_NORMAL,
860     SDL_HINT_OVERRIDE,
861 }
862 mixin(MakeEnum!SDL_HintPriority);
863 
864 extern(C) nothrow alias SDL_HintCallback = void function(void*, const(char)*, const(char)*);
865 
866 // SDL_joystick.h
867 struct SDL_Joystick;
868 
869 struct SDL_JoystickGUID {
870     Uint8[16] data;
871 }
872 
873 alias SDL_JoystickID = Sint32;
874 
875 enum SDL_JoystickType {
876     SDL_JOYSTICK_TYPE_UNKNOWN,
877     SDL_JOYSTICK_TYPE_GAMECONTROLLER,
878     SDL_JOYSTICK_TYPE_WHEEL,
879     SDL_JOYSTICK_TYPE_ARCADE_STICK,
880     SDL_JOYSTICK_TYPE_FLIGHT_STICK,
881     SDL_JOYSTICK_TYPE_DANCE_PAD,
882     SDL_JOYSTICK_TYPE_GUITAR,
883     SDL_JOYSTICK_TYPE_DRUM_KIT,
884     SDL_JOYSTICK_TYPE_ARCADE_PAD,
885     SDL_JOYSTICK_TYPE_THROTTLE,
886 }
887 mixin(MakeEnum!SDL_JoystickType);
888 
889 enum SDL_JoystickPowerLevel {
890     SDL_JOYSTICK_POWER_UNKNOWN = -1,
891     SDL_JOYSTICK_POWER_EMPTY,
892     SDL_JOYSTICK_POWER_LOW,
893     SDL_JOYSTICK_POWER_MEDIUM,
894     SDL_JOYSTICK_POWER_FULL,
895     SDL_JOYSTICK_POWER_WIRED,
896     SDL_JOYSTICK_POWER_MAX
897 }
898 mixin(MakeEnum!SDL_JoystickPowerLevel);
899 
900 enum {
901     SDL_JOYSTICK_AXIS_MAX = 32767,
902     SDL_JOYSTICK_AXIS_MIN = -32768,
903 }
904 
905 enum : Uint8 {
906     SDL_HAT_CENTERED = 0x00,
907     SDL_HAT_UP = 0x01,
908     SDL_HAT_RIGHT = 0x02,
909     SDL_HAT_DOWN = 0x04,
910     SDL_HAT_LEFT = 0x08,
911     SDL_HAT_RIGHTUP = (SDL_HAT_RIGHT|SDL_HAT_UP),
912     SDL_HAT_RIGHTDOWN = (SDL_HAT_RIGHT|SDL_HAT_DOWN),
913     SDL_HAT_LEFTUP = (SDL_HAT_LEFT|SDL_HAT_UP),
914     SDL_HAT_LEFTDOWN = (SDL_HAT_LEFT|SDL_HAT_DOWN),
915 }
916 
917 // SDL_keyboard.h
918 struct SDL_Keysym {
919     SDL_Scancode scancode;
920     SDL_Keycode sym;
921     Uint16 mod;
922     Uint32 unicode;
923 }
924 
925 // SDL_messagebox.h
926 enum SDL_MessageBoxFlags {
927     SDL_MESSAGEBOX_ERROR = 0x00000010,
928     SDL_MESSAGEBOX_WARNING = 0x00000020,
929     SDL_MESSAGEBOX_INFORMATION = 0x00000040,
930 }
931 mixin(MakeEnum!SDL_MessageBoxFlags);
932 
933 enum SDL_MessageBoxButtonFlags {
934     SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001,
935     SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002,
936 }
937 mixin(MakeEnum!SDL_MessageBoxButtonFlags);
938 
939 struct SDL_MessageBoxButtonData {
940     Uint32 flags;
941     int buttonid;
942     const(char)* text;
943 }
944 
945 struct SDL_MessageBoxColor {
946     Uint8 r, g, b;
947 }
948 
949 enum SDL_MessageBoxColorType {
950     SDL_MESSAGEBOX_COLOR_BACKGROUND,
951     SDL_MESSAGEBOX_COLOR_TEXT,
952     SDL_MESSAGEBOX_COLOR_BUTTON_BORDER,
953     SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,
954     SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,
955     SDL_MESSAGEBOX_COLOR_MAX,
956 }
957 mixin(MakeEnum!SDL_MessageBoxColorType);
958 
959 struct SDL_MessageBoxColorScheme {
960     SDL_MessageBoxColor[SDL_MESSAGEBOX_COLOR_MAX] colors;
961 }
962 
963 struct SDL_MessageBoxData {
964     Uint32 flags;
965     SDL_Window* window;
966     const(char)* title;
967     const(char)* message;
968     int numbuttons;
969     const(SDL_MessageBoxButtonData)* buttons;
970     const(SDL_MessageBoxColorScheme)* colorScheme;
971 }
972 
973 // SDL_scancode.h
974 enum SDL_Scancode {
975     SDL_SCANCODE_UNKNOWN = 0,
976 
977     SDL_SCANCODE_A = 4,
978     SDL_SCANCODE_B = 5,
979     SDL_SCANCODE_C = 6,
980     SDL_SCANCODE_D = 7,
981     SDL_SCANCODE_E = 8,
982     SDL_SCANCODE_F = 9,
983     SDL_SCANCODE_G = 10,
984     SDL_SCANCODE_H = 11,
985     SDL_SCANCODE_I = 12,
986     SDL_SCANCODE_J = 13,
987     SDL_SCANCODE_K = 14,
988     SDL_SCANCODE_L = 15,
989     SDL_SCANCODE_M = 16,
990     SDL_SCANCODE_N = 17,
991     SDL_SCANCODE_O = 18,
992     SDL_SCANCODE_P = 19,
993     SDL_SCANCODE_Q = 20,
994     SDL_SCANCODE_R = 21,
995     SDL_SCANCODE_S = 22,
996     SDL_SCANCODE_T = 23,
997     SDL_SCANCODE_U = 24,
998     SDL_SCANCODE_V = 25,
999     SDL_SCANCODE_W = 26,
1000     SDL_SCANCODE_X = 27,
1001     SDL_SCANCODE_Y = 28,
1002     SDL_SCANCODE_Z = 29,
1003 
1004     SDL_SCANCODE_1 = 30,
1005     SDL_SCANCODE_2 = 31,
1006     SDL_SCANCODE_3 = 32,
1007     SDL_SCANCODE_4 = 33,
1008     SDL_SCANCODE_5 = 34,
1009     SDL_SCANCODE_6 = 35,
1010     SDL_SCANCODE_7 = 36,
1011     SDL_SCANCODE_8 = 37,
1012     SDL_SCANCODE_9 = 38,
1013     SDL_SCANCODE_0 = 39,
1014 
1015     SDL_SCANCODE_RETURN = 40,
1016     SDL_SCANCODE_ESCAPE = 41,
1017     SDL_SCANCODE_BACKSPACE = 42,
1018     SDL_SCANCODE_TAB = 43,
1019     SDL_SCANCODE_SPACE = 44,
1020 
1021     SDL_SCANCODE_MINUS = 45,
1022     SDL_SCANCODE_EQUALS = 46,
1023     SDL_SCANCODE_LEFTBRACKET = 47,
1024     SDL_SCANCODE_RIGHTBRACKET = 48,
1025     SDL_SCANCODE_BACKSLASH = 49,
1026     SDL_SCANCODE_NONUSHASH = 50,
1027     SDL_SCANCODE_SEMICOLON = 51,
1028     SDL_SCANCODE_APOSTROPHE = 52,
1029     SDL_SCANCODE_GRAVE = 53,
1030     SDL_SCANCODE_COMMA = 54,
1031     SDL_SCANCODE_PERIOD = 55,
1032     SDL_SCANCODE_SLASH = 56,
1033 
1034     SDL_SCANCODE_CAPSLOCK = 57,
1035 
1036     SDL_SCANCODE_F1 = 58,
1037     SDL_SCANCODE_F2 = 59,
1038     SDL_SCANCODE_F3 = 60,
1039     SDL_SCANCODE_F4 = 61,
1040     SDL_SCANCODE_F5 = 62,
1041     SDL_SCANCODE_F6 = 63,
1042     SDL_SCANCODE_F7 = 64,
1043     SDL_SCANCODE_F8 = 65,
1044     SDL_SCANCODE_F9 = 66,
1045     SDL_SCANCODE_F10 = 67,
1046     SDL_SCANCODE_F11 = 68,
1047     SDL_SCANCODE_F12 = 69,
1048 
1049     SDL_SCANCODE_PRINTSCREEN = 70,
1050     SDL_SCANCODE_SCROLLLOCK = 71,
1051     SDL_SCANCODE_PAUSE = 72,
1052     SDL_SCANCODE_INSERT = 73,
1053     SDL_SCANCODE_HOME = 74,
1054     SDL_SCANCODE_PAGEUP = 75,
1055     SDL_SCANCODE_DELETE = 76,
1056     SDL_SCANCODE_END = 77,
1057     SDL_SCANCODE_PAGEDOWN = 78,
1058     SDL_SCANCODE_RIGHT = 79,
1059     SDL_SCANCODE_LEFT = 80,
1060     SDL_SCANCODE_DOWN = 81,
1061     SDL_SCANCODE_UP = 82,
1062 
1063     SDL_SCANCODE_NUMLOCKCLEAR = 83,
1064     SDL_SCANCODE_KP_DIVIDE = 84,
1065     SDL_SCANCODE_KP_MULTIPLY = 85,
1066     SDL_SCANCODE_KP_MINUS = 86,
1067     SDL_SCANCODE_KP_PLUS = 87,
1068     SDL_SCANCODE_KP_ENTER = 88,
1069     SDL_SCANCODE_KP_1 = 89,
1070     SDL_SCANCODE_KP_2 = 90,
1071     SDL_SCANCODE_KP_3 = 91,
1072     SDL_SCANCODE_KP_4 = 92,
1073     SDL_SCANCODE_KP_5 = 93,
1074     SDL_SCANCODE_KP_6 = 94,
1075     SDL_SCANCODE_KP_7 = 95,
1076     SDL_SCANCODE_KP_8 = 96,
1077     SDL_SCANCODE_KP_9 = 97,
1078     SDL_SCANCODE_KP_0 = 98,
1079     SDL_SCANCODE_KP_PERIOD = 99,
1080 
1081     SDL_SCANCODE_NONUSBACKSLASH = 100,
1082     SDL_SCANCODE_APPLICATION = 101,
1083     SDL_SCANCODE_POWER = 102,
1084     SDL_SCANCODE_KP_EQUALS = 103,
1085     SDL_SCANCODE_F13 = 104,
1086     SDL_SCANCODE_F14 = 105,
1087     SDL_SCANCODE_F15 = 106,
1088     SDL_SCANCODE_F16 = 107,
1089     SDL_SCANCODE_F17 = 108,
1090     SDL_SCANCODE_F18 = 109,
1091     SDL_SCANCODE_F19 = 110,
1092     SDL_SCANCODE_F20 = 111,
1093     SDL_SCANCODE_F21 = 112,
1094     SDL_SCANCODE_F22 = 113,
1095     SDL_SCANCODE_F23 = 114,
1096     SDL_SCANCODE_F24 = 115,
1097     SDL_SCANCODE_EXECUTE = 116,
1098     SDL_SCANCODE_HELP = 117,
1099     SDL_SCANCODE_MENU = 118,
1100     SDL_SCANCODE_SELECT = 119,
1101     SDL_SCANCODE_STOP = 120,
1102     SDL_SCANCODE_AGAIN = 121,
1103     SDL_SCANCODE_UNDO = 122,
1104     SDL_SCANCODE_CUT = 123,
1105     SDL_SCANCODE_COPY = 124,
1106     SDL_SCANCODE_PASTE = 125,
1107     SDL_SCANCODE_FIND = 126,
1108     SDL_SCANCODE_MUTE = 127,
1109     SDL_SCANCODE_VOLUMEUP = 128,
1110     SDL_SCANCODE_VOLUMEDOWN = 129,
1111     SDL_SCANCODE_KP_COMMA = 133,
1112     SDL_SCANCODE_KP_EQUALSAS400 = 134,
1113 
1114     SDL_SCANCODE_INTERNATIONAL1 = 135,
1115     SDL_SCANCODE_INTERNATIONAL2 = 136,
1116     SDL_SCANCODE_INTERNATIONAL3 = 137,
1117     SDL_SCANCODE_INTERNATIONAL4 = 138,
1118     SDL_SCANCODE_INTERNATIONAL5 = 139,
1119     SDL_SCANCODE_INTERNATIONAL6 = 140,
1120     SDL_SCANCODE_INTERNATIONAL7 = 141,
1121     SDL_SCANCODE_INTERNATIONAL8 = 142,
1122     SDL_SCANCODE_INTERNATIONAL9 = 143,
1123     SDL_SCANCODE_LANG1 = 144,
1124     SDL_SCANCODE_LANG2 = 145,
1125     SDL_SCANCODE_LANG3 = 146,
1126     SDL_SCANCODE_LANG4 = 147,
1127     SDL_SCANCODE_LANG5 = 148,
1128     SDL_SCANCODE_LANG6 = 149,
1129     SDL_SCANCODE_LANG7 = 150,
1130     SDL_SCANCODE_LANG8 = 151,
1131     SDL_SCANCODE_LANG9 = 152,
1132 
1133     SDL_SCANCODE_ALTERASE = 153,
1134     SDL_SCANCODE_SYSREQ = 154,
1135     SDL_SCANCODE_CANCEL = 155,
1136     SDL_SCANCODE_CLEAR = 156,
1137     SDL_SCANCODE_PRIOR = 157,
1138     SDL_SCANCODE_RETURN2 = 158,
1139     SDL_SCANCODE_SEPARATOR = 159,
1140     SDL_SCANCODE_OUT = 160,
1141     SDL_SCANCODE_OPER = 161,
1142     SDL_SCANCODE_CLEARAGAIN = 162,
1143     SDL_SCANCODE_CRSEL = 163,
1144     SDL_SCANCODE_EXSEL = 164,
1145 
1146     SDL_SCANCODE_KP_00 = 176,
1147     SDL_SCANCODE_KP_000 = 177,
1148     SDL_SCANCODE_THOUSANDSSEPARATOR = 178,
1149     SDL_SCANCODE_DECIMALSEPARATOR = 179,
1150     SDL_SCANCODE_CURRENCYUNIT = 180,
1151     SDL_SCANCODE_CURRENCYSUBUNIT = 181,
1152     SDL_SCANCODE_KP_LEFTPAREN = 182,
1153     SDL_SCANCODE_KP_RIGHTPAREN = 183,
1154     SDL_SCANCODE_KP_LEFTBRACE = 184,
1155     SDL_SCANCODE_KP_RIGHTBRACE = 185,
1156     SDL_SCANCODE_KP_TAB = 186,
1157     SDL_SCANCODE_KP_BACKSPACE = 187,
1158     SDL_SCANCODE_KP_A = 188,
1159     SDL_SCANCODE_KP_B = 189,
1160     SDL_SCANCODE_KP_C = 190,
1161     SDL_SCANCODE_KP_D = 191,
1162     SDL_SCANCODE_KP_E = 192,
1163     SDL_SCANCODE_KP_F = 193,
1164     SDL_SCANCODE_KP_XOR = 194,
1165     SDL_SCANCODE_KP_POWER = 195,
1166     SDL_SCANCODE_KP_PERCENT = 196,
1167     SDL_SCANCODE_KP_LESS = 197,
1168     SDL_SCANCODE_KP_GREATER = 198,
1169     SDL_SCANCODE_KP_AMPERSAND = 199,
1170     SDL_SCANCODE_KP_DBLAMPERSAND = 200,
1171     SDL_SCANCODE_KP_VERTICALBAR = 201,
1172     SDL_SCANCODE_KP_DBLVERTICALBAR = 202,
1173     SDL_SCANCODE_KP_COLON = 203,
1174     SDL_SCANCODE_KP_HASH = 204,
1175     SDL_SCANCODE_KP_SPACE = 205,
1176     SDL_SCANCODE_KP_AT = 206,
1177     SDL_SCANCODE_KP_EXCLAM = 207,
1178     SDL_SCANCODE_KP_MEMSTORE = 208,
1179     SDL_SCANCODE_KP_MEMRECALL = 209,
1180     SDL_SCANCODE_KP_MEMCLEAR = 210,
1181     SDL_SCANCODE_KP_MEMADD = 211,
1182     SDL_SCANCODE_KP_MEMSUBTRACT = 212,
1183     SDL_SCANCODE_KP_MEMMULTIPLY = 213,
1184     SDL_SCANCODE_KP_MEMDIVIDE = 214,
1185     SDL_SCANCODE_KP_PLUSMINUS = 215,
1186     SDL_SCANCODE_KP_CLEAR = 216,
1187     SDL_SCANCODE_KP_CLEARENTRY = 217,
1188     SDL_SCANCODE_KP_BINARY = 218,
1189     SDL_SCANCODE_KP_OCTAL = 219,
1190     SDL_SCANCODE_KP_DECIMAL = 220,
1191     SDL_SCANCODE_KP_HEXADECIMAL = 221,
1192 
1193     SDL_SCANCODE_LCTRL = 224,
1194     SDL_SCANCODE_LSHIFT = 225,
1195     SDL_SCANCODE_LALT = 226,
1196     SDL_SCANCODE_LGUI = 227,
1197     SDL_SCANCODE_RCTRL = 228,
1198     SDL_SCANCODE_RSHIFT = 229,
1199     SDL_SCANCODE_RALT = 230,
1200     SDL_SCANCODE_RGUI = 231,
1201 
1202     SDL_SCANCODE_MODE = 257,
1203 
1204     SDL_SCANCODE_AUDIONEXT = 258,
1205     SDL_SCANCODE_AUDIOPREV = 259,
1206     SDL_SCANCODE_AUDIOSTOP = 260,
1207     SDL_SCANCODE_AUDIOPLAY = 261,
1208     SDL_SCANCODE_AUDIOMUTE = 262,
1209     SDL_SCANCODE_MEDIASELECT = 263,
1210     SDL_SCANCODE_WWW = 264,
1211     SDL_SCANCODE_MAIL = 265,
1212     SDL_SCANCODE_CALCULATOR = 266,
1213     SDL_SCANCODE_COMPUTER = 267,
1214     SDL_SCANCODE_AC_SEARCH = 268,
1215     SDL_SCANCODE_AC_HOME = 269,
1216     SDL_SCANCODE_AC_BACK = 270,
1217     SDL_SCANCODE_AC_FORWARD = 271,
1218     SDL_SCANCODE_AC_STOP = 272,
1219     SDL_SCANCODE_AC_REFRESH = 273,
1220     SDL_SCANCODE_AC_BOOKMARKS = 274,
1221 
1222     SDL_SCANCODE_BRIGHTNESSDOWN = 275,
1223     SDL_SCANCODE_BRIGHTNESSUP = 276,
1224     SDL_SCANCODE_DISPLAYSWITCH = 277,
1225     SDL_SCANCODE_KBDILLUMTOGGLE = 278,
1226     SDL_SCANCODE_KBDILLUMDOWN = 279,
1227     SDL_SCANCODE_KBDILLUMUP = 280,
1228     SDL_SCANCODE_EJECT = 281,
1229     SDL_SCANCODE_SLEEP = 282,
1230 
1231     SDL_SCANCODE_APP1 = 283,
1232     SDL_SCANCODE_APP2 = 284,
1233 
1234     SDL_SCANCODE_AUDIOREWIND = 285,
1235     SDL_SCANCODE_AUDIOFASTFORWARD = 286,
1236 
1237     SDL_NUM_SCANCODES = 512
1238 }
1239 mixin(MakeEnum!SDL_Scancode);
1240 
1241 // SDL_keycode.h
1242 enum SDLK_SCANCODE_MASK = 1<<30;
1243 @nogc nothrow pure int SDL_SCANCODE_TO_KEYCODE(SDL_Scancode X) {
1244     return (X | SDLK_SCANCODE_MASK);
1245 }
1246 
1247 enum SDL_Keycode {
1248     SDLK_UNKNOWN = 0,
1249     SDLK_RETURN = '\r',
1250     SDLK_ESCAPE = '\033',
1251     SDLK_BACKSPACE = '\b',
1252     SDLK_TAB = '\t',
1253     SDLK_SPACE = ' ',
1254     SDLK_EXCLAIM = '!',
1255     SDLK_QUOTEDBL = '"',
1256     SDLK_HASH = '#',
1257     SDLK_PERCENT = '%',
1258     SDLK_DOLLAR = '$',
1259     SDLK_AMPERSAND = '&',
1260     SDLK_QUOTE = '\'',
1261     SDLK_LEFTPAREN = '(',
1262     SDLK_RIGHTPAREN = ')',
1263     SDLK_ASTERISK = '*',
1264     SDLK_PLUS = '+',
1265     SDLK_COMMA = ',',
1266     SDLK_MINUS = '-',
1267     SDLK_PERIOD = '.',
1268     SDLK_SLASH = '/',
1269     SDLK_0 = '0',
1270     SDLK_1 = '1',
1271     SDLK_2 = '2',
1272     SDLK_3 = '3',
1273     SDLK_4 = '4',
1274     SDLK_5 = '5',
1275     SDLK_6 = '6',
1276     SDLK_7 = '7',
1277     SDLK_8 = '8',
1278     SDLK_9 = '9',
1279     SDLK_COLON = ':',
1280     SDLK_SEMICOLON = ';',
1281     SDLK_LESS = '<',
1282     SDLK_EQUALS = '=',
1283     SDLK_GREATER = '>',
1284     SDLK_QUESTION = '?',
1285     SDLK_AT = '@',
1286 
1287     SDLK_LEFTBRACKET = '[',
1288     SDLK_BACKSLASH = '\\',
1289     SDLK_RIGHTBRACKET = ']',
1290     SDLK_CARET = '^',
1291     SDLK_UNDERSCORE = '_',
1292     SDLK_BACKQUOTE = '`',
1293     SDLK_a = 'a',
1294     SDLK_b = 'b',
1295     SDLK_c = 'c',
1296     SDLK_d = 'd',
1297     SDLK_e = 'e',
1298     SDLK_f = 'f',
1299     SDLK_g = 'g',
1300     SDLK_h = 'h',
1301     SDLK_i = 'i',
1302     SDLK_j = 'j',
1303     SDLK_k = 'k',
1304     SDLK_l = 'l',
1305     SDLK_m = 'm',
1306     SDLK_n = 'n',
1307     SDLK_o = 'o',
1308     SDLK_p = 'p',
1309     SDLK_q = 'q',
1310     SDLK_r = 'r',
1311     SDLK_s = 's',
1312     SDLK_t = 't',
1313     SDLK_u = 'u',
1314     SDLK_v = 'v',
1315     SDLK_w = 'w',
1316     SDLK_x = 'x',
1317     SDLK_y = 'y',
1318     SDLK_z = 'z',
1319 
1320     SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CAPSLOCK),
1321 
1322     SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F1),
1323     SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F2),
1324     SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F3),
1325     SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F4),
1326     SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F5),
1327     SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F6),
1328     SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F7),
1329     SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F8),
1330     SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F9),
1331     SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F10),
1332     SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F11),
1333     SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F12),
1334 
1335     SDLK_PRINTSCREEN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PRINTSCREEN),
1336     SDLK_SCROLLLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_SCROLLLOCK),
1337     SDLK_PAUSE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PAUSE),
1338     SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_INSERT),
1339     SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_HOME),
1340     SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PAGEUP),
1341     SDLK_DELETE = '\177',
1342     SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_END),
1343     SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PAGEDOWN),
1344     SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RIGHT),
1345     SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_LEFT),
1346     SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_DOWN),
1347     SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_UP),
1348 
1349     SDLK_NUMLOCKCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_NUMLOCKCLEAR),
1350     SDLK_KP_DIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_DIVIDE),
1351     SDLK_KP_MULTIPLY = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MULTIPLY),
1352     SDLK_KP_MINUS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MINUS),
1353     SDLK_KP_PLUS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_PLUS),
1354     SDLK_KP_ENTER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_ENTER),
1355     SDLK_KP_1 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_1),
1356     SDLK_KP_2 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_2),
1357     SDLK_KP_3 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_3),
1358     SDLK_KP_4 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_4),
1359     SDLK_KP_5 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_5),
1360     SDLK_KP_6 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_6),
1361     SDLK_KP_7 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_7),
1362     SDLK_KP_8 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_8),
1363     SDLK_KP_9 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_9),
1364     SDLK_KP_0 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_0),
1365     SDLK_KP_PERIOD = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_PERIOD),
1366 
1367     SDLK_APPLICATION = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_APPLICATION),
1368     SDLK_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_POWER),
1369     SDLK_KP_EQUALS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_EQUALS),
1370     SDLK_F13 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F13),
1371     SDLK_F14 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F14),
1372     SDLK_F15 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F15),
1373     SDLK_F16 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F16),
1374     SDLK_F17 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F17),
1375     SDLK_F18 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F18),
1376     SDLK_F19 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F19),
1377     SDLK_F20 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F20),
1378     SDLK_F21 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F21),
1379     SDLK_F22 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F22),
1380     SDLK_F23 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F23),
1381     SDLK_F24 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_F24),
1382     SDLK_EXECUTE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_EXECUTE),
1383     SDLK_HELP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_HELP),
1384     SDLK_MENU = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_MENU),
1385     SDLK_SELECT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_SELECT),
1386     SDLK_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_STOP),
1387     SDLK_AGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AGAIN),
1388     SDLK_UNDO = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_UNDO),
1389     SDLK_CUT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CUT),
1390     SDLK_COPY = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_COPY),
1391     SDLK_PASTE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PASTE),
1392     SDLK_FIND = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_FIND),
1393     SDLK_MUTE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_MUTE),
1394     SDLK_VOLUMEUP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_VOLUMEUP),
1395     SDLK_VOLUMEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_VOLUMEDOWN),
1396     SDLK_KP_COMMA = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_COMMA),
1397     SDLK_KP_EQUALSAS400 =
1398         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_EQUALSAS400),
1399 
1400     SDLK_ALTERASE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_ALTERASE),
1401     SDLK_SYSREQ = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_SYSREQ),
1402     SDLK_CANCEL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CANCEL),
1403     SDLK_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CLEAR),
1404     SDLK_PRIOR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_PRIOR),
1405     SDLK_RETURN2 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RETURN2),
1406     SDLK_SEPARATOR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_SEPARATOR),
1407     SDLK_OUT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_OUT),
1408     SDLK_OPER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_OPER),
1409     SDLK_CLEARAGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CLEARAGAIN),
1410     SDLK_CRSEL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CRSEL),
1411     SDLK_EXSEL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_EXSEL),
1412 
1413     SDLK_KP_00 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_00),
1414     SDLK_KP_000 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_000),
1415     SDLK_THOUSANDSSEPARATOR =
1416         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_THOUSANDSSEPARATOR),
1417     SDLK_DECIMALSEPARATOR =
1418         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_DECIMALSEPARATOR),
1419     SDLK_CURRENCYUNIT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CURRENCYUNIT),
1420     SDLK_CURRENCYSUBUNIT =
1421         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CURRENCYSUBUNIT),
1422     SDLK_KP_LEFTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_LEFTPAREN),
1423     SDLK_KP_RIGHTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_RIGHTPAREN),
1424     SDLK_KP_LEFTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_LEFTBRACE),
1425     SDLK_KP_RIGHTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_RIGHTBRACE),
1426     SDLK_KP_TAB = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_TAB),
1427     SDLK_KP_BACKSPACE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_BACKSPACE),
1428     SDLK_KP_A = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_A),
1429     SDLK_KP_B = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_B),
1430     SDLK_KP_C = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_C),
1431     SDLK_KP_D = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_D),
1432     SDLK_KP_E = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_E),
1433     SDLK_KP_F = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_F),
1434     SDLK_KP_XOR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_XOR),
1435     SDLK_KP_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_POWER),
1436     SDLK_KP_PERCENT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_PERCENT),
1437     SDLK_KP_LESS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_LESS),
1438     SDLK_KP_GREATER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_GREATER),
1439     SDLK_KP_AMPERSAND = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_AMPERSAND),
1440     SDLK_KP_DBLAMPERSAND =
1441         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_DBLAMPERSAND),
1442     SDLK_KP_VERTICALBAR =
1443         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_VERTICALBAR),
1444     SDLK_KP_DBLVERTICALBAR =
1445         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_DBLVERTICALBAR),
1446     SDLK_KP_COLON = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_COLON),
1447     SDLK_KP_HASH = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_HASH),
1448     SDLK_KP_SPACE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_SPACE),
1449     SDLK_KP_AT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_AT),
1450     SDLK_KP_EXCLAM = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_EXCLAM),
1451     SDLK_KP_MEMSTORE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMSTORE),
1452     SDLK_KP_MEMRECALL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMRECALL),
1453     SDLK_KP_MEMCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMCLEAR),
1454     SDLK_KP_MEMADD = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMADD),
1455     SDLK_KP_MEMSUBTRACT =
1456         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMSUBTRACT),
1457     SDLK_KP_MEMMULTIPLY =
1458         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMMULTIPLY),
1459     SDLK_KP_MEMDIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_MEMDIVIDE),
1460     SDLK_KP_PLUSMINUS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_PLUSMINUS),
1461     SDLK_KP_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_CLEAR),
1462     SDLK_KP_CLEARENTRY = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_CLEARENTRY),
1463     SDLK_KP_BINARY = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_BINARY),
1464     SDLK_KP_OCTAL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_OCTAL),
1465     SDLK_KP_DECIMAL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_DECIMAL),
1466     SDLK_KP_HEXADECIMAL =
1467         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KP_HEXADECIMAL),
1468 
1469     SDLK_LCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_LCTRL),
1470     SDLK_LSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_LSHIFT),
1471     SDLK_LALT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_LALT),
1472     SDLK_LGUI = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_LGUI),
1473     SDLK_RCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RCTRL),
1474     SDLK_RSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RSHIFT),
1475     SDLK_RALT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RALT),
1476     SDLK_RGUI = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_RGUI),
1477 
1478     SDLK_MODE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_MODE),
1479 
1480     SDLK_AUDIONEXT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIONEXT),
1481     SDLK_AUDIOPREV = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOPREV),
1482     SDLK_AUDIOSTOP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOSTOP),
1483     SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOPLAY),
1484     SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOMUTE),
1485     SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_MEDIASELECT),
1486     SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_WWW),
1487     SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_MAIL),
1488     SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_CALCULATOR),
1489     SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_COMPUTER),
1490     SDLK_AC_SEARCH = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_SEARCH),
1491     SDLK_AC_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_HOME),
1492     SDLK_AC_BACK = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_BACK),
1493     SDLK_AC_FORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_FORWARD),
1494     SDLK_AC_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_STOP),
1495     SDLK_AC_REFRESH = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_REFRESH),
1496     SDLK_AC_BOOKMARKS = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AC_BOOKMARKS),
1497 
1498     SDLK_BRIGHTNESSDOWN =
1499         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_BRIGHTNESSDOWN),
1500     SDLK_BRIGHTNESSUP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_BRIGHTNESSUP),
1501     SDLK_DISPLAYSWITCH = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_DISPLAYSWITCH),
1502     SDLK_KBDILLUMTOGGLE =
1503         SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KBDILLUMTOGGLE),
1504     SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KBDILLUMDOWN),
1505     SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_KBDILLUMUP),
1506     SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_EJECT),
1507     SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_SLEEP),
1508     SDLK_APP1 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_APP1),
1509     SDLK_APP2 = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_APP2),
1510     
1511     SDLK_AUDIOREWIND = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOREWIND),    
1512     SDLK_AUDIOFASTFORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_Scancode.SDL_SCANCODE_AUDIOFASTFORWARD),
1513     
1514 }
1515 mixin(MakeEnum!SDL_Keycode);
1516 
1517 enum SDL_Keymod {
1518     KMOD_NONE = 0x0000,
1519     KMOD_LSHIFT = 0x0001,
1520     KMOD_RSHIFT = 0x0002,
1521     KMOD_LCTRL = 0x0040,
1522     KMOD_RCTRL = 0x0080,
1523     KMOD_LALT = 0x0100,
1524     KMOD_RALT = 0x0200,
1525     KMOD_LGUI = 0x0400,
1526     KMOD_RGUI = 0x0800,
1527     KMOD_NUM = 0x1000,
1528     KMOD_CAPS = 0x2000,
1529     KMOD_MODE = 0x4000,
1530     KMOD_RESERVED = 0x8000,
1531 
1532     KMOD_CTRL = (KMOD_LCTRL|KMOD_RCTRL),
1533     KMOD_SHIFT = (KMOD_LSHIFT|KMOD_RSHIFT),
1534     KMOD_ALT = (KMOD_LALT|KMOD_RALT),
1535     KMOD_GUI = (KMOD_LGUI|KMOD_RGUI),
1536 }
1537 mixin(MakeEnum!SDL_Keymod);
1538 
1539 // SDL_log.h
1540 enum SDL_MAX_LOG_MESSAGE = 4096;
1541 
1542 enum {
1543     SDL_LOG_CATEGORY_APPLICATION,
1544     SDL_LOG_CATEGORY_ERROR,
1545     SDL_LOG_CATEGORY_ASSERT,
1546     SDL_LOG_CATEGORY_SYSTEM,
1547     SDL_LOG_CATEGORY_AUDIO,
1548     SDL_LOG_CATEGORY_VIDEO,
1549     SDL_LOG_CATEGORY_RENDER,
1550     SDL_LOG_CATEGORY_INPUT,
1551 
1552     SDL_LOG_CATEGORY_RESERVED1,
1553     SDL_LOG_CATEGORY_RESERVED2,
1554     SDL_LOG_CATEGORY_RESERVED3,
1555     SDL_LOG_CATEGORY_RESERVED4,
1556     SDL_LOG_CATEGORY_RESERVED5,
1557     SDL_LOG_CATEGORY_RESERVED6,
1558     SDL_LOG_CATEGORY_RESERVED7,
1559     SDL_LOG_CATEGORY_RESERVED8,
1560     SDL_LOG_CATEGORY_RESERVED9,
1561     SDL_LOG_CATEGORY_RESERVED10,
1562 
1563     SDL_LOG_CATEGORY_CUSTOM
1564 }
1565 
1566 enum SDL_LogPriority {
1567     SDL_LOG_PRIORITY_VERBOSE = 1,
1568     SDL_LOG_PRIORITY_DEBUG,
1569     SDL_LOG_PRIORITY_INFO,
1570     SDL_LOG_PRIORITY_WARN,
1571     SDL_LOG_PRIORITY_ERROR,
1572     SDL_LOG_PRIORITY_CRITICAL,
1573     SDL_NUM_LOG_PRIORITIES
1574 }
1575 mixin(MakeEnum!SDL_LogPriority);
1576 
1577 extern(C) nothrow alias SDL_LogOutputFunction = void function(void*, int, SDL_LogPriority, const(char)*);
1578 
1579 // SDL_mouse.h
1580 struct SDL_Cursor;
1581 
1582 @nogc nothrow pure Uint8 SDL_BUTTON(Uint8 X) {
1583     return cast(Uint8)(1 << (X - 1));
1584 }
1585 
1586 enum SDL_SystemCursor {
1587     SDL_SYSTEM_CURSOR_ARROW,
1588     SDL_SYSTEM_CURSOR_IBEAM,
1589     SDL_SYSTEM_CURSOR_WAIT,
1590     SDL_SYSTEM_CURSOR_CROSSHAIR,
1591     SDL_SYSTEM_CURSOR_WAITARROW,
1592     SDL_SYSTEM_CURSOR_SIZENWSE,
1593     SDL_SYSTEM_CURSOR_SIZENESW,
1594     SDL_SYSTEM_CURSOR_SIZEWE,
1595     SDL_SYSTEM_CURSOR_SIZENS,
1596     SDL_SYSTEM_CURSOR_SIZEALL,
1597     SDL_SYSTEM_CURSOR_NO,
1598     SDL_SYSTEM_CURSOR_HAND,
1599     SDL_NUM_SYSTEM_CURSORS
1600 }
1601 mixin(MakeEnum!SDL_SystemCursor);
1602 
1603 enum SDL_MouseWheelDirection {
1604     SDL_MOUSEWHEEL_NORMAL,
1605     SDL_MOUSEWHEEL_FLIPPED
1606 }
1607 mixin(MakeEnum!SDL_MouseWheelDirection);
1608 
1609 enum SDL_D_MouseButton : Uint8 {
1610     SDL_BUTTON_LEFT = 1,
1611     SDL_BUTTON_MIDDLE = 2,
1612     SDL_BUTTON_RIGHT = 3,
1613     SDL_BUTTON_X1 = 4,
1614     SDL_BUTTON_X2 = 5,
1615     SDL_BUTTON_LMASK = SDL_BUTTON(SDL_BUTTON_LEFT),
1616     SDL_BUTTON_MMASK = SDL_BUTTON(SDL_BUTTON_MIDDLE),
1617     SDL_BUTTON_RMASK = SDL_BUTTON(SDL_BUTTON_RIGHT),
1618     SDL_BUTTON_X1MASK = SDL_BUTTON(SDL_BUTTON_X1),
1619     SDL_BUTTON_X2MASK = SDL_BUTTON(SDL_BUTTON_X2),
1620 }
1621 mixin(MakeEnum!SDL_D_MouseButton);
1622 
1623 // SDL_pixels.h
1624 enum SDL_ALPHA_OPAQUE = 255;
1625 enum SDL_ALPHA_TRANSPARENT = 0;
1626 
1627 enum {
1628     SDL_PIXELTYPE_UNKNOWN,
1629     SDL_PIXELTYPE_INDEX1,
1630     SDL_PIXELTYPE_INDEX4,
1631     SDL_PIXELTYPE_INDEX8,
1632     SDL_PIXELTYPE_PACKED8,
1633     SDL_PIXELTYPE_PACKED16,
1634     SDL_PIXELTYPE_PACKED32,
1635     SDL_PIXELTYPE_ARRAYU8,
1636     SDL_PIXELTYPE_ARRAYU16,
1637     SDL_PIXELTYPE_ARRAYU32,
1638     SDL_PIXELTYPE_ARRAYF16,
1639     SDL_PIXELTYPE_ARRAYF32
1640 }
1641 
1642 enum {
1643     SDL_BITMAPORDER_NONE,
1644     SDL_BITMAPORDER_4321,
1645     SDL_BITMAPORDER_1234
1646 }
1647 
1648 enum {
1649     SDL_PACKEDORDER_NONE,
1650     SDL_PACKEDORDER_XRGB,
1651     SDL_PACKEDORDER_RGBX,
1652     SDL_PACKEDORDER_ARGB,
1653     SDL_PACKEDORDER_RGBA,
1654     SDL_PACKEDORDER_XBGR,
1655     SDL_PACKEDORDER_BGRX,
1656     SDL_PACKEDORDER_ABGR,
1657     SDL_PACKEDORDER_BGRA
1658 }
1659 
1660 enum {
1661     SDL_ARRAYORDER_NONE,
1662     SDL_ARRAYORDER_RGB,
1663     SDL_ARRAYORDER_RGBA,
1664     SDL_ARRAYORDER_ARGB,
1665     SDL_ARRAYORDER_BGR,
1666     SDL_ARRAYORDER_BGRA,
1667     SDL_ARRAYORDER_ABGR
1668 }
1669 
1670 enum {
1671     SDL_PACKEDLAYOUT_NONE,
1672     SDL_PACKEDLAYOUT_332,
1673     SDL_PACKEDLAYOUT_4444,
1674     SDL_PACKEDLAYOUT_1555,
1675     SDL_PACKEDLAYOUT_5551,
1676     SDL_PACKEDLAYOUT_565,
1677     SDL_PACKEDLAYOUT_8888,
1678     SDL_PACKEDLAYOUT_2101010,
1679     SDL_PACKEDLAYOUT_1010102
1680 }
1681 
1682 alias SDL_DEFINE_PIXELFOURCC = SDL_FOURCC ;
1683 @nogc nothrow {
1684     Uint32 SDL_DEFINE_PIXELFORMAT(int type, int order, int layout, int bits, int bytes) {
1685         return (1<<28) | (type << 24) | (order << 20) | (layout << 16) | (bits << 8) | (bytes << 0);
1686     }
1687 
1688     Uint32 SDL_PIXELFLAG(Uint32 X) { return (X >> 28) & 0x0F; }
1689     Uint32 SDL_PIXELTYPE(Uint32 X) { return (X >> 24) & 0x0F; }
1690     Uint32 SDL_PIXELORDER(Uint32 X) { return (X >> 20) & 0x0F; }
1691     Uint32 SDL_PIXELLAYOUT(Uint32 X) { return (X >> 16) & 0x0F; }
1692     Uint32 SDL_BITSPERPIXEL(Uint32 X) { return (X >> 8) & 0xFF; }
1693     Uint32 SDL_BYTESPERPIXEL(Uint32 X) {
1694         if(SDL_ISPIXELFORMAT_FOURCC(X)) {
1695             if(X == SDL_PIXELFORMAT_YUY2 || X == SDL_PIXELFORMAT_UYVY || X == SDL_PIXELFORMAT_YVYU)
1696                 return 2;
1697             else
1698                 return 1;
1699         } else {
1700             return (X >> 0) & 0xFF;
1701         }
1702     }
1703 
1704     bool SDL_ISPIXELFORMAT_INDEXED(Uint32 format) {
1705         if(!SDL_ISPIXELFORMAT_FOURCC(format)) {
1706             auto pixelType = SDL_PIXELTYPE(format);
1707             return pixelType == SDL_PIXELTYPE_INDEX1 || pixelType == SDL_PIXELTYPE_INDEX4 ||
1708                    pixelType == SDL_PIXELTYPE_INDEX8;
1709         }
1710         return false;
1711     }
1712 
1713     bool SDL_ISPIXELFORMAT_PACKED(Uint32 format) {
1714         if(!SDL_ISPIXELFORMAT_FOURCC(format)) {
1715             auto pixelType = SDL_PIXELTYPE(format);
1716             return pixelType == SDL_PIXELTYPE_PACKED8 || pixelType == SDL_PIXELTYPE_PACKED16 ||
1717                    pixelType == SDL_PIXELTYPE_PACKED32;
1718         }
1719         return false;
1720     }
1721 
1722     bool SDL_ISPIXELFORMAT_ARRAY(Uint32 format) {
1723         if(!SDL_ISPIXELFORMAT_FOURCC(format)) {
1724             auto pixelType = SDL_PIXELTYPE(format);
1725             return pixelType == SDL_PIXELTYPE_ARRAYU8 || pixelType == SDL_PIXELTYPE_ARRAYU16 ||
1726                    pixelType == SDL_PIXELTYPE_ARRAYU32 || pixelType == SDL_PIXELTYPE_ARRAYF16 ||
1727                    pixelType == SDL_PIXELTYPE_ARRAYF32;
1728         }
1729         return false;
1730     }
1731 
1732     bool SDL_ISPIXELFORMAT_ALPHA(Uint32 format) {
1733         if(!SDL_ISPIXELFORMAT_FOURCC(format)) {
1734             auto pixelOrder = SDL_PIXELORDER(format);
1735             return ((SDL_ISPIXELFORMAT_PACKED(format) &&
1736                    (pixelOrder == SDL_PACKEDORDER_ARGB || pixelOrder == SDL_PACKEDORDER_RGBA ||
1737                      pixelOrder == SDL_PACKEDORDER_ABGR || pixelOrder == SDL_PACKEDORDER_BGRA)) ||
1738                    (SDL_ISPIXELFORMAT_ARRAY(format) &&
1739                    (pixelOrder == SDL_ARRAYORDER_ARGB || pixelOrder == SDL_ARRAYORDER_RGBA ||
1740                      pixelOrder == SDL_ARRAYORDER_ABGR || pixelOrder == SDL_ARRAYORDER_BGRA)));
1741         }
1742         return false;
1743     }
1744 
1745     bool SDL_ISPIXELFORMAT_FOURCC(Uint32 format) { return format && !(format & 0x80000000); }
1746 }
1747 
1748 enum {
1749     SDL_PIXELFORMAT_UNKNOWN,
1750     SDL_PIXELFORMAT_INDEX1LSB =
1751         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0,
1752                                1, 0),
1753     SDL_PIXELFORMAT_INDEX1MSB =
1754         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0,
1755                                1, 0),
1756     SDL_PIXELFORMAT_INDEX4LSB =
1757         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0,
1758                                4, 0),
1759     SDL_PIXELFORMAT_INDEX4MSB =
1760         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0,
1761                                4, 0),
1762     SDL_PIXELFORMAT_INDEX8 =
1763         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1),
1764     SDL_PIXELFORMAT_RGB332 =
1765         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB,
1766                                SDL_PACKEDLAYOUT_332, 8, 1),
1767     SDL_PIXELFORMAT_RGB444 =
1768         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,
1769                                SDL_PACKEDLAYOUT_4444, 12, 2),
1770     SDL_PIXELFORMAT_RGB555 =
1771         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,
1772                                SDL_PACKEDLAYOUT_1555, 15, 2),
1773     SDL_PIXELFORMAT_BGR555 =
1774         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR,
1775                                SDL_PACKEDLAYOUT_1555, 15, 2),
1776     SDL_PIXELFORMAT_ARGB4444 =
1777         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB,
1778                                SDL_PACKEDLAYOUT_4444, 16, 2),
1779     SDL_PIXELFORMAT_RGBA4444 =
1780         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA,
1781                                SDL_PACKEDLAYOUT_4444, 16, 2),
1782     SDL_PIXELFORMAT_ABGR4444 =
1783         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR,
1784                                SDL_PACKEDLAYOUT_4444, 16, 2),
1785     SDL_PIXELFORMAT_BGRA4444 =
1786         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA,
1787                                SDL_PACKEDLAYOUT_4444, 16, 2),
1788     SDL_PIXELFORMAT_ARGB1555 =
1789         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB,
1790                                SDL_PACKEDLAYOUT_1555, 16, 2),
1791     SDL_PIXELFORMAT_RGBA5551 =
1792         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA,
1793                                SDL_PACKEDLAYOUT_5551, 16, 2),
1794     SDL_PIXELFORMAT_ABGR1555 =
1795         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR,
1796                                SDL_PACKEDLAYOUT_1555, 16, 2),
1797     SDL_PIXELFORMAT_BGRA5551 =
1798         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA,
1799                                SDL_PACKEDLAYOUT_5551, 16, 2),
1800     SDL_PIXELFORMAT_RGB565 =
1801         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB,
1802                                SDL_PACKEDLAYOUT_565, 16, 2),
1803     SDL_PIXELFORMAT_BGR565 =
1804         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR,
1805                                SDL_PACKEDLAYOUT_565, 16, 2),
1806     SDL_PIXELFORMAT_RGB24 =
1807         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0,
1808                                24, 3),
1809     SDL_PIXELFORMAT_BGR24 =
1810         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0,
1811                                24, 3),
1812     SDL_PIXELFORMAT_RGB888 =
1813         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB,
1814                                SDL_PACKEDLAYOUT_8888, 24, 4),
1815     SDL_PIXELFORMAT_RGBX8888 =
1816         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX,
1817                                SDL_PACKEDLAYOUT_8888, 24, 4),
1818     SDL_PIXELFORMAT_BGR888 =
1819         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR,
1820                                SDL_PACKEDLAYOUT_8888, 24, 4),
1821     SDL_PIXELFORMAT_BGRX8888 =
1822         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX,
1823                                SDL_PACKEDLAYOUT_8888, 24, 4),
1824     SDL_PIXELFORMAT_ARGB8888 =
1825         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB,
1826                                SDL_PACKEDLAYOUT_8888, 32, 4),
1827     SDL_PIXELFORMAT_RGBA8888 =
1828         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA,
1829                                SDL_PACKEDLAYOUT_8888, 32, 4),
1830     SDL_PIXELFORMAT_ABGR8888 =
1831         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR,
1832                                SDL_PACKEDLAYOUT_8888, 32, 4),
1833     SDL_PIXELFORMAT_BGRA8888 =
1834         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA,
1835                                SDL_PACKEDLAYOUT_8888, 32, 4),
1836     SDL_PIXELFORMAT_ARGB2101010 =
1837         SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB,
1838                                SDL_PACKEDLAYOUT_2101010, 32, 4),
1839 
1840     SDL_PIXELFORMAT_YV12 =
1841         SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'),
1842     SDL_PIXELFORMAT_IYUV =
1843         SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'),
1844     SDL_PIXELFORMAT_YUY2 =
1845         SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'),
1846     SDL_PIXELFORMAT_UYVY =
1847         SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'),
1848     SDL_PIXELFORMAT_YVYU =
1849         SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'),
1850     SDL_PIXELFORMAT_NV12 =
1851         SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'),
1852     SDL_PIXELFORMAT_NV21 =
1853         SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1')
1854 }
1855 
1856 static assert(SDL_PIXELFORMAT_BGRX8888 == 0x16661804);
1857 
1858 version(BigEndian) {
1859     alias SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888;
1860     alias SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888;
1861     alias SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888;
1862     alias SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888;
1863 }
1864 else {
1865     alias SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888;
1866     alias SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888;
1867     alias SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888;
1868     alias SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888;
1869 }
1870 
1871 struct SDL_Color {
1872     Uint8 r;
1873     Uint8 g;
1874     Uint8 b;
1875     Uint8 a;
1876 }
1877 
1878 struct SDL_Palette {
1879     int ncolors;
1880     SDL_Color* colors;
1881     // NOTE: original was named 'version'
1882     Uint32 _version;
1883     int refcount;
1884 }
1885 
1886 struct SDL_PixelFormat {
1887     Uint32 format;
1888     SDL_Palette *palette;
1889     Uint8 BitsPerPixel;
1890     Uint8 BytesPerPixel;
1891     Uint8[2] padding;
1892     Uint32 Rmask;
1893     Uint32 Gmask;
1894     Uint32 Bmask;
1895     Uint32 Amask;
1896     Uint8 Rloss;
1897     Uint8 Gloss;
1898     Uint8 Bloss;
1899     Uint8 Aloss;
1900     Uint8 Rshift;
1901     Uint8 Gshift;
1902     Uint8 Bshift;
1903     Uint8 Ashift;
1904     int refcount;
1905     SDL_PixelFormat* next;
1906 }
1907 
1908 // SDL_power.h
1909 enum SDL_PowerState {
1910     SDL_POWERSTATE_UNKNOWN,
1911     SDL_POWERSTATE_ON_BATTERY,
1912     SDL_POWERSTATE_NO_BATTERY,
1913     SDL_POWERSTATE_CHARGING,
1914     SDL_POWERSTATE_CHARGED
1915 }
1916 mixin(MakeEnum!SDL_PowerState);
1917 
1918 // SDL_rect.h
1919 struct SDL_Point {
1920     int x;
1921     int y;
1922 }
1923 
1924 struct SDL_Rect {
1925     int x, y;
1926     int w, h;
1927 }
1928 
1929 @nogc nothrow pure {
1930     bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) {
1931         return ((p.x >= r.x) && (p.x < (r.x + r.w)) &&
1932                 (p.y >= r.y) && (p.y < (r.y + r.h)));
1933     }
1934     bool SDL_RectEmpty(const(SDL_Rect)* X) { return !X || (X.w <= 0) || (X.h <= 0); }
1935     bool SDL_RectEquals(const(SDL_Rect)* A, const(SDL_Rect)* B) {
1936         return A && B &&
1937             (A.x == B.x) && (A.y == B.y) &&
1938             (A.w == B.w) && (A.h == B.h);
1939     }
1940 }
1941 
1942 // SDL_render.h
1943 enum SDL_RendererFlags : Uint32 {
1944     SDL_RENDERER_SOFTWARE = 0x00000001,
1945     SDL_RENDERER_ACCELERATED = 0x00000002,
1946     SDL_RENDERER_PRESENTVSYNC = 0x00000004,
1947     SDL_RENDERER_TARGETTEXTURE = 0x00000008,
1948 }
1949 mixin(MakeEnum!SDL_RendererFlags);
1950 
1951 struct SDL_RendererInfo {
1952     const(char)* name;
1953     SDL_RendererFlags flags;
1954     Uint32 num_texture_formats;
1955     Uint32[16] texture_formats;
1956     int max_texture_width;
1957     int max_texture_height;
1958 }
1959 
1960 enum SDL_TextureAccess {
1961     SDL_TEXTUREACCESS_STATIC,
1962     SDL_TEXTUREACCESS_STREAMING,
1963     SDL_TEXTUREACCESS_TARGET,
1964 }
1965 mixin(MakeEnum!SDL_TextureAccess);
1966 
1967 enum SDL_TextureModulate {
1968     SDL_TEXTUREMODULATE_NONE = 0x00000000,
1969     SDL_TEXTUREMODULATE_COLOR = 0x00000001,
1970     SDL_TEXTUREMODULATE_ALPHA = 0x00000002
1971 }
1972 mixin(MakeEnum!SDL_TextureModulate);
1973 
1974 enum SDL_RendererFlip {
1975     SDL_FLIP_NONE = 0x00000000,
1976     SDL_FLIP_HORIZONTAL = 0x00000001,
1977     SDL_FLIP_VERTICAL = 0x00000002,
1978 }
1979 mixin(MakeEnum!SDL_RendererFlip);
1980 
1981 struct SDL_Renderer;
1982 struct SDL_Texture;
1983 
1984 // SDL_rwops.h
1985 enum : uint {
1986     SDL_RWOPS_UNKNOWN = 0,
1987     SDL_RWOPS_WINFILE = 1,
1988     SDL_RWOPS_STDFILE = 2,
1989     SDL_RWOPS_JNIFILE = 3,
1990     SDL_RWOPS_MEMORY = 4,
1991     SDL_RWOPS_MEMORY_RO = 5,
1992 }
1993 
1994 struct SDL_RWops {
1995     extern(C) @nogc nothrow {
1996         Sint64 function(SDL_RWops*) size;
1997         Sint64 function(SDL_RWops*, Sint64, int) seek;
1998         size_t function(SDL_RWops*, void*, size_t, size_t) read;
1999         size_t function(SDL_RWops*, const(void)*, size_t, size_t) write;
2000         int function(SDL_RWops*) close;
2001     }
2002 
2003     Uint32 type;
2004 
2005     union Hidden {
2006         // version(Android)
2007         version(Windows) {
2008             struct Windowsio {
2009                 SDL_bool append;
2010                 void* h;
2011                 struct Buffer {
2012                     void* data;
2013                     size_t size;
2014                     size_t left;
2015                 }
2016                 Buffer buffer;
2017             }
2018             Windowsio windowsio;
2019         }
2020 
2021         struct Stdio {
2022             SDL_bool autoclose;
2023             FILE* fp;
2024         }
2025         Stdio stdio;
2026 
2027         struct Mem {
2028             Uint8* base;
2029             Uint8* here;
2030             Uint8* stop;
2031         }
2032         Mem mem;
2033 
2034         struct Unknown {
2035             void* data1;
2036         }
2037         Unknown unknown;
2038     }
2039     Hidden hidden;
2040 }
2041 
2042 enum {
2043     RW_SEEK_SET = 0,
2044     RW_SEEK_CUR = 1,
2045     RW_SEEK_END = 2,
2046 }
2047 
2048 @nogc nothrow {
2049     Sint64 SDL_RWsize(SDL_RWops* ctx) { return ctx.size(ctx); }
2050     Sint64 SDL_RWseek(SDL_RWops* ctx, Sint64 offset, int whence) { return ctx.seek(ctx, offset, whence); }
2051     Sint64 SDL_RWtell(SDL_RWops* ctx) { return ctx.seek(ctx, 0, RW_SEEK_CUR); }
2052     size_t SDL_RWread(SDL_RWops* ctx, void* ptr, size_t size, size_t n) { return ctx.read(ctx, ptr, size, n); }
2053     size_t SDL_RWwrite(SDL_RWops* ctx, const(void)* ptr, size_t size, size_t n) { return ctx.write(ctx, ptr, size, n); }
2054     int SDL_RWclose(SDL_RWops* ctx) { return ctx.close(ctx); }
2055 }
2056 
2057 // SDL_shape.h
2058 enum {
2059     SDL_NONSHAPEABLE_WINDOW = -1,
2060     SDL_INVALID_SHAPE_ARGUMENT = -2,
2061     SDL_WINDOW_LACKS_SHAPE = -3,
2062 }
2063 
2064 enum WindowShapeMode {
2065     ShapeModeDefault,
2066     ShapeModeBinarizeAlpha,
2067     ShapeModeReverseBinarizeAlpha,
2068     ShapeModeColorKey
2069 }
2070 mixin(MakeEnum!WindowShapeMode);
2071 
2072 @nogc nothrow pure bool SDL_SHAPEMODEALPHA(WindowShapeMode mode) {
2073     return mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha;
2074 }
2075 
2076 union SDL_WindowShapeParams {
2077     Uint8 binarizationCutoff;
2078     SDL_Color colorKey;
2079 }
2080 
2081 struct SDL_WindowShapeMode {
2082     WindowShapeMode mode;
2083     SDL_WindowShapeParams parameters;
2084 }
2085 
2086 // SDL_surface.h
2087 enum SDL_D_SurfaceFlags {
2088     SDL_SWSURFACE = 0,
2089     SDL_PREALLOC = 0x00000001,
2090     SDL_RLEACCEL = 0x00000002,
2091     SDL_DONTFREE = 0x00000004,
2092 }
2093 mixin(MakeEnum!SDL_D_SurfaceFlags);
2094 
2095 @nogc nothrow pure bool SDL_MUSTLOCK(const(SDL_Surface)* S) { return (S.flags & SDL_RLEACCEL) != 0; }
2096 
2097 struct SDL_BlitMap;
2098 struct SDL_Surface {
2099     SDL_D_SurfaceFlags flags;
2100     SDL_PixelFormat* format;
2101     int w, h;
2102     int pitch;
2103     void* pixels;
2104     void* userdata;
2105     int locked;
2106     void* lock_data;
2107     SDL_Rect clip_rect;
2108     SDL_BlitMap* map;
2109     int refcount;
2110 }
2111 
2112 extern(C) nothrow alias SDL_blit = int function(SDL_Surface* src, SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect);
2113 
2114 // SDL_system.h
2115 static if(Derelict_OS_Windows) {
2116     struct IDirect3DDevice9;
2117 }
2118 static if(Derelict_OS_iOS) {
2119     extern(C) nothrow alias SDL_iPhoneAnimationCallback = void function(void*);
2120 }
2121 static if(Derelict_OS_Android) {
2122     enum int SDL_ANDROID_EXTERNAL_STORAGE_READ  = 0x01;
2123     enum int SDL_ANDROID_EXTERNAL_STORAGE_WRITE = 0x02;
2124 }
2125 static if(Derelict_OS_WinRT) {
2126     enum SDL_WinRT_Path {
2127         SDL_WINRT_PATH_INSTALLED_LOCATION,
2128         SDL_WINRT_PATH_LOCAL_FOLDER,
2129         SDL_WINRT_PATH_ROAMING_FOLDER,
2130         SDL_WINRT_PATH_TEMP_FOLDER
2131     }
2132 }
2133 
2134 // SDL_syswm.h
2135 enum SDL_SYSWM_TYPE {
2136     SDL_SYSWM_UNKNOWN,
2137     SDL_SYSWM_WINDOWS,
2138     SDL_SYSWM_X11,
2139     SDL_SYSWM_DIRECTFB,
2140     SDL_SYSWM_COCOA,
2141     SDL_SYSWM_UIKIT,
2142     SDL_SYSWM_WAYLAND,
2143     SDL_SYSWM_MIR,
2144     SDL_SYSWM_WINRT,
2145     SDL_SYSWM_ANDROID,
2146     SDL_SYSWM_VIVANTE,
2147     SDL_SYSWM_OS2,
2148 }
2149 mixin(MakeEnum!SDL_SYSWM_TYPE);
2150 
2151 static if(Derelict_OS_Windows) {
2152     // I don't want to import core.sys.windows.windows just for these
2153     version(Win64) {
2154         alias wparam = ulong;
2155         alias lparam = long;
2156     }else {
2157         alias wparam = uint;
2158         alias lparam = int;
2159     }
2160 }
2161 
2162 struct SDL_SysWMmsg {
2163     SDL_version version_;
2164     SDL_SYSWM_TYPE subsystem;
2165     union msg_ {
2166         static if(Derelict_OS_Windows) {
2167             struct win_ {
2168                 void* hwnd;
2169                 uint msg;
2170                 wparam wParam;
2171                 lparam lParam;
2172             }
2173             win_ win;
2174         }
2175 
2176         static if(Derelict_OS_WinRT) {
2177             struct winrt_ {
2178                 void* window;
2179             }
2180             winrt_ winrt;
2181         }
2182 
2183         static if(Derelict_OS_Mac) {
2184             struct cocoa_ {
2185                 int dummy;
2186             }
2187             cocoa_ cocoa;
2188         }
2189 
2190         static if(Derelict_OS_Posix) {
2191             // X11 unsupported for now
2192             struct x11_ {
2193                 c_long[24] pad; // sufficient size for any X11 event
2194             }
2195             x11_ x11;
2196         }
2197 
2198         static if(Derelict_OS_Linux) {
2199             // DirectFB unsupported for now
2200             // Consequently SDL_SysWMmsg might have a different size that in SDL
2201             struct dfb_ {
2202                 void* event;
2203             }
2204             dfb_ dfb;
2205         }
2206 
2207         int dummy;
2208     }
2209     msg_ msg;
2210 }
2211 
2212 struct SDL_SysWMinfo {
2213     SDL_version version_; // version is reserved in D
2214     SDL_SYSWM_TYPE subsystem;
2215 
2216     union info_ {
2217         static if(Derelict_OS_Windows) {
2218             struct win_ {
2219                void* window;
2220                void* hdc;
2221                void* hinstance;
2222             }
2223             win_ win;
2224         }
2225 
2226         static if(Derelict_OS_WinRT) {
2227             struct winrt_ {
2228                 void* window;
2229             }
2230             winrt_ winrt;
2231         }
2232 
2233         static if(Derelict_OS_Posix) {
2234             struct x11_ {
2235                 void* display;
2236                 uint window;
2237             }
2238             x11_ x11;
2239         }
2240 
2241         // TODO not too sure about all the Derelict_OS tests below.
2242         static if(Derelict_OS_Linux) {
2243             struct dfb_ {
2244                 void *dfb;
2245                 void *window;
2246                 void *surface;
2247             }
2248             dfb_ dfb;
2249 
2250             struct wl_ {
2251                 void *display;
2252                 void *surface;
2253                 void *shell_surface;
2254             }
2255             wl_ wl;
2256 
2257             struct mir_ {
2258                 void *connection;
2259                 void *surface;
2260             }
2261             mir_ mir;
2262         }
2263 
2264         static if(Derelict_OS_Mac || Derelict_OS_iOS) {
2265             struct cocoa_ {
2266                void* window;
2267             }
2268             cocoa_ cocoa;
2269 
2270             struct uikit_ {
2271                 void *window;
2272             }
2273             uikit_ uikit;
2274         }
2275     }
2276     info_ info;
2277 }
2278 
2279 // SDL_timer.h
2280 extern(C) nothrow alias SDL_TimerCallback = Uint32 function(Uint32 interval, void* param);
2281 alias SDL_TimerID = int;
2282 
2283 @nogc nothrow pure bool SDL_TICKS_PASSED(Uint32 A, Uint32 B) {
2284     return cast(Sint32)(B - A) <= 0;
2285 }
2286 
2287 // SDL_touch.h
2288 alias SDL_TouchID = Sint64;
2289 alias SDL_FingerID = Sint64;
2290 
2291 struct SDL_Finger {
2292     SDL_FingerID id;
2293     float x;
2294     float y;
2295     float pressure;
2296 }
2297 
2298 enum SDL_TOUCH_MOUSEID = cast(Uint32)-1;
2299 
2300 // SDL_video.h
2301 struct SDL_DisplayMode {
2302     Uint32 format;
2303     int w;
2304     int h;
2305     int refresh_rate;
2306     void* driverdata;
2307 }
2308 
2309 struct SDL_Window;
2310 
2311 enum SDL_WindowFlags {
2312     SDL_WINDOW_FULLSCREEN = 0x00000001,
2313     SDL_WINDOW_OPENGL = 0x00000002,
2314     SDL_WINDOW_SHOWN = 0x00000004,
2315     SDL_WINDOW_HIDDEN = 0x00000008,
2316     SDL_WINDOW_BORDERLESS = 0x00000010,
2317     SDL_WINDOW_RESIZABLE = 0x00000020,
2318     SDL_WINDOW_MINIMIZED = 0x00000040,
2319     SDL_WINDOW_MAXIMIZED = 0x00000080,
2320     SDL_WINDOW_INPUT_GRABBED = 0x00000100,
2321     SDL_WINDOW_INPUT_FOCUS = 0x00000200,
2322     SDL_WINDOW_MOUSE_FOCUS = 0x00000400,
2323     SDL_WINDOW_FULLSCREEN_DESKTOP = SDL_WINDOW_FULLSCREEN | 0x00001000,
2324     SDL_WINDOW_FOREIGN = 0x00000800,
2325     SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000,
2326     SDL_WINDOW_MOUSE_CAPTURE = 0x00004000,
2327     SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000,
2328     SDL_WINDOW_SKIP_TASKBAR  = 0x00010000,
2329     SDL_WINDOW_UTILITY = 0x00020000,
2330     SDL_WINDOW_TOOLTIP = 0x00040000,
2331     SDL_WINDOW_POPUP_MENU = 0x00080000,
2332     SDL_WINDOW_VULKAN = 0x10000000,
2333 }
2334 mixin(MakeEnum!SDL_WindowFlags);
2335 
2336 enum {
2337     SDL_WINDOWPOS_UNDEFINED_MASK = 0x1FFF0000,
2338     SDL_WINDOWPOS_UNDEFINED = SDL_WINDOWPOS_UNDEFINED_DISPLAY(0),
2339     SDL_WINDOWPOS_CENTERED_MASK = 0x2FFF0000,
2340     SDL_WINDOWPOS_CENTERED = SDL_WINDOWPOS_CENTERED_DISPLAY(0),
2341 }
2342 
2343 @nogc nothrow pure {
2344     Uint32 SDL_WINDOWPOS_UNDEFINED_DISPLAY(Uint32 X) { return (SDL_WINDOWPOS_UNDEFINED_MASK | X); }
2345     bool SDL_WINDOWPOS_ISUNDEFINED(Uint32 X) { return (X & 0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK; }
2346     Uint32 SDL_WINDOWPOS_CENTERED_DISPLAY(Uint32 X) { return (SDL_WINDOWPOS_CENTERED_MASK | X); }
2347     bool SDL_WINDOWPOS_ISCENTERED(Uint32 X) { return (X & 0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK; }
2348 }
2349 
2350 enum SDL_WindowEventID : Uint8 {
2351     SDL_WINDOWEVENT_NONE,
2352     SDL_WINDOWEVENT_SHOWN,
2353     SDL_WINDOWEVENT_HIDDEN,
2354     SDL_WINDOWEVENT_EXPOSED,
2355     SDL_WINDOWEVENT_MOVED,
2356     SDL_WINDOWEVENT_RESIZED,
2357     SDL_WINDOWEVENT_SIZE_CHANGED,
2358     SDL_WINDOWEVENT_MINIMIZED,
2359     SDL_WINDOWEVENT_MAXIMIZED,
2360     SDL_WINDOWEVENT_RESTORED,
2361     SDL_WINDOWEVENT_ENTER,
2362     SDL_WINDOWEVENT_LEAVE,
2363     SDL_WINDOWEVENT_FOCUS_GAINED,
2364     SDL_WINDOWEVENT_FOCUS_LOST,
2365     SDL_WINDOWEVENT_CLOSE,
2366     SDL_WINDOWEVENT_TAKE_FOCUS,
2367     SDL_WINDOWEVENT_HIT_TEST,
2368 }
2369 mixin(MakeEnum!SDL_WindowEventID);
2370 
2371 alias SDL_GLContext = void*;
2372 
2373 enum SDL_GLattr {
2374     SDL_GL_RED_SIZE,
2375     SDL_GL_GREEN_SIZE,
2376     SDL_GL_BLUE_SIZE,
2377     SDL_GL_ALPHA_SIZE,
2378     SDL_GL_BUFFER_SIZE,
2379     SDL_GL_DOUBLEBUFFER,
2380     SDL_GL_DEPTH_SIZE,
2381     SDL_GL_STENCIL_SIZE,
2382     SDL_GL_ACCUM_RED_SIZE,
2383     SDL_GL_ACCUM_GREEN_SIZE,
2384     SDL_GL_ACCUM_BLUE_SIZE,
2385     SDL_GL_ACCUM_ALPHA_SIZE,
2386     SDL_GL_STEREO,
2387     SDL_GL_MULTISAMPLEBUFFERS,
2388     SDL_GL_MULTISAMPLESAMPLES,
2389     SDL_GL_ACCELERATED_VISUAL,
2390     SDL_GL_RETAINED_BACKING,
2391     SDL_GL_CONTEXT_MAJOR_VERSION,
2392     SDL_GL_CONTEXT_MINOR_VERSION,
2393     SDL_GL_CONTEXT_EGL,
2394     SDL_GL_CONTEXT_FLAGS,
2395     SDL_GL_CONTEXT_PROFILE_MASK,
2396     SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
2397     SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
2398     SDL_GL_CONTEXT_RELEASE_BEHAVIOR,
2399     SDL_GL_CONTEXT_RESET_NOTIFICATION,
2400     SDL_GL_CONTEXT_NO_ERROR,
2401 }
2402 mixin(MakeEnum!SDL_GLattr);
2403 
2404 enum SDL_GLprofile  {
2405     SDL_GL_CONTEXT_PROFILE_CORE = 0x0001,
2406     SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002,
2407     SDL_GL_CONTEXT_PROFILE_ES = 0x0004,
2408 }
2409 mixin(MakeEnum!SDL_GLprofile);
2410 
2411 enum SDL_GLcontextFlag {
2412     SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001,
2413     SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002,
2414     SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004,
2415     SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008,
2416 }
2417 mixin(MakeEnum!SDL_GLcontextFlag);
2418 
2419 enum SDL_GLcontextReleaseFlag {
2420     SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000,
2421     SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001,
2422 }
2423 mixin(MakeEnum!SDL_GLcontextReleaseFlag);
2424 
2425 enum SDL_GLContextResetNotification {
2426     SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000,
2427     SDL_GL_CONTEXT_RESET_LOSE_CONTEXT    = 0x0001
2428 }
2429 mixin(MakeEnum!SDL_GLContextResetNotification);
2430 
2431 enum SDL_HitTestResult {
2432     SDL_HITTEST_NORMAL,
2433     SDL_HITTEST_DRAGGABLE,
2434     SDL_HITTEST_RESIZE_TOPLEFT,
2435     SDL_HITTEST_RESIZE_TOP,
2436     SDL_HITTEST_RESIZE_TOPRIGHT,
2437     SDL_HITTEST_RESIZE_RIGHT,
2438     SDL_HITTEST_RESIZE_BOTTOMRIGHT,
2439     SDL_HITTEST_RESIZE_BOTTOM,
2440     SDL_HITTEST_RESIZE_BOTTOMLEFT,
2441     SDL_HITTEST_RESIZE_LEFT,
2442 }
2443 mixin(MakeEnum!SDL_HitTestResult);
2444 extern(C) nothrow alias SDL_HitTest = SDL_HitTestResult function(SDL_Window*, const(SDL_Point)*, void*);