Make built-in joystick device lists extendable by using hints

Fixes https://github.com/libsdl-org/SDL/issues/8595
This commit is contained in:
Sam Lantinga
2023-12-10 11:27:15 -08:00
parent 34eb24ebc4
commit 5173b0c2cc
4 changed files with 679 additions and 365 deletions

View File

@@ -140,18 +140,18 @@ struct SDL_Gamepad
return retval; \
}
static SDL_vidpid_list SDL_allowed_gamepads;
static SDL_vidpid_list SDL_ignored_gamepads;
static void SDLCALL SDL_GamepadIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
{
SDL_LoadVIDPIDListFromHint(hint, &SDL_ignored_gamepads);
}
static void SDLCALL SDL_GamepadIgnoreDevicesExceptChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
{
SDL_LoadVIDPIDListFromHint(hint, &SDL_allowed_gamepads);
}
static SDL_vidpid_list SDL_allowed_gamepads = {
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT, 0, 0, NULL,
NULL, 0, 0, NULL,
0, NULL,
SDL_FALSE
};
static SDL_vidpid_list SDL_ignored_gamepads = {
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES, 0, 0, NULL,
NULL, 0, 0, NULL,
0, NULL,
SDL_FALSE
};
static GamepadMapping_t *SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_GamepadMappingPriority priority);
static void SDL_PrivateLoadButtonMapping(SDL_Gamepad *gamepad, GamepadMapping_t *pGamepadMapping);
@@ -2276,10 +2276,8 @@ int SDL_InitGamepadMappings(void)
/* load in any user supplied config */
SDL_LoadGamepadHints();
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
SDL_GamepadIgnoreDevicesChanged, NULL);
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
SDL_GamepadIgnoreDevicesExceptChanged, NULL);
SDL_LoadVIDPIDList(&SDL_allowed_gamepads);
SDL_LoadVIDPIDList(&SDL_ignored_gamepads);
PopMappingChangeTracking();
@@ -2506,8 +2504,8 @@ SDL_bool SDL_ShouldIgnoreGamepad(const char *name, SDL_JoystickGUID guid)
return SDL_TRUE;
}
if (SDL_allowed_gamepads.num_entries == 0 &&
SDL_ignored_gamepads.num_entries == 0) {
if (SDL_allowed_gamepads.num_included_entries == 0 &&
SDL_ignored_gamepads.num_included_entries == 0) {
return SDL_FALSE;
}
@@ -2530,7 +2528,7 @@ SDL_bool SDL_ShouldIgnoreGamepad(const char *name, SDL_JoystickGUID guid)
}
}
if (SDL_allowed_gamepads.num_entries > 0) {
if (SDL_allowed_gamepads.num_included_entries > 0) {
if (SDL_VIDPIDInList(vendor, product, &SDL_allowed_gamepads)) {
return SDL_FALSE;
}
@@ -3583,11 +3581,6 @@ void SDL_QuitGamepadMappings(void)
SDL_free(pGamepadMap);
}
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
SDL_GamepadIgnoreDevicesChanged, NULL);
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
SDL_GamepadIgnoreDevicesExceptChanged, NULL);
SDL_FreeVIDPIDList(&SDL_allowed_gamepads);
SDL_FreeVIDPIDList(&SDL_ignored_gamepads);
}