1 
2 //          Copyright 2018 - 2022 Michael D. Parker
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.sdl.bind.sdlgamecontroller;
8 
9 import bindbc.sdl.config;
10 
11 import bindbc.sdl.bind.sdljoystick,
12        bindbc.sdl.bind.sdlrwops,
13        bindbc.sdl.bind.sdlsensor;
14 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
15 
16 struct SDL_GameController;
17 
18 static if(sdlSupport >= SDLSupport.sdl2016) {
19     enum SDL_GameControllerType {
20         SDL_CONTROLLER_TYPE_UNKNOWN = 0,
21         SDL_CONTROLLER_TYPE_XBOX360,
22         SDL_CONTROLLER_TYPE_XBOXONE,
23         SDL_CONTROLLER_TYPE_PS3,
24         SDL_CONTROLLER_TYPE_PS4,
25         SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO,
26         SDL_CONTROLLER_TYPE_VIRTUAL,
27         SDL_CONTROLLER_TYPE_PS5,
28         SDL_CONTROLLER_TYPE_AMAZON_LUNA,
29         SDL_CONTROLLER_TYPE_GOOGLE_STADIA
30     }
31     mixin(expandEnum!SDL_GameControllerType);
32 }
33 else static if(sdlSupport >= SDLSupport.sdl2014) {
34     enum SDL_GameControllerType {
35         SDL_CONTROLLER_TYPE_UNKNOWN = 0,
36         SDL_CONTROLLER_TYPE_XBOX360,
37         SDL_CONTROLLER_TYPE_XBOXONE,
38         SDL_CONTROLLER_TYPE_PS3,
39         SDL_CONTROLLER_TYPE_PS4,
40         SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO,
41         SDL_CONTROLLER_TYPE_VIRTUAL,
42         SDL_CONTROLLER_TYPE_PS5
43     }
44     mixin(expandEnum!SDL_GameControllerType);
45 }
46 else static if(sdlSupport >= SDLSupport.sdl2012) {
47     enum SDL_GameControllerType {
48         SDL_CONTROLLER_TYPE_UNKNOWN = 0,
49         SDL_CONTROLLER_TYPE_XBOX360,
50         SDL_CONTROLLER_TYPE_XBOXONE,
51         SDL_CONTROLLER_TYPE_PS3,
52         SDL_CONTROLLER_TYPE_PS4,
53         SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO,
54     }
55     mixin(expandEnum!SDL_GameControllerType);
56 }
57 
58 enum SDL_GameControllerBindType {
59     SDL_CONTROLLER_BINDTYPE_NONE = 0,
60     SDL_CONTROLLER_BINDTYPE_BUTTON,
61     SDL_CONTROLLER_BINDTYPE_AXIS,
62     SDL_CONTROLLER_BINDTYPE_HAT,
63 }
64 mixin(expandEnum!SDL_GameControllerBindType);
65 
66 struct SDL_GameControllerButtonBind {
67     SDL_GameControllerBindType bindType;
68     union value {
69         int button;
70         int axis;
71         struct hat {
72             int hat;
73             int hat_mask;
74         }
75     }
76     alias button = value.button;
77     alias axis = value.axis;
78     alias hat = value.hat;
79 }
80 
81 enum SDL_GameControllerAxis {
82     SDL_CONTROLLER_AXIS_INVALID = -1,
83     SDL_CONTROLLER_AXIS_LEFTX,
84     SDL_CONTROLLER_AXIS_LEFTY,
85     SDL_CONTROLLER_AXIS_RIGHTX,
86     SDL_CONTROLLER_AXIS_RIGHTY,
87     SDL_CONTROLLER_AXIS_TRIGGERLEFT,
88     SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
89     SDL_CONTROLLER_AXIS_MAX
90 }
91 mixin(expandEnum!SDL_GameControllerAxis);
92 
93 static if(sdlSupport >= SDLSupport.sdl2014) {
94     enum SDL_GameControllerButton {
95         SDL_CONTROLLER_BUTTON_INVALID = -1,
96         SDL_CONTROLLER_BUTTON_A,
97         SDL_CONTROLLER_BUTTON_B,
98         SDL_CONTROLLER_BUTTON_X,
99         SDL_CONTROLLER_BUTTON_Y,
100         SDL_CONTROLLER_BUTTON_BACK,
101         SDL_CONTROLLER_BUTTON_GUIDE,
102         SDL_CONTROLLER_BUTTON_START,
103         SDL_CONTROLLER_BUTTON_LEFTSTICK,
104         SDL_CONTROLLER_BUTTON_RIGHTSTICK,
105         SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
106         SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
107         SDL_CONTROLLER_BUTTON_DPAD_UP,
108         SDL_CONTROLLER_BUTTON_DPAD_DOWN,
109         SDL_CONTROLLER_BUTTON_DPAD_LEFT,
110         SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
111         SDL_CONTROLLER_BUTTON_MISC1,
112         SDL_CONTROLLER_BUTTON_PADDLE1,
113         SDL_CONTROLLER_BUTTON_PADDLE2,
114         SDL_CONTROLLER_BUTTON_PADDLE3,
115         SDL_CONTROLLER_BUTTON_PADDLE4,
116         SDL_CONTROLLER_BUTTON_TOUCHPAD,
117         SDL_CONTROLLER_BUTTON_MAX,
118     }
119 }
120 else {
121     enum SDL_GameControllerButton {
122         SDL_CONTROLLER_BUTTON_INVALID = -1,
123         SDL_CONTROLLER_BUTTON_A,
124         SDL_CONTROLLER_BUTTON_B,
125         SDL_CONTROLLER_BUTTON_X,
126         SDL_CONTROLLER_BUTTON_Y,
127         SDL_CONTROLLER_BUTTON_BACK,
128         SDL_CONTROLLER_BUTTON_GUIDE,
129         SDL_CONTROLLER_BUTTON_START,
130         SDL_CONTROLLER_BUTTON_LEFTSTICK,
131         SDL_CONTROLLER_BUTTON_RIGHTSTICK,
132         SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
133         SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
134         SDL_CONTROLLER_BUTTON_DPAD_UP,
135         SDL_CONTROLLER_BUTTON_DPAD_DOWN,
136         SDL_CONTROLLER_BUTTON_DPAD_LEFT,
137         SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
138         SDL_CONTROLLER_BUTTON_MAX,
139     }
140 }
141 mixin(expandEnum!SDL_GameControllerButton);
142 
143 static if(sdlSupport >= SDLSupport.sdl202) {
144     @nogc nothrow
145     int SDL_GameControllerAddMappingsFromFile(const(char)* file) {
146         pragma(inline, true);
147         return SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file,"rb"),1);
148     }
149 }
150 
151 static if(staticBinding) {
152     extern(C) @nogc nothrow {
153         int SDL_GameControllerAddMapping(const(char)* mappingString);
154         char* SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid);
155         char* SDL_GameControllerMapping(SDL_GameController* gamecontroller);
156         SDL_bool SDL_IsGameController(int joystick_index);
157         const(char)* SDL_GameControllerNameForIndex(int joystick_index);
158         SDL_GameController* SDL_GameControllerOpen(int joystick_index);
159         const(char)* SDL_GameControllerName(SDL_GameController* gamecontroller);
160         SDL_bool SDL_GameControllerGetAttached(SDL_GameController* gamecontroller);
161         SDL_Joystick* SDL_GameControllerGetJoystick(SDL_GameController* gamecontroller);
162         int SDL_GameControllerEventState(int state);
163         void SDL_GameControllerUpdate();
164         SDL_GameControllerAxis SDL_GameControllerGetAxisFromString(const(char)* pchString);
165         const(char)* SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis);
166         SDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
167         short SDL_GameControllerGetAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
168         SDL_GameControllerButton SDL_GameControllerGetButtonFromString(const(char*) pchString);
169         const(char)* SDL_GameControllerGetStringForButton(SDL_GameControllerButton button);
170         SDL_GameControllerButtonBind SDL_GameControllerGetBindForButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
171         ubyte SDL_GameControllerGetButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
172         void SDL_GameControllerClose(SDL_GameController* gamecontroller);
173 
174         static if(sdlSupport >= SDLSupport.sdl202) {
175             int SDL_GameControllerAddMappingsFromRW(SDL_RWops* rw, int freerw);
176         }
177         static if(sdlSupport >= SDLSupport.sdl204) {
178             SDL_GameController* SDL_GameControllerFromInstanceID(SDL_JoystickID joyid);
179         }
180         static if(sdlSupport >= SDLSupport.sdl206) {
181             ushort SDL_GameControllerGetProduct(SDL_GameController* gamecontroller);
182             ushort SDL_GameControllerGetProductVersion(SDL_GameController* gamecontroller);
183             ushort SDL_GameControllerGetVendor(SDL_GameController* gamecontroller);
184             char* SDL_GameControllerMappingForIndex(int mapping_index);
185             int SDL_GameControllerNumMappings();
186         }
187         static if(sdlSupport >= SDLSupport.sdl209) {
188             char* SDL_GameControllerMappingForDeviceIndex(int joystick_index);
189             int SDL_GameControllerRumble(SDL_GameController* gamecontroller, ushort low_frequency_rumble, ushort high_frequency_rumble, uint duration_ms);
190         }
191         static if(sdlSupport >= SDLSupport.sdl2010) {
192             int SDL_GameControllerGetPlayerIndex(SDL_GameController* gamecontroller);
193         }
194         static if(sdlSupport >= SDLSupport.sdl2012) {
195             SDL_GameControllerType SDL_GameControllerTypeForIndex(int joystick_index);
196             SDL_GameController* SDL_GameControllerFromPlayerIndex(int player_index);
197             SDL_GameControllerType SDL_GameControllerGetType(SDL_GameController* gamecontroller);
198             void SDL_GameControllerSetPlayerIndex(SDL_GameController* gamecontroller, int player_index);
199         }
200         static if(sdlSupport >= SDLSupport.sdl2014) {
201             SDL_bool SDL_GameControllerHasAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
202             SDL_bool SDL_GameControllerHasButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
203             int SDL_GameControllerGetNumTouchpads(SDL_GameController* gamecontroller);
204             int SDL_GameControllerGetNumTouchpadFingers (SDL_GameController* gamecontroller, int touchpad);
205             int SDL_GameControllerGetTouchpadFinger(SDL_GameController* gamecontroller, int touchpad, int finger, ubyte* state, float* x, float* y, float* pressure);
206             SDL_bool SDL_GameControllerHasSensor(SDL_GameController* gamecontroller, SDL_SensorType type);
207             int SDL_GameControllerSetSensorEnabled(SDL_GameController* gamecontroller, SDL_SensorType type, SDL_bool enabled);
208             SDL_bool SDL_GameControllerIsSensorEnabled(SDL_GameController* gamecontroller, SDL_SensorType type);
209             int SDL_GameControllerGetSensorData(SDL_GameController* gamecontroller, SDL_SensorType type, float* data, int num_values);
210             int SDL_GameControllerRumbleTriggers(SDL_GameController* gamecontroller, ushort left_rumble, ushort right_rumble, uint duration_ms);
211             SDL_bool SDL_GameControllerHasLED(SDL_GameController* gamecontroller);
212             int SDL_GameControllerSetLED(SDL_GameController* gamecontroller, ubyte red, ubyte green, ubyte blue);
213         }
214         static if(sdlSupport >= SDLSupport.sdl2016) {
215             int SDL_GameControllerSendEffect(SDL_GameController* gamecontroller, const(void)* data, int size);
216             float SDL_GameControllerGetSensorDataRate(SDL_GameController* gamecontroller, SDL_SensorType type);
217         }
218         static if(sdlSupport >= SDLSupport.sdl2018) {
219             SDL_bool SDL_GameControllerHasRumble(SDL_GameController* gamecontroller);
220             SDL_bool SDL_GameControllerHasRumbleTriggers(SDL_GameController* gamecontroller);
221             const(char)* SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
222             const(char)* SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
223         }
224     }
225 }
226 else {
227     extern(C) @nogc nothrow {
228         alias pSDL_GameControllerAddMapping = int function(const(char)* mappingString);
229         alias pSDL_GameControllerMappingForGUID = char* function(SDL_JoystickGUID guid);
230         alias pSDL_GameControllerMapping = char* function(SDL_GameController* gamecontroller);
231         alias pSDL_IsGameController = SDL_bool function(int joystick_index);
232         alias pSDL_GameControllerNameForIndex = const(char)* function(int joystick_index);
233         alias pSDL_GameControllerOpen = SDL_GameController* function(int joystick_index);
234         alias pSDL_GameControllerName = const(char)* function(SDL_GameController* gamecontroller);
235         alias pSDL_GameControllerGetAttached = SDL_bool function(SDL_GameController* gamecontroller);
236         alias pSDL_GameControllerGetJoystick = SDL_Joystick* function(SDL_GameController* gamecontroller);
237         alias pSDL_GameControllerEventState = int function(int state);
238         alias pSDL_GameControllerUpdate = void function();
239         alias pSDL_GameControllerGetAxisFromString = SDL_GameControllerAxis function(const(char)* pchString);
240         alias pSDL_GameControllerGetStringForAxis = const(char)* function(SDL_GameControllerAxis axis);
241         alias pSDL_GameControllerGetBindForAxis = SDL_GameControllerButtonBind function(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
242         alias pSDL_GameControllerGetAxis = short function(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
243         alias pSDL_GameControllerGetButtonFromString = SDL_GameControllerButton function(const(char*) pchString);
244         alias pSDL_GameControllerGetStringForButton = const(char)* function(SDL_GameControllerButton button);
245         alias pSDL_GameControllerGetBindForButton = SDL_GameControllerButtonBind function(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
246         alias pSDL_GameControllerGetButton = ubyte function(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
247         alias pSDL_GameControllerClose = void function(SDL_GameController* gamecontroller);
248     }
249     __gshared {
250         pSDL_GameControllerAddMapping SDL_GameControllerAddMapping;
251         pSDL_GameControllerMappingForGUID SDL_GameControllerMappingForGUID;
252         pSDL_GameControllerMapping SDL_GameControllerMapping;
253         pSDL_IsGameController SDL_IsGameController;
254         pSDL_GameControllerNameForIndex SDL_GameControllerNameForIndex;
255         pSDL_GameControllerOpen SDL_GameControllerOpen;
256         pSDL_GameControllerName SDL_GameControllerName;
257         pSDL_GameControllerGetAttached SDL_GameControllerGetAttached;
258         pSDL_GameControllerGetJoystick SDL_GameControllerGetJoystick;
259         pSDL_GameControllerEventState SDL_GameControllerEventState;
260         pSDL_GameControllerUpdate SDL_GameControllerUpdate;
261         pSDL_GameControllerGetAxisFromString SDL_GameControllerGetAxisFromString;
262         pSDL_GameControllerGetStringForAxis SDL_GameControllerGetStringForAxis;
263         pSDL_GameControllerGetBindForAxis SDL_GameControllerGetBindForAxis;
264         pSDL_GameControllerGetAxis SDL_GameControllerGetAxis;
265         pSDL_GameControllerGetButtonFromString SDL_GameControllerGetButtonFromString;
266         pSDL_GameControllerGetStringForButton SDL_GameControllerGetStringForButton;
267         pSDL_GameControllerGetBindForButton SDL_GameControllerGetBindForButton;
268         pSDL_GameControllerGetButton SDL_GameControllerGetButton;
269         pSDL_GameControllerClose SDL_GameControllerClose;
270     }
271     static if(sdlSupport >= SDLSupport.sdl202) {
272         extern(C) @nogc nothrow {
273             alias pSDL_GameControllerAddMappingsFromRW = int function(SDL_RWops* rw, int freerw);
274         }
275 
276         __gshared {
277             pSDL_GameControllerAddMappingsFromRW SDL_GameControllerAddMappingsFromRW;
278         }
279     }
280     static if(sdlSupport >= SDLSupport.sdl204) {
281         extern(C) @nogc nothrow {
282             alias pSDL_GameControllerFromInstanceID = SDL_GameController* function(SDL_JoystickID joyid);
283         }
284 
285         __gshared {
286             pSDL_GameControllerFromInstanceID SDL_GameControllerFromInstanceID;
287         }
288     }
289     static if(sdlSupport >= SDLSupport.sdl206) {
290         extern(C) @nogc nothrow {
291             alias pSDL_GameControllerGetProduct = ushort function(SDL_GameController* gamecontroller);
292             alias pSDL_GameControllerGetProductVersion = ushort function(SDL_GameController* gamecontroller);
293             alias pSDL_GameControllerGetVendor = ushort function(SDL_GameController* gamecontroller);
294             alias pSDL_GameControllerMappingForIndex = char* function(int mapping_index);
295             alias pSDL_GameControllerNumMappings = int function();
296         }
297 
298         __gshared {
299             pSDL_GameControllerGetProduct SDL_GameControllerGetProduct;
300             pSDL_GameControllerGetProductVersion SDL_GameControllerGetProductVersion;
301             pSDL_GameControllerGetVendor SDL_GameControllerGetVendor;
302             pSDL_GameControllerMappingForIndex SDL_GameControllerMappingForIndex;
303             pSDL_GameControllerNumMappings SDL_GameControllerNumMappings;
304         }
305     }
306     static if(sdlSupport >= SDLSupport.sdl209) {
307         extern(C) @nogc nothrow {
308             alias pSDL_GameControllerMappingForDeviceIndex = char* function(int joystick_index);
309             alias pSDL_GameControllerRumble = int function(SDL_GameController* gamecontroller, ushort low_frequency_rumble, ushort high_frequency_rumble, uint duration_ms);
310         }
311 
312         __gshared {
313             pSDL_GameControllerMappingForDeviceIndex SDL_GameControllerMappingForDeviceIndex;
314             pSDL_GameControllerRumble SDL_GameControllerRumble;
315         }
316     }
317     static if(sdlSupport >= SDLSupport.sdl2010) {
318         extern(C) @nogc nothrow {
319             alias pSDL_GameControllerGetPlayerIndex = int function(SDL_GameController* gamecontroller);
320         }
321         __gshared {
322             pSDL_GameControllerGetPlayerIndex SDL_GameControllerGetPlayerIndex;
323         }
324     }
325     static if(sdlSupport >= SDLSupport.sdl2012) {
326         extern(C) @nogc nothrow {
327             alias pSDL_GameControllerTypeForIndex = SDL_GameControllerType function(int joystick_index);
328             alias pSDL_GameControllerFromPlayerIndex = SDL_GameController* function(int player_index);
329             alias pSDL_GameControllerGetType = SDL_GameControllerType function(SDL_GameController* gamecontroller);
330             alias pSDL_GameControllerSetPlayerIndex = void function(SDL_GameController* gamecontroller, int player_index);
331 
332         }
333         __gshared {
334             pSDL_GameControllerTypeForIndex SDL_GameControllerTypeForIndex;
335             pSDL_GameControllerFromPlayerIndex SDL_GameControllerFromPlayerIndex;
336             pSDL_GameControllerGetType SDL_GameControllerGetType;
337             pSDL_GameControllerSetPlayerIndex SDL_GameControllerSetPlayerIndex;
338         }
339     }
340     static if(sdlSupport >= SDLSupport.sdl2014) {
341         extern(C) @nogc nothrow {
342             alias pSDL_GameControllerHasAxis = SDL_bool function(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
343             alias pSDL_GameControllerHasButton = SDL_bool function(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
344             alias pSDL_GameControllerGetNumTouchpads = int function(SDL_GameController* gamecontroller);
345             alias pSDL_GameControllerGetNumTouchpadFingers = int function(SDL_GameController* gamecontroller, int touchpad);
346             alias pSDL_GameControllerGetTouchpadFinger = int function(SDL_GameController* gamecontroller, int touchpad, int finger, ubyte* state, float* x, float* y, float* pressure);
347             alias pSDL_GameControllerHasSensor = SDL_bool function(SDL_GameController* gamecontroller, SDL_SensorType type);
348             alias pSDL_GameControllerSetSensorEnabled = int function(SDL_GameController* gamecontroller, SDL_SensorType type, SDL_bool enabled);
349             alias pSDL_GameControllerIsSensorEnabled = SDL_bool function(SDL_GameController* gamecontroller, SDL_SensorType type);
350             alias pSDL_GameControllerGetSensorData = int function(SDL_GameController* gamecontroller, SDL_SensorType type, float* data, int num_values);
351             alias pSDL_GameControllerRumbleTriggers = int function(SDL_GameController* gamecontroller, ushort left_rumble, ushort right_rumble, uint duration_ms);
352             alias pSDL_GameControllerHasLED = SDL_bool function(SDL_GameController* gamecontroller);
353             alias pSDL_GameControllerSetLED = int function(SDL_GameController* gamecontroller, ubyte red, ubyte green, ubyte blue);
354         }
355         __gshared {
356             pSDL_GameControllerHasAxis SDL_GameControllerHasAxis;
357             pSDL_GameControllerHasButton SDL_GameControllerHasButton;
358             pSDL_GameControllerGetNumTouchpads SDL_GameControllerGetNumTouchpads;
359             pSDL_GameControllerGetNumTouchpadFingers SDL_GameControllerGetNumTouchpadFingers;
360             pSDL_GameControllerGetTouchpadFinger SDL_GameControllerGetTouchpadFinger;
361             pSDL_GameControllerHasSensor SDL_GameControllerHasSensor;
362             pSDL_GameControllerSetSensorEnabled SDL_GameControllerSetSensorEnabled;
363             pSDL_GameControllerIsSensorEnabled SDL_GameControllerIsSensorEnabled;
364             pSDL_GameControllerGetSensorData SDL_GameControllerGetSensorData;
365             pSDL_GameControllerRumbleTriggers SDL_GameControllerRumbleTriggers;
366             pSDL_GameControllerHasLED SDL_GameControllerHasLED;
367             pSDL_GameControllerSetLED SDL_GameControllerSetLED;
368         }
369     }
370     static if(sdlSupport >= SDLSupport.sdl2016) {
371         extern(C) @nogc nothrow {
372             alias pSDL_GameControllerSendEffect = int function(SDL_GameController* gamecontroller, const(void)* data, int size);
373             alias pSDL_GameControllerGetSensorDataRate = int function(SDL_GameController* gamecontroller, SDL_SensorType type);
374         }
375         __gshared {
376             pSDL_GameControllerSendEffect SDL_GameControllerSendEffect;
377             pSDL_GameControllerGetSensorDataRate SDL_GameControllerGetSensorDataRate;
378         }
379     }
380     static if(sdlSupport >= SDLSupport.sdl2018){
381         extern(C) @nogc nothrow {
382             alias pSDL_GameControllerHasRumble = SDL_bool function(SDL_GameController* gamecontroller);
383             alias pSDL_GameControllerHasRumbleTriggers = SDL_bool function(SDL_GameController* gamecontroller);
384             alias pSDL_GameControllerGetAppleSFSymbolsNameForButton = const(char)* function(SDL_GameController* gamecontroller, SDL_GameControllerButton button);
385             alias pSDL_GameControllerGetAppleSFSymbolsNameForAxis = const(char)* function(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis);
386         }
387         __gshared {
388             pSDL_GameControllerHasRumble SDL_GameControllerHasRumble;
389             pSDL_GameControllerHasRumbleTriggers SDL_GameControllerHasRumbleTriggers;
390             pSDL_GameControllerGetAppleSFSymbolsNameForButton SDL_GameControllerGetAppleSFSymbolsNameForButton;
391             pSDL_GameControllerGetAppleSFSymbolsNameForAxis SDL_GameControllerGetAppleSFSymbolsNameForAxis;
392         }
393     }
394 }