21 #include "../SDL_internal.h"
33 #if !SDL_EVENTS_DISABLED
34 #include "../events/SDL_events_c.h"
37 #if defined(__ANDROID__)
43 #define SDL_MINIMUM_GUIDE_BUTTON_DELAY_MS 250
45 #define SDL_CONTROLLER_PLATFORM_FIELD "platform:"
46 #define SDL_CONTROLLER_HINT_FIELD "hint:"
47 #define SDL_CONTROLLER_SDKGE_FIELD "sdk>=:"
48 #define SDL_CONTROLLER_SDKLE_FIELD "sdk<=:"
96 typedef struct _ControllerMapping_t
102 struct _ControllerMapping_t *
next;
146 if (hint && *hint ==
'@') {
168 if (entries ==
NULL) {
211 if (num_events <= 0) {
221 for (
i = 0;
i < num_events; ++
i) {
222 if (
events[
i].cdevice.which < device_index) {
225 else if (
events[
i].cdevice.which == device_index) {
243 if (
a->outputType !=
b->outputType) {
248 return (
a->output.axis.axis ==
b->output.axis.axis);
250 return (
a->output.button ==
b->output.button);
289 if (last_match && (!match || !
HasSameOutput(last_match, match))) {
343 if ((changed_mask & binding->
input.
hat.hat_mask) != 0) {
390 switch(
event->type) {
394 while (controllerlist) {
395 if (controllerlist->joystick->instance_id ==
event->jaxis.which) {
399 controllerlist = controllerlist->next;
407 while (controllerlist) {
408 if (controllerlist->joystick->instance_id ==
event->jbutton.which) {
412 controllerlist = controllerlist->next;
419 while (controllerlist) {
420 if (controllerlist->joystick->instance_id ==
event->jhat.which) {
424 controllerlist = controllerlist->next;
441 int device_index = 0;
442 while (controllerlist) {
443 if (controllerlist->joystick->instance_id ==
event->jdevice.which) {
455 controllerlist = controllerlist->next;
474 char mapping_string[1024];
480 if (!button_mask && !axis_mask) {
485 SDL_strlcpy(mapping_string,
"none,*,",
sizeof(mapping_string));
488 SDL_strlcat(mapping_string,
"a:b0,",
sizeof(mapping_string));
491 SDL_strlcat(mapping_string,
"b:b1,",
sizeof(mapping_string));
494 SDL_strlcat(mapping_string,
"b:b4,",
sizeof(mapping_string));
498 SDL_strlcat(mapping_string,
"x:b2,",
sizeof(mapping_string));
501 SDL_strlcat(mapping_string,
"y:b3,",
sizeof(mapping_string));
504 SDL_strlcat(mapping_string,
"back:b4,",
sizeof(mapping_string));
509 SDL_strlcat(mapping_string,
"guide:b5,",
sizeof(mapping_string));
513 SDL_strlcat(mapping_string,
"start:b6,",
sizeof(mapping_string));
516 SDL_strlcat(mapping_string,
"leftstick:b7,",
sizeof(mapping_string));
519 SDL_strlcat(mapping_string,
"rightstick:b8,",
sizeof(mapping_string));
522 SDL_strlcat(mapping_string,
"leftshoulder:b9,",
sizeof(mapping_string));
525 SDL_strlcat(mapping_string,
"rightshoulder:b10,",
sizeof(mapping_string));
528 SDL_strlcat(mapping_string,
"dpup:b11,",
sizeof(mapping_string));
531 SDL_strlcat(mapping_string,
"dpdown:b12,",
sizeof(mapping_string));
534 SDL_strlcat(mapping_string,
"dpleft:b13,",
sizeof(mapping_string));
537 SDL_strlcat(mapping_string,
"dpright:b14,",
sizeof(mapping_string));
540 SDL_strlcat(mapping_string,
"leftx:a0,",
sizeof(mapping_string));
543 SDL_strlcat(mapping_string,
"lefty:a1,",
sizeof(mapping_string));
546 SDL_strlcat(mapping_string,
"rightx:a2,",
sizeof(mapping_string));
549 SDL_strlcat(mapping_string,
"righty:a3,",
sizeof(mapping_string));
552 SDL_strlcat(mapping_string,
"lefttrigger:a4,",
sizeof(mapping_string));
555 SDL_strlcat(mapping_string,
"righttrigger:a5,",
sizeof(mapping_string));
569 char mapping_string[1024];
573 SDL_strlcpy(mapping_string,
"none,*,",
sizeof(mapping_string));
579 SDL_strlcat(mapping_string,
"a:b0,b:b1,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3,start:b8,x:b2,y:b3,",
sizeof(mapping_string));
584 SDL_strlcat(mapping_string,
"a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,",
sizeof(mapping_string));
587 SDL_strlcat(mapping_string,
"a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,",
sizeof(mapping_string));
592 SDL_strlcat(mapping_string,
"misc1:b15,",
sizeof(mapping_string));
595 SDL_strlcat(mapping_string,
"paddle1:b15,paddle2:b17,paddle3:b16,paddle4:b18,",
sizeof(mapping_string));
598 SDL_strlcat(mapping_string,
"paddle1:b16,paddle2:b15,",
sizeof(mapping_string));
603 SDL_strlcat(mapping_string,
"touchpad:b15,",
sizeof(mapping_string));
607 SDL_strlcat(mapping_string,
"misc1:b15,touchpad:b16",
sizeof(mapping_string));
611 SDL_strlcat(mapping_string,
"misc1:b15,",
sizeof(mapping_string));
629 char mapping_string[1024];
631 SDL_strlcpy(mapping_string,
"none,*,",
sizeof(mapping_string));
632 SDL_strlcat(mapping_string,
"a:b0,b:b1,x:b2,y:b3,back:b6,guide:b10,start:b7,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,",
sizeof(mapping_string));
653 #if SDL_JOYSTICK_XINPUT
661 mapping = SDL_CreateMappingForAndroidController(guid);
691 if (pchString && (*pchString ==
'+' || *pchString ==
'-')) {
695 if (!pchString || !pchString[0]) {
748 if (!pchString || !pchString[0])
778 char half_axis_input = 0;
779 char half_axis_output = 0;
781 if (*szGameButton ==
'+' || *szGameButton ==
'-') {
782 half_axis_output = *szGameButton++;
794 if (half_axis_output ==
'+') {
797 }
else if (half_axis_output ==
'-') {
809 SDL_SetError(
"Unexpected controller element %s", szGameButton);
813 if (*szJoystickButton ==
'+' || *szJoystickButton ==
'-') {
814 half_axis_input = *szJoystickButton++;
816 if (szJoystickButton[
SDL_strlen(szJoystickButton) - 1] ==
'~') {
820 if (szJoystickButton[0] ==
'a' &&
SDL_isdigit(szJoystickButton[1])) {
823 if (half_axis_input ==
'+') {
826 }
else if (half_axis_input ==
'-') {
838 }
else if (szJoystickButton[0] ==
'b' &&
SDL_isdigit(szJoystickButton[1])) {
841 }
else if (szJoystickButton[0] ==
'h' &&
SDL_isdigit(szJoystickButton[1]) &&
842 szJoystickButton[2] ==
'.' &&
SDL_isdigit(szJoystickButton[3])) {
843 int hat =
SDL_atoi(&szJoystickButton[1]);
849 SDL_SetError(
"Unexpected joystick element: %s", szJoystickButton);
870 char szGameButton[20];
871 char szJoystickButton[20];
874 const char *pchPos = pchString;
879 while (pchPos && *pchPos) {
880 if (*pchPos ==
':') {
883 }
else if (*pchPos ==
' ') {
885 }
else if (*pchPos ==
',') {
892 }
else if (bGameButton) {
893 if (
i >=
sizeof(szGameButton)) {
894 SDL_SetError(
"Button name too large: %s", szGameButton);
897 szGameButton[
i] = *pchPos;
900 if (
i >=
sizeof(szJoystickButton)) {
901 SDL_SetError(
"Joystick button name too large: %s", szJoystickButton);
904 szJoystickButton[
i] = *pchPos;
911 if (szGameButton[0] !=
'\0' || szJoystickButton[0] !=
'\0') {
952 const char *pFirstComma =
SDL_strchr(pMapping,
',');
954 char *pchGUID =
SDL_malloc(pFirstComma - pMapping + 1);
959 SDL_memcpy(pchGUID, pMapping, pFirstComma - pMapping);
960 pchGUID[pFirstComma - pMapping] =
'\0';
965 SDL_memcmp(&pchGUID[20],
"504944564944", 12) == 0) {
973 SDL_memcmp(&pchGUID[4],
"000000000000", 12) == 0 &&
974 SDL_memcmp(&pchGUID[20],
"000000000000", 12) == 0) {
991 const char *pFirstComma, *pSecondComma;
998 pSecondComma =
SDL_strchr(pFirstComma + 1,
',');
1002 pchName =
SDL_malloc(pSecondComma - pFirstComma);
1007 SDL_memcpy(pchName, pFirstComma + 1, pSecondComma - pFirstComma);
1008 pchName[pSecondComma - pFirstComma - 1] = 0;
1018 const char *pFirstComma, *pSecondComma;
1024 pSecondComma =
SDL_strchr(pFirstComma + 1,
',');
1037 while (gamecontrollerlist) {
1038 if (!
SDL_memcmp(&gamecontrollerlist->joystick->guid, &pControllerMapping->
guid,
sizeof(pControllerMapping->
guid))) {
1045 event.cdevice.which = gamecontrollerlist->joystick->instance_id;
1050 gamecontrollerlist = gamecontrollerlist->next;
1066 SDL_SetError(
"Couldn't parse name from %s", mappingString);
1078 if (pControllerMapping) {
1080 if (pControllerMapping->
priority <= priority) {
1083 pControllerMapping->
name = pchName;
1085 pControllerMapping->
mapping = pchMapping;
1086 pControllerMapping->
priority = priority;
1095 pControllerMapping =
SDL_malloc(
sizeof(*pControllerMapping));
1096 if (!pControllerMapping) {
1102 pControllerMapping->
guid = jGUID;
1103 pControllerMapping->
name = pchName;
1104 pControllerMapping->
mapping = pchMapping;
1106 pControllerMapping->
priority = priority;
1114 pPrevMapping = pCurrMapping, pCurrMapping = pCurrMapping->
next ) {
1117 pPrevMapping->
next = pControllerMapping;
1123 return pControllerMapping;
1140 "none,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3",
1158 size_t mapping_string_len,
1159 const char *input_name,
1167 SDL_strlcat(mapping_string, input_name, mapping_string_len);
1168 SDL_strlcat(mapping_string,
":", mapping_string_len);
1184 SDL_strlcat(mapping_string,
",", mapping_string_len);
1192 char name_string[128];
1199 for (spot = name_string; *spot; ++spot) {
1280 char *
buf, *line, *line_end, *tmp, *comma, line_platform[64];
1281 size_t db_size, platform_len;
1293 return SDL_SetError(
"Could not allocate space to read DB into memory");
1308 buf[db_size] =
'\0';
1311 while (line <
buf + db_size) {
1313 if (line_end !=
NULL) {
1316 line_end =
buf + db_size;
1324 if (comma !=
NULL) {
1325 platform_len = comma - tmp + 1;
1336 line = line_end + 1;
1356 if (!mappingString) {
1379 while (*tmp && *tmp !=
',' && *tmp !=
':' &&
len < (
sizeof(hint) - 1)) {
1380 hint[
len++] = *tmp++;
1384 if (tmp[0] ==
':' && tmp[1] ==
'=') {
1424 return SDL_SetError(
"Couldn't parse GUID from %s", mappingString);
1435 if (!pControllerMapping) {
1442 if (is_default_mapping) {
1444 }
else if (is_xinput_mapping) {
1466 int num_mappings = 0;
1475 return num_mappings;
1490 if (mapping_index == 0) {
1491 char *pMappingString;
1499 if (!pMappingString) {
1504 return pMappingString;
1517 char *pMappingString =
NULL;
1526 if (!pMappingString) {
1532 return pMappingString;
1552 if (hint && hint[0]) {
1554 char *pUserMappings =
SDL_malloc(nchHints + 1);
1555 char *pTempMappings = pUserMappings;
1557 pUserMappings[nchHints] =
'\0';
1558 while (pUserMappings) {
1559 char *pchNewLine =
NULL;
1561 pchNewLine =
SDL_strchr(pUserMappings,
'\n');
1568 pUserMappings = pchNewLine + 1;
1570 pUserMappings =
NULL;
1585 if (hint && *hint) {
1589 #if defined(__ANDROID__)
1602 char szControllerMapPath[1024];
1604 const char *pMappingString =
NULL;
1606 while (pMappingString) {
1657 if (pSupportedController) {
1661 return pSupportedController->
name;
1686 char *pMappingString =
NULL;
1700 if (!pMappingString) {
1708 return pMappingString;
1719 if (pSupportedController) {
1732 if (pSupportedController) {
1749 #if defined(__LINUX__)
1766 #if defined(__LINUX__)
1767 bSteamVirtualGamepad = (vendor == 0x28DE && product == 0x11FF);
1768 #elif defined(__MACOSX__)
1769 bSteamVirtualGamepad = (vendor == 0x045E && product == 0x028E && version == 1);
1770 #elif defined(__WIN32__)
1774 if (bSteamVirtualGamepad) {
1805 SDL_GameController *
1810 SDL_GameController *gamecontrollerlist;
1818 while (gamecontrollerlist) {
1819 if (instance_id == gamecontrollerlist->joystick->instance_id) {
1825 gamecontrollerlist = gamecontrollerlist->next;
1830 if (!pSupportedController) {
1831 SDL_SetError(
"Couldn't find mapping for device (%d)", device_index);
1931 if (valid_input_range) {
1946 if (hat_mask & binding->
input.
hat.hat_mask) {
1957 if (
value != 0 && valid_output_range) {
1996 if (valid_input_range) {
2001 if (valid_input_range) {
2037 if (
joystick && touchpad >= 0 && touchpad < joystick->ntouchpads) {
2038 return joystick->touchpads[touchpad].nfingers;
2052 if (touchpad >= 0 && touchpad < joystick->ntouchpads) {
2054 if (finger >= 0 && finger < touchpad_info->nfingers) {
2121 if (
joystick->nsensors_enabled == 0) {
2128 if (
joystick->nsensors_enabled == 1) {
2273 SDL_GameController *
2395 SDL_GameController *gamecontrollerlist, *gamecontrollerlistprev;
2411 gamecontrollerlistprev =
NULL;
2412 while (gamecontrollerlist) {
2414 if (gamecontrollerlistprev) {
2416 gamecontrollerlistprev->next = gamecontrollerlist->next;
2422 gamecontrollerlistprev = gamecontrollerlist;
2423 gamecontrollerlist = gamecontrollerlist->next;
2489 #if !SDL_EVENTS_DISABLED
2494 event.caxis.axis =
axis;
2495 event.caxis.value =
value;
2510 #if !SDL_EVENTS_DISABLED
2549 #if !SDL_EVENTS_DISABLED
2552 event.cbutton.button =
button;
2553 event.cbutton.state =
state;
2566 #if SDL_EVENTS_DISABLED
2569 const Uint32 event_list[] = {
2599 while (controllerlist) {
2600 if (controllerlist->joystick ==
joystick) {
2604 controllerlist = controllerlist->next;
int SDL_GetAndroidSDKVersion(void)
#define SDL_assert(condition)
#define SDL_JoystickGetDeviceInstanceID
#define SDL_JoystickUpdate
#define SDL_JoystickGetSerial
#define SDL_JoystickRumbleTriggers
#define SDL_LockJoysticks
#define SDL_DelHintCallback
#define SDL_JoystickSetPlayerIndex
#define SDL_JoystickGetGUID
#define SDL_JoystickGetPlayerIndex
#define SDL_JoystickNameForIndex
#define SDL_JoystickGetAxis
#define SDL_JoystickClose
#define SDL_DelEventWatch
#define SDL_JoystickRumble
#define SDL_JoystickGetHat
#define SDL_JoystickGetGUIDString
#define SDL_AndroidGetInternalStoragePath
#define SDL_AddEventWatch
#define SDL_JoystickGetDeviceGUID
#define SDL_JoystickGetVendor
#define SDL_JoystickGetAttached
#define SDL_JoystickGetButton
#define SDL_JoystickSetLED
#define SDL_JoystickGetProductVersion
#define SDL_UnlockJoysticks
#define SDL_GetHintBoolean
#define SDL_JoystickGetGUIDFromString
#define SDL_AddHintCallback
#define SDL_JoystickHasLED
#define SDL_JoystickFromPlayerIndex
#define SDL_JoystickGetProduct
#define SDL_OutOfMemory()
#define SDL_Unsupported()
#define SDL_InvalidParamError(param)
@ SDL_CONTROLLERDEVICEADDED
@ SDL_CONTROLLERBUTTONDOWN
@ SDL_CONTROLLERAXISMOTION
@ SDL_CONTROLLERDEVICEREMOVED
@ SDL_CONTROLLERDEVICEREMAPPED
#define SDL_GetEventState(type)
#define SDL_CONTROLLER_HINT_FIELD
static void UpdateEventsForDeviceRemoval(int device_index)
SDL_bool SDL_IsGameController(int device_index)
static ControllerMapping_t * s_pDefaultMapping
SDL_GameController * SDL_GameControllerFromInstanceID(SDL_JoystickID joyid)
SDL_bool SDL_GameControllerHasSensor(SDL_GameController *gamecontroller, SDL_SensorType type)
void SDL_GameControllerQuit(void)
void SDL_GameControllerUpdate(void)
int SDL_GameControllerInit(void)
static void RecenterGameController(SDL_GameController *gamecontroller)
int SDL_GameControllerRumbleTriggers(SDL_GameController *gamecontroller, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms)
int SDL_GameControllerAddMappingsFromRW(SDL_RWops *rw, int freerw)
void SDL_GameControllerHandleDelayedGuideButton(SDL_Joystick *joystick)
static int SDL_PrivateGameControllerButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
void SDL_GameControllerQuitMappings(void)
char * SDL_GameControllerMappingForIndex(int mapping_index)
#define SDL_CONTROLLER_SDKLE_FIELD
const char * SDL_GameControllerName(SDL_GameController *gamecontroller)
static void SDL_PrivateGameControllerParseElement(SDL_GameController *gamecontroller, const char *szGameButton, const char *szJoystickButton)
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
SDL_bool SDL_GameControllerHasLED(SDL_GameController *gamecontroller)
static void SDL_PrivateLoadButtonMapping(SDL_GameController *gamecontroller, const char *pchName, const char *pchMapping)
static ControllerMapping_t * SDL_CreateMappingForRAWINPUTController(SDL_JoystickGUID guid)
SDL_GameControllerType SDL_GameControllerTypeForIndex(int joystick_index)
int SDL_GameControllerNumMappings(void)
void SDL_GameControllerClose(SDL_GameController *gamecontroller)
int SDL_GameControllerEventState(int state)
int SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms)
static ControllerMapping_t * SDL_PrivateGenerateAutomaticControllerMapping(const char *name, SDL_JoystickGUID guid, SDL_GamepadMapping *raw_map)
static void SDL_PrivateGameControllerRefreshMapping(ControllerMapping_t *pControllerMapping)
static ControllerMapping_t * SDL_PrivateGetControllerMapping(int device_index)
static SDL_vidpid_list SDL_allowed_controllers
static void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
static void SDL_PrivateGameControllerParseControllerConfigString(SDL_GameController *gamecontroller, const char *pchString)
static void SDL_GameControllerLoadHints()
SDL_bool SDL_IsGameControllerNameAndGUID(const char *name, SDL_JoystickGUID guid)
SDL_Joystick * SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller)
SDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
static int SDL_GameControllerEventWatcher(void *userdata, SDL_Event *event)
SDL_bool SDL_GameControllerIsSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type)
int SDL_GameControllerGetTouchpadFinger(SDL_GameController *gamecontroller, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure)
static SDL_vidpid_list SDL_ignored_controllers
static ControllerMapping_t * s_pSupportedControllers
static SDL_bool HasSameOutput(SDL_ExtendedGameControllerBind *a, SDL_ExtendedGameControllerBind *b)
static void SDL_PrivateAppendToMappingString(char *mapping_string, size_t mapping_string_len, const char *input_name, SDL_InputMapping *mapping)
SDL_GameControllerButton SDL_GameControllerGetButtonFromString(const char *pchString)
static char * SDL_PrivateGetControllerGUIDFromMappingString(const char *pMapping)
static ControllerMapping_t * SDL_CreateMappingForHIDAPIController(SDL_JoystickGUID guid)
static const char * map_StringForControllerAxis[]
SDL_GameController * SDL_GameControllerFromPlayerIndex(int player_index)
static void ResetOutput(SDL_GameController *gamecontroller, SDL_ExtendedGameControllerBind *bind)
int SDL_GameControllerAddMapping(const char *mappingString)
char * SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid)
static ControllerMapping_t * SDL_PrivateGetControllerMappingForNameAndGUID(const char *name, SDL_JoystickGUID guid)
const char * SDL_GameControllerGetSerial(SDL_GameController *gamecontroller)
SDL_GameControllerAxis SDL_GameControllerGetAxisFromString(const char *pchString)
int SDL_GameControllerGetNumTouchpadFingers(SDL_GameController *gamecontroller, int touchpad)
static SDL_JoystickGUID s_zeroGUID
static void HandleJoystickButton(SDL_GameController *gamecontroller, int button, Uint8 state)
SDL_bool SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
static const char * map_StringForControllerButton[]
static SDL_bool SDL_GetControllerMappingFilePath(char *path, size_t size)
int SDL_GameControllerSetSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type, SDL_bool enabled)
int SDL_GameControllerGetSensorData(SDL_GameController *gamecontroller, SDL_SensorType type, float *data, int num_values)
#define SDL_MINIMUM_GUIDE_BUTTON_DELAY_MS
Uint16 SDL_GameControllerGetVendor(SDL_GameController *gamecontroller)
static ControllerMapping_t * SDL_PrivateGetControllerMappingForGUID(SDL_JoystickGUID guid, SDL_bool exact_match)
#define SDL_CONTROLLER_PLATFORM_FIELD
static void HandleJoystickHat(SDL_GameController *gamecontroller, int hat, Uint8 value)
const char * SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis)
SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
Uint16 SDL_GameControllerGetProductVersion(SDL_GameController *gamecontroller)
static ControllerMapping_t * s_pXInputMapping
int SDL_GameControllerSetLED(SDL_GameController *gamecontroller, Uint8 red, Uint8 green, Uint8 blue)
static void HandleJoystickAxis(SDL_GameController *gamecontroller, int axis, int value)
static SDL_GameController * SDL_gamecontrollers
SDL_ControllerMappingPriority
@ SDL_CONTROLLER_MAPPING_PRIORITY_USER
@ SDL_CONTROLLER_MAPPING_PRIORITY_API
@ SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT
static ControllerMapping_t * SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority)
Uint8 SDL_GameControllerGetButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
Uint16 SDL_GameControllerGetProduct(SDL_GameController *gamecontroller)
char * SDL_GameControllerMapping(SDL_GameController *gamecontroller)
static char * SDL_PrivateGetControllerNameFromMappingString(const char *pMapping)
static char * SDL_PrivateGetControllerMappingFromMappingString(const char *pMapping)
int SDL_GameControllerGetNumTouchpads(SDL_GameController *gamecontroller)
static void SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
char * SDL_GameControllerMappingForDeviceIndex(int joystick_index)
const char * SDL_GameControllerNameForIndex(int device_index)
Sint16 SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
SDL_GameControllerButtonBind SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
int SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller)
static void SDL_GameControllerIgnoreDevicesExceptChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
#define SDL_CONTROLLER_SDKGE_FIELD
SDL_GameController * SDL_GameControllerOpen(int device_index)
SDL_GameControllerType SDL_GameControllerGetType(SDL_GameController *gamecontroller)
void SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index)
SDL_bool SDL_GameControllerHasButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
SDL_bool SDL_GameControllerGetAttached(SDL_GameController *gamecontroller)
int SDL_GameControllerInitMappings(void)
static int SDL_PrivateGameControllerAddMapping(const char *mappingString, SDL_ControllerMappingPriority priority)
const char * SDL_GameControllerGetStringForButton(SDL_GameControllerButton axis)
@ SDL_CONTROLLER_AXIS_LEFTX
@ SDL_CONTROLLER_AXIS_TRIGGERRIGHT
@ SDL_CONTROLLER_AXIS_INVALID
@ SDL_CONTROLLER_AXIS_RIGHTY
@ SDL_CONTROLLER_AXIS_RIGHTX
@ SDL_CONTROLLER_AXIS_MAX
@ SDL_CONTROLLER_AXIS_TRIGGERLEFT
@ SDL_CONTROLLER_AXIS_LEFTY
#define SDL_GameControllerAddMappingsFromFile(file)
@ SDL_CONTROLLER_BUTTON_B
@ SDL_CONTROLLER_BUTTON_BACK
@ SDL_CONTROLLER_BUTTON_LEFTSTICK
@ SDL_CONTROLLER_BUTTON_START
@ SDL_CONTROLLER_BUTTON_DPAD_LEFT
@ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
@ SDL_CONTROLLER_BUTTON_INVALID
@ SDL_CONTROLLER_BUTTON_DPAD_DOWN
@ SDL_CONTROLLER_BUTTON_DPAD_UP
@ SDL_CONTROLLER_BUTTON_MAX
@ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
@ SDL_CONTROLLER_BUTTON_GUIDE
@ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
@ SDL_CONTROLLER_BUTTON_X
@ SDL_CONTROLLER_BUTTON_RIGHTSTICK
@ SDL_CONTROLLER_BUTTON_Y
@ SDL_CONTROLLER_BUTTON_A
@ SDL_CONTROLLER_TYPE_PS4
@ SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
@ SDL_CONTROLLER_TYPE_PS5
SDL_GameControllerBindType
@ SDL_CONTROLLER_BINDTYPE_AXIS
@ SDL_CONTROLLER_BINDTYPE_HAT
@ SDL_CONTROLLER_BINDTYPE_NONE
@ SDL_CONTROLLER_BINDTYPE_BUTTON
static const char * s_ControllerMappings[]
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT
#define SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS
If set, game controller face buttons report their values according to their labels instead of their p...
#define SDL_HINT_GAMECONTROLLERCONFIG_FILE
A variable that lets you provide a file with extra gamecontroller db entries.
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES
#define SDL_HINT_GAMECONTROLLERCONFIG
A variable that lets you manually hint extra gamecontroller db entries.
#define SDL_small_alloc(type, count, pisstack)
#define SDL_small_free(ptr, isstack)
SDL_bool SDL_IsJoystickXboxOneElite(Uint16 vendor_id, Uint16 product_id)
SDL_bool SDL_IsJoystickHIDAPI(SDL_JoystickGUID guid)
SDL_bool SDL_IsJoystickWGI(SDL_JoystickGUID guid)
SDL_bool SDL_IsJoystickRAWINPUT(SDL_JoystickGUID guid)
SDL_bool SDL_PrivateJoystickGetAutoGamepadMapping(int device_index, SDL_GamepadMapping *out)
SDL_GameControllerType SDL_GetJoystickGameControllerTypeFromGUID(SDL_JoystickGUID guid, const char *name)
void SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version)
SDL_bool SDL_IsJoystickXboxOneSeriesX(Uint16 vendor_id, Uint16 product_id)
SDL_bool SDL_IsJoystickNintendoSwitchPro(Uint16 vendor_id, Uint16 product_id)
SDL_bool SDL_IsJoystickXInput(SDL_JoystickGUID guid)
SDL_bool SDL_IsJoystickSteamController(Uint16 vendor_id, Uint16 product_id)
#define SDL_JOYSTICK_AXIS_MIN
#define SDL_JOYSTICK_AXIS_MAX
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum type
GLboolean GLboolean GLboolean b
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLboolean GLboolean GLboolean GLboolean a
GLuint const GLchar * name
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLenum GLenum GLenum mapping
GLsizei const GLchar *const * path
GLsizei const GLfloat * value
GLenum GLenum GLenum input
#define SDL_arraysize(array)
#define MAKE_VIDPID(VID, PID)
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
SDL_ExtendedGameControllerBind ** last_match_axis
SDL_ExtendedGameControllerBind * bindings
struct _SDL_GameController * next
SDL_ControllerMappingPriority priority
struct _ControllerMapping_t * next
union SDL_ExtendedGameControllerBind::@32 input
SDL_GameControllerBindType outputType
SDL_GameControllerAxis axis
SDL_GameControllerBindType inputType
SDL_GameControllerButton button
union SDL_ExtendedGameControllerBind::@33 output
SDL_InputMapping rightshoulder
SDL_InputMapping righttrigger
SDL_InputMapping rightstick
SDL_InputMapping leftshoulder
SDL_InputMapping lefttrigger
SDL_InputMapping leftstick
SDL_JoystickTouchpadFingerInfo * fingers
SDL_GameController * gamecontroller
static SDL_Event events[EVENT_BUF_SIZE]
static SDL_Joystick * joystick
SDL_ControllerDeviceEvent cdevice
#define USB_VENDOR_NINTENDO
#define USB_PRODUCT_NINTENDO_GAMECUBE_ADAPTER
typedef int(__stdcall *FARPROC)()