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 }