1 
2 //          Copyright Michael D. Parker 2018.
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 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
14 
15 struct SDL_GameController;
16 
17 static if(sdlSupport >= SDLSupport.sdl2012) {
18     enum SDL_GameControllerType {
19         SDL_CONTROLLER_TYPE_UNKNOWN = 0,
20         SDL_CONTROLLER_TYPE_XBOX360,
21         SDL_CONTROLLER_TYPE_XBOXONE,
22         SDL_CONTROLLER_TYPE_PS3,
23         SDL_CONTROLLER_TYPE_PS4,
24         SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO,
25     }
26     mixin(expandEnum!SDL_GameControllerType);
27 }
28 
29 enum SDL_GameControllerBindType {
30     SDL_CONTROLLER_BINDTYPE_NONE = 0,
31     SDL_CONTROLLER_BINDTYPE_BUTTON,
32     SDL_CONTROLLER_BINDTYPE_AXIS,
33     SDL_CONTROLLER_BINDTYPE_HAT,
34 }
35 mixin(expandEnum!SDL_GameControllerBindType);
36 
37 struct SDL_GameControllerButtonBind {
38     SDL_GameControllerBindType bindType;
39     union value {
40         int button;
41         int axis;
42         struct hat {
43             int hat;
44             int hat_mask;
45         }
46     }
47     alias button = value.button;
48     alias axis = value.axis;
49     alias hat = value.hat;
50 }
51 
52 enum SDL_GameControllerAxis {
53     SDL_CONTROLLER_AXIS_INVALID = -1,
54     SDL_CONTROLLER_AXIS_LEFTX,
55     SDL_CONTROLLER_AXIS_LEFTY,
56     SDL_CONTROLLER_AXIS_RIGHTX,
57     SDL_CONTROLLER_AXIS_RIGHTY,
58     SDL_CONTROLLER_AXIS_TRIGGERLEFT,
59     SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
60     SDL_CONTROLLER_AXIS_MAX
61 }
62 mixin(expandEnum!SDL_GameControllerAxis);
63 
64 enum SDL_GameControllerButton {
65     SDL_CONTROLLER_BUTTON_INVALID = -1,
66     SDL_CONTROLLER_BUTTON_A,
67     SDL_CONTROLLER_BUTTON_B,
68     SDL_CONTROLLER_BUTTON_X,
69     SDL_CONTROLLER_BUTTON_Y,
70     SDL_CONTROLLER_BUTTON_BACK,
71     SDL_CONTROLLER_BUTTON_GUIDE,
72     SDL_CONTROLLER_BUTTON_START,
73     SDL_CONTROLLER_BUTTON_LEFTSTICK,
74     SDL_CONTROLLER_BUTTON_RIGHTSTICK,
75     SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
76     SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
77     SDL_CONTROLLER_BUTTON_DPAD_UP,
78     SDL_CONTROLLER_BUTTON_DPAD_DOWN,
79     SDL_CONTROLLER_BUTTON_DPAD_LEFT,
80     SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
81     SDL_CONTROLLER_BUTTON_MAX
82 }
83 mixin(expandEnum!SDL_GameControllerButton);
84 
85 static if(sdlSupport >= SDLSupport.sdl202) {
86     @nogc nothrow
87     int SDL_GameControllerAddMappingsFromFile(const(char)* file) {
88         pragma(inline, true);
89         return SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file,"rb"),1);
90     }
91 }
92 
93 static if(staticBinding) {
94     extern(C) @nogc nothrow {
95         int SDL_GameControllerAddMapping(const(char)*);
96         char* SDL_GameControllerMappingForGUID(SDL_JoystickGUID);
97         char* SDL_GameControllerMapping(SDL_GameController*);
98         SDL_bool SDL_IsGameController(int);
99         const(char)* SDL_GameControllerNameForIndex(int);
100         SDL_GameController* SDL_GameControllerOpen(int);
101         const(char)* SDL_GameControllerName(SDL_GameController*);
102         SDL_bool SDL_GameControllerGetAttached(SDL_GameController*);
103         SDL_Joystick* SDL_GameControllerGetJoystick(SDL_GameController*);
104         int SDL_GameControllerEventState(int);
105         void SDL_GameControllerUpdate();
106         SDL_GameControllerAxis SDL_GameControllerGetAxisFromString(const(char)*);
107         const(char)* SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis);
108         SDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis(SDL_GameController*,SDL_GameControllerAxis);
109         short SDL_GameControllerGetAxis(SDL_GameController*,SDL_GameControllerAxis);
110         SDL_GameControllerButton SDL_GameControllerGetButtonFromString(const(char*));
111         const(char)* SDL_GameControllerGetStringForButton(SDL_GameControllerButton);
112         SDL_GameControllerButtonBind SDL_GameControllerGetBindForButton(SDL_GameController*,SDL_GameControllerButton);
113         ubyte SDL_GameControllerGetButton(SDL_GameController*,SDL_GameControllerButton);
114         void SDL_GameControllerClose(SDL_GameController*);
115 
116         static if(sdlSupport >= SDLSupport.sdl202) {
117             int SDL_GameControllerAddMappingsFromRW(SDL_RWops*,int);
118         }
119         static if(sdlSupport >= SDLSupport.sdl204) {
120             SDL_GameController* SDL_GameControllerFromInstanceID(SDL_JoystickID);
121         }
122         static if(sdlSupport >= SDLSupport.sdl206) {
123             ushort SDL_GameControllerGetProduct(SDL_GameController*);
124             ushort SDL_GameControllerGetProductVersion(SDL_GameController*);
125             ushort SDL_GameControllerGetVendor(SDL_GameController*);
126             char* SDL_GameControllerMappingForIndex(int);
127             int SDL_GameControllerNumMappings();
128         }
129         static if(sdlSupport >= SDLSupport.sdl209) {
130             char* SDL_GameControllerMappingForDeviceIndex(int);
131             int SDL_GameControllerRumble(SDL_GameController*,ushort,ushort,uint);
132         }
133         static if(sdlSupport >= SDLSupport.sdl2010) {
134             int SDL_GameControllerGetPlayerIndex(SDL_GameController*);
135         }
136         static if(sdlSupport >= SDLSupport.sdl2012) {
137             SDL_GameControllerType SDL_GameControllerTypeForIndex(int);
138             SDL_GameController* SDL_GameControllerFromPlayerIndex(int);
139             SDL_GameControllerType SDL_GameControllerGetType(SDL_GameController*);
140             void SDL_GameControllerSetPlayerIndex(SDL_GameController*,int);
141         }
142     }
143 }
144 else {
145     extern(C) @nogc nothrow {
146         alias pSDL_GameControllerAddMapping = int function(const(char)*);
147         alias pSDL_GameControllerMappingForGUID = char* function(SDL_JoystickGUID);
148         alias pSDL_GameControllerMapping = char* function(SDL_GameController*);
149         alias pSDL_IsGameController = SDL_bool function(int);
150         alias pSDL_GameControllerNameForIndex = const(char)* function(int);
151         alias pSDL_GameControllerOpen = SDL_GameController* function(int);
152         alias pSDL_GameControllerName = const(char)* function(SDL_GameController*);
153         alias pSDL_GameControllerGetAttached = SDL_bool function(SDL_GameController*);
154         alias pSDL_GameControllerGetJoystick = SDL_Joystick* function(SDL_GameController*);
155         alias pSDL_GameControllerEventState = int function(int);
156         alias pSDL_GameControllerUpdate = void function();
157         alias pSDL_GameControllerGetAxisFromString = SDL_GameControllerAxis function(const(char)*);
158         alias pSDL_GameControllerGetStringForAxis = const(char)* function(SDL_GameControllerAxis);
159         alias pSDL_GameControllerGetBindForAxis = SDL_GameControllerButtonBind function(SDL_GameController*,SDL_GameControllerAxis);
160         alias pSDL_GameControllerGetAxis = short function(SDL_GameController*,SDL_GameControllerAxis);
161         alias pSDL_GameControllerGetButtonFromString = SDL_GameControllerButton function(const(char*));
162         alias pSDL_GameControllerGetStringForButton = const(char)* function(SDL_GameControllerButton);
163         alias pSDL_GameControllerGetBindForButton = SDL_GameControllerButtonBind function(SDL_GameController*,SDL_GameControllerButton);
164         alias pSDL_GameControllerGetButton = ubyte function(SDL_GameController*,SDL_GameControllerButton);
165         alias pSDL_GameControllerClose = void function(SDL_GameController*);
166     }
167     __gshared {
168         pSDL_GameControllerAddMapping SDL_GameControllerAddMapping;
169         pSDL_GameControllerMappingForGUID SDL_GameControllerMappingForGUID;
170         pSDL_GameControllerMapping SDL_GameControllerMapping;
171         pSDL_IsGameController SDL_IsGameController;
172         pSDL_GameControllerNameForIndex SDL_GameControllerNameForIndex;
173         pSDL_GameControllerOpen SDL_GameControllerOpen;
174         pSDL_GameControllerName SDL_GameControllerName;
175         pSDL_GameControllerGetAttached SDL_GameControllerGetAttached;
176         pSDL_GameControllerGetJoystick SDL_GameControllerGetJoystick;
177         pSDL_GameControllerEventState SDL_GameControllerEventState;
178         pSDL_GameControllerUpdate SDL_GameControllerUpdate;
179         pSDL_GameControllerGetAxisFromString SDL_GameControllerGetAxisFromString;
180         pSDL_GameControllerGetStringForAxis SDL_GameControllerGetStringForAxis;
181         pSDL_GameControllerGetBindForAxis SDL_GameControllerGetBindForAxis;
182         pSDL_GameControllerGetAxis SDL_GameControllerGetAxis;
183         pSDL_GameControllerGetButtonFromString SDL_GameControllerGetButtonFromString;
184         pSDL_GameControllerGetStringForButton SDL_GameControllerGetStringForButton;
185         pSDL_GameControllerGetBindForButton SDL_GameControllerGetBindForButton;
186         pSDL_GameControllerGetButton SDL_GameControllerGetButton;
187         pSDL_GameControllerClose SDL_GameControllerClose;
188     }
189     static if(sdlSupport >= SDLSupport.sdl202) {
190         extern(C) @nogc nothrow {
191             alias pSDL_GameControllerAddMappingsFromRW = int function(SDL_RWops*,int);
192         }
193 
194         __gshared {
195             pSDL_GameControllerAddMappingsFromRW SDL_GameControllerAddMappingsFromRW;
196         }
197     }
198     static if(sdlSupport >= SDLSupport.sdl204) {
199         extern(C) @nogc nothrow {
200             alias pSDL_GameControllerFromInstanceID = SDL_GameController* function(SDL_JoystickID);
201         }
202 
203         __gshared {
204             pSDL_GameControllerFromInstanceID SDL_GameControllerFromInstanceID;
205         }
206     }
207     static if(sdlSupport >= SDLSupport.sdl206) {
208         extern(C) @nogc nothrow {
209             alias pSDL_GameControllerGetProduct = ushort function(SDL_GameController*);
210             alias pSDL_GameControllerGetProductVersion = ushort function(SDL_GameController*);
211             alias pSDL_GameControllerGetVendor = ushort function(SDL_GameController*);
212             alias pSDL_GameControllerMappingForIndex = char* function(int);
213             alias pSDL_GameControllerNumMappings = int function();
214         }
215 
216         __gshared {
217             pSDL_GameControllerGetProduct SDL_GameControllerGetProduct;
218             pSDL_GameControllerGetProductVersion SDL_GameControllerGetProductVersion;
219             pSDL_GameControllerGetVendor SDL_GameControllerGetVendor;
220             pSDL_GameControllerMappingForIndex SDL_GameControllerMappingForIndex;
221             pSDL_GameControllerNumMappings SDL_GameControllerNumMappings;
222         }
223     }
224     static if(sdlSupport >= SDLSupport.sdl209) {
225         extern(C) @nogc nothrow {
226             alias pSDL_GameControllerMappingForDeviceIndex = char* function(int);
227             alias pSDL_GameControllerRumble = int function(SDL_GameController*,ushort,ushort,uint);
228         }
229 
230         __gshared {
231             pSDL_GameControllerMappingForDeviceIndex SDL_GameControllerMappingForDeviceIndex;
232             pSDL_GameControllerRumble SDL_GameControllerRumble;
233         }
234     }
235     static if(sdlSupport >= SDLSupport.sdl2010) {
236         extern(C) @nogc nothrow {
237             alias pSDL_GameControllerGetPlayerIndex = int function(SDL_GameController*);
238         }
239         __gshared {
240             pSDL_GameControllerGetPlayerIndex SDL_GameControllerGetPlayerIndex;
241         }
242     }
243     static if(sdlSupport >= SDLSupport.sdl2012) {
244         extern(C) @nogc nothrow {
245             alias pSDL_GameControllerTypeForIndex = SDL_GameControllerType function(int);
246             alias pSDL_GameControllerFromPlayerIndex = SDL_GameController* function(int);
247             alias pSDL_GameControllerGetType = SDL_GameControllerType function(SDL_GameController*);
248             alias pSDL_GameControllerSetPlayerIndex = void function(SDL_GameController*,int);
249 
250         }
251         __gshared {
252             pSDL_GameControllerTypeForIndex SDL_GameControllerTypeForIndex;
253             pSDL_GameControllerFromPlayerIndex SDL_GameControllerFromPlayerIndex;
254             pSDL_GameControllerGetType SDL_GameControllerGetType;
255             pSDL_GameControllerSetPlayerIndex SDL_GameControllerSetPlayerIndex;
256         }
257     }
258 }