SDL_GameControllerMapping() should return the string for the actual mapping that was used when opening a gamecontroller, rather than do a GUID match again

Also don't match against the zero guid if that happens to be in the mapping list for some reason
This commit is contained in:
Sam Lantinga 2022-11-05 13:12:10 -07:00
parent f3bf543e2a
commit a2d66b6a91

View file

@ -125,6 +125,7 @@ struct _SDL_GameController
int ref_count; int ref_count;
const char *name; const char *name;
ControllerMapping_t *mapping;
int num_bindings; int num_bindings;
SDL_ExtendedGameControllerBind *bindings; SDL_ExtendedGameControllerBind *bindings;
SDL_ExtendedGameControllerBind **last_match_axis; SDL_ExtendedGameControllerBind **last_match_axis;
@ -740,6 +741,10 @@ static ControllerMapping_t *SDL_PrivateMatchControllerMappingForGUID(SDL_Joystic
for (mapping = s_pSupportedControllers; mapping; mapping = mapping->next) { for (mapping = s_pSupportedControllers; mapping; mapping = mapping->next) {
SDL_JoystickGUID mapping_guid; SDL_JoystickGUID mapping_guid;
if (SDL_memcmp(&mapping->guid, &s_zeroGUID, sizeof(mapping->guid)) == 0) {
continue;
}
SDL_memcpy(&mapping_guid, &mapping->guid, sizeof(mapping_guid)); SDL_memcpy(&mapping_guid, &mapping->guid, sizeof(mapping_guid));
if (!match_version) { if (!match_version) {
SDL_SetJoystickGUIDVersion(&mapping_guid, 0); SDL_SetJoystickGUIDVersion(&mapping_guid, 0);
@ -1070,19 +1075,20 @@ SDL_PrivateGameControllerParseControllerConfigString(SDL_GameController *gamecon
/* /*
* Make a new button mapping struct * Make a new button mapping struct
*/ */
static void SDL_PrivateLoadButtonMapping(SDL_GameController *gamecontroller, const char *pchName, const char *pchMapping) static void SDL_PrivateLoadButtonMapping(SDL_GameController *gamecontroller, ControllerMapping_t *pControllerMapping)
{ {
int i; int i;
CHECK_GAMECONTROLLER_MAGIC(gamecontroller, ); CHECK_GAMECONTROLLER_MAGIC(gamecontroller, );
gamecontroller->name = pchName; gamecontroller->name = pControllerMapping->name;
gamecontroller->num_bindings = 0; gamecontroller->num_bindings = 0;
gamecontroller->mapping = pControllerMapping;
if (gamecontroller->joystick->naxes) { if (gamecontroller->joystick->naxes) {
SDL_memset(gamecontroller->last_match_axis, 0, gamecontroller->joystick->naxes * sizeof(*gamecontroller->last_match_axis)); SDL_memset(gamecontroller->last_match_axis, 0, gamecontroller->joystick->naxes * sizeof(*gamecontroller->last_match_axis));
} }
SDL_PrivateGameControllerParseControllerConfigString(gamecontroller, pchMapping); SDL_PrivateGameControllerParseControllerConfigString(gamecontroller, pControllerMapping->mapping);
/* Set the zero point for triggers */ /* Set the zero point for triggers */
for (i = 0; i < gamecontroller->num_bindings; ++i) { for (i = 0; i < gamecontroller->num_bindings; ++i) {
@ -1191,9 +1197,9 @@ static void SDL_PrivateGameControllerRefreshMapping(ControllerMapping_t *pContro
{ {
SDL_GameController *gamecontrollerlist = SDL_gamecontrollers; SDL_GameController *gamecontrollerlist = SDL_gamecontrollers;
while (gamecontrollerlist) { while (gamecontrollerlist) {
if (!SDL_memcmp(&gamecontrollerlist->joystick->guid, &pControllerMapping->guid, sizeof(pControllerMapping->guid))) { if (gamecontrollerlist->mapping == pControllerMapping) {
/* Not really threadsafe. Should this lock access within SDL_GameControllerEventWatcher? */ /* Not really threadsafe. Should this lock access within SDL_GameControllerEventWatcher? */
SDL_PrivateLoadButtonMapping(gamecontrollerlist, pControllerMapping->name, pControllerMapping->mapping); SDL_PrivateLoadButtonMapping(gamecontrollerlist, pControllerMapping);
{ {
SDL_Event event; SDL_Event event;
@ -1755,7 +1761,7 @@ SDL_GameControllerMapping(SDL_GameController *gamecontroller)
{ {
CHECK_GAMECONTROLLER_MAGIC(gamecontroller, NULL); CHECK_GAMECONTROLLER_MAGIC(gamecontroller, NULL);
return SDL_GameControllerMappingForGUID(gamecontroller->joystick->guid); return CreateMappingString(gamecontroller->mapping, gamecontroller->joystick->guid);
} }
static void static void
@ -2126,7 +2132,7 @@ SDL_GameControllerOpen(int device_index)
} }
} }
SDL_PrivateLoadButtonMapping(gamecontroller, pSupportedController->name, pSupportedController->mapping); SDL_PrivateLoadButtonMapping(gamecontroller, pSupportedController);
/* Add the controller to list */ /* Add the controller to list */
++gamecontroller->ref_count; ++gamecontroller->ref_count;