mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-01-05 15:35:47 +00:00
Refactor VIDPID list loading code
(cherry picked from commit d91e96e7f50b9c3cb0e1dacda39274b4af037a96)
This commit is contained in:
parent
f0e7f3e7e5
commit
6526c4d0fc
|
@ -156,61 +156,9 @@ struct _SDL_GameController
|
||||||
return retval; \
|
return retval; \
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int num_entries;
|
|
||||||
int max_entries;
|
|
||||||
Uint32 *entries;
|
|
||||||
} SDL_vidpid_list;
|
|
||||||
|
|
||||||
static SDL_vidpid_list SDL_allowed_controllers;
|
static SDL_vidpid_list SDL_allowed_controllers;
|
||||||
static SDL_vidpid_list SDL_ignored_controllers;
|
static SDL_vidpid_list SDL_ignored_controllers;
|
||||||
|
|
||||||
static void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
|
|
||||||
{
|
|
||||||
Uint32 entry;
|
|
||||||
char *spot;
|
|
||||||
char *file = NULL;
|
|
||||||
|
|
||||||
list->num_entries = 0;
|
|
||||||
|
|
||||||
if (hint && *hint == '@') {
|
|
||||||
spot = file = (char *)SDL_LoadFile(hint + 1, NULL);
|
|
||||||
} else {
|
|
||||||
spot = (char *)hint;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!spot) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((spot = SDL_strstr(spot, "0x")) != NULL) {
|
|
||||||
entry = (Uint16)SDL_strtol(spot, &spot, 0);
|
|
||||||
entry <<= 16;
|
|
||||||
spot = SDL_strstr(spot, "0x");
|
|
||||||
if (!spot) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
entry |= (Uint16)SDL_strtol(spot, &spot, 0);
|
|
||||||
|
|
||||||
if (list->num_entries == list->max_entries) {
|
|
||||||
int max_entries = list->max_entries + 16;
|
|
||||||
Uint32 *entries = (Uint32 *)SDL_realloc(list->entries, max_entries * sizeof(*list->entries));
|
|
||||||
if (!entries) {
|
|
||||||
/* Out of memory, go with what we have already */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
list->entries = entries;
|
|
||||||
list->max_entries = max_entries;
|
|
||||||
}
|
|
||||||
list->entries[list->num_entries++] = entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file) {
|
|
||||||
SDL_free(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SDLCALL SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
static void SDLCALL SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
{
|
{
|
||||||
SDL_LoadVIDPIDListFromHint(hint, &SDL_ignored_controllers);
|
SDL_LoadVIDPIDListFromHint(hint, &SDL_ignored_controllers);
|
||||||
|
@ -2161,11 +2109,9 @@ static SDL_bool SDL_endswith(const char *string, const char *suffix)
|
||||||
*/
|
*/
|
||||||
SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
Uint16 vendor;
|
Uint16 vendor;
|
||||||
Uint16 product;
|
Uint16 product;
|
||||||
Uint16 version;
|
Uint16 version;
|
||||||
Uint32 vidpid;
|
|
||||||
|
|
||||||
#if defined(__LINUX__)
|
#if defined(__LINUX__)
|
||||||
if (SDL_endswith(name, " Motion Sensors")) {
|
if (SDL_endswith(name, " Motion Sensors")) {
|
||||||
|
@ -2214,20 +2160,14 @@ SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vidpid = MAKE_VIDPID(vendor, product);
|
|
||||||
|
|
||||||
if (SDL_allowed_controllers.num_entries > 0) {
|
if (SDL_allowed_controllers.num_entries > 0) {
|
||||||
for (i = 0; i < SDL_allowed_controllers.num_entries; ++i) {
|
if (SDL_VIDPIDInList(vendor, product, &SDL_allowed_controllers)) {
|
||||||
if (vidpid == SDL_allowed_controllers.entries[i]) {
|
return SDL_FALSE;
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < SDL_ignored_controllers.num_entries; ++i) {
|
if (SDL_VIDPIDInList(vendor, product, &SDL_ignored_controllers)) {
|
||||||
if (vidpid == SDL_ignored_controllers.entries[i]) {
|
return SDL_TRUE;
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -3138,14 +3078,8 @@ void SDL_GameControllerQuitMappings(void)
|
||||||
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
|
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
|
||||||
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
|
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
|
||||||
|
|
||||||
if (SDL_allowed_controllers.entries) {
|
SDL_FreeVIDPIDList(&SDL_allowed_controllers);
|
||||||
SDL_free(SDL_allowed_controllers.entries);
|
SDL_FreeVIDPIDList(&SDL_ignored_controllers);
|
||||||
SDL_zero(SDL_allowed_controllers);
|
|
||||||
}
|
|
||||||
if (SDL_ignored_controllers.entries) {
|
|
||||||
SDL_free(SDL_ignored_controllers.entries);
|
|
||||||
SDL_zero(SDL_ignored_controllers);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3226,4 +3226,70 @@ int SDL_PrivateJoystickSensor(SDL_Joystick *joystick, SDL_SensorType type, Uint6
|
||||||
return posted;
|
return posted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
|
||||||
|
{
|
||||||
|
Uint32 entry;
|
||||||
|
char *spot;
|
||||||
|
char *file = NULL;
|
||||||
|
|
||||||
|
list->num_entries = 0;
|
||||||
|
|
||||||
|
if (hint && *hint == '@') {
|
||||||
|
spot = file = (char *)SDL_LoadFile(hint + 1, NULL);
|
||||||
|
} else {
|
||||||
|
spot = (char *)hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spot == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((spot = SDL_strstr(spot, "0x")) != NULL) {
|
||||||
|
entry = (Uint16)SDL_strtol(spot, &spot, 0);
|
||||||
|
entry <<= 16;
|
||||||
|
spot = SDL_strstr(spot, "0x");
|
||||||
|
if (spot == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
entry |= (Uint16)SDL_strtol(spot, &spot, 0);
|
||||||
|
|
||||||
|
if (list->num_entries == list->max_entries) {
|
||||||
|
int max_entries = list->max_entries + 16;
|
||||||
|
Uint32 *entries = (Uint32 *)SDL_realloc(list->entries, max_entries * sizeof(*list->entries));
|
||||||
|
if (entries == NULL) {
|
||||||
|
/* Out of memory, go with what we have already */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
list->entries = entries;
|
||||||
|
list->max_entries = max_entries;
|
||||||
|
}
|
||||||
|
list->entries[list->num_entries++] = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
SDL_free(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_list *list)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Uint32 vidpid = MAKE_VIDPID(vendor_id, product_id);
|
||||||
|
|
||||||
|
for (i = 0; i < list->num_entries; ++i) {
|
||||||
|
if (vidpid == list->entries[i]) {
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_FreeVIDPIDList(SDL_vidpid_list *list)
|
||||||
|
{
|
||||||
|
if (list->entries) {
|
||||||
|
SDL_free(list->entries);
|
||||||
|
SDL_zerop(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -231,6 +231,18 @@ typedef struct _SDL_GamepadMapping
|
||||||
extern SDL_bool SDL_PrivateJoystickGetAutoGamepadMapping(int device_index,
|
extern SDL_bool SDL_PrivateJoystickGetAutoGamepadMapping(int device_index,
|
||||||
SDL_GamepadMapping *out);
|
SDL_GamepadMapping *out);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int num_entries;
|
||||||
|
int max_entries;
|
||||||
|
Uint32 *entries;
|
||||||
|
} SDL_vidpid_list;
|
||||||
|
|
||||||
|
extern void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list);
|
||||||
|
extern SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_list *list);
|
||||||
|
extern void SDL_FreeVIDPIDList(SDL_vidpid_list *list);
|
||||||
|
|
||||||
/* Ends C function definitions when using C++ */
|
/* Ends C function definitions when using C++ */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue