mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-23 06:25:50 +00:00
Make built-in joystick device lists extendable by using hints
Fixes https://github.com/libsdl-org/SDL/issues/8595 (cherry picked from commit 5173b0c2cce5a68f1f72d77b4788f5e1da332719)
This commit is contained in:
parent
6526c4d0fc
commit
79a8e8cf04
|
@ -631,6 +631,110 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS"
|
#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of arcade stick style controllers.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES "SDL_JOYSTICK_ARCADESTICK_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that are not arcade stick style controllers. This will override SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that should not be considerd joysticks.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES "SDL_JOYSTICK_BLACKLIST_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that should be considered joysticks. This will override SDL_HINT_JOYSTICK_BLACKLIST_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED "SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of flightstick style controllers.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES "SDL_JOYSTICK_FLIGHTSTICK_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that are not flightstick style controllers. This will override SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices known to have a GameCube form factor.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES "SDL_JOYSTICK_GAMECUBE_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices known not to have a GameCube form factor. This will override SDL_HINT_JOYSTICK_GAMECUBE_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED "SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling whether the HIDAPI joystick drivers should be used.
|
* \brief A variable controlling whether the HIDAPI joystick drivers should be used.
|
||||||
*
|
*
|
||||||
|
@ -1025,6 +1129,32 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
|
#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of throttle style controllers.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_THROTTLE_DEVICES "SDL_JOYSTICK_THROTTLE_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that are not throttle style controllers. This will override SDL_HINT_JOYSTICK_THROTTLE_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED "SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling whether Windows.Gaming.Input should be used for controller handling.
|
* \brief A variable controlling whether Windows.Gaming.Input should be used for controller handling.
|
||||||
*
|
*
|
||||||
|
@ -1034,6 +1164,45 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI"
|
#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of wheel style controllers.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_WHEEL_DEVICES "SDL_JOYSTICK_WHEEL_DEVICES"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that are not wheel style controllers. This will override SDL_HINT_JOYSTICK_WHEEL_DEVICES and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED "SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices known to have all axes centered at zero.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES "SDL_JOYSTICK_ZERO_CENTERED_DEVICES"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Determines whether SDL enforces that DRM master is required in order
|
* \brief Determines whether SDL enforces that DRM master is required in order
|
||||||
* to initialize the KMSDRM video backend.
|
* to initialize the KMSDRM video backend.
|
||||||
|
@ -1503,6 +1672,32 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE"
|
#define SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE "SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of ROG gamepad capable mice.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_ROG_GAMEPAD_MICE "SDL_ROG_GAMEPAD_MICE"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices that are not ROG gamepad capable mice. This will override SDL_HINT_ROG_GAMEPAD_MICE and the built in device list.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs
|
||||||
|
* in hexadecimal form, e.g.
|
||||||
|
*
|
||||||
|
* 0xAAAA/0xBBBB,0xCCCC/0xDDDD
|
||||||
|
*
|
||||||
|
* The variable can also take the form of @file, in which case the named
|
||||||
|
* file will be loaded and interpreted as the value of the variable.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS
|
* \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS
|
||||||
*
|
*
|
||||||
|
|
|
@ -156,18 +156,18 @@ struct _SDL_GameController
|
||||||
return retval; \
|
return retval; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_vidpid_list SDL_allowed_controllers;
|
static SDL_vidpid_list SDL_allowed_controllers = {
|
||||||
static SDL_vidpid_list SDL_ignored_controllers;
|
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT, 0, 0, NULL,
|
||||||
|
NULL, 0, 0, NULL,
|
||||||
static void SDLCALL SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
0, NULL,
|
||||||
{
|
SDL_FALSE
|
||||||
SDL_LoadVIDPIDListFromHint(hint, &SDL_ignored_controllers);
|
};
|
||||||
}
|
static SDL_vidpid_list SDL_ignored_controllers = {
|
||||||
|
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES, 0, 0, NULL,
|
||||||
static void SDLCALL SDL_GameControllerIgnoreDevicesExceptChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
NULL, 0, 0, NULL,
|
||||||
{
|
0, NULL,
|
||||||
SDL_LoadVIDPIDListFromHint(hint, &SDL_allowed_controllers);
|
SDL_FALSE
|
||||||
}
|
};
|
||||||
|
|
||||||
static ControllerMapping_t *SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority);
|
static ControllerMapping_t *SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority);
|
||||||
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value);
|
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value);
|
||||||
|
@ -1920,10 +1920,8 @@ int SDL_GameControllerInitMappings(void)
|
||||||
/* load in any user supplied config */
|
/* load in any user supplied config */
|
||||||
SDL_GameControllerLoadHints();
|
SDL_GameControllerLoadHints();
|
||||||
|
|
||||||
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
|
SDL_LoadVIDPIDList(&SDL_allowed_controllers);
|
||||||
SDL_GameControllerIgnoreDevicesChanged, NULL);
|
SDL_LoadVIDPIDList(&SDL_ignored_controllers);
|
||||||
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
|
|
||||||
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2136,8 +2134,8 @@ SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_allowed_controllers.num_entries == 0 &&
|
if (SDL_allowed_controllers.num_included_entries == 0 &&
|
||||||
SDL_ignored_controllers.num_entries == 0) {
|
SDL_ignored_controllers.num_included_entries == 0) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2160,7 +2158,7 @@ SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_allowed_controllers.num_entries > 0) {
|
if (SDL_allowed_controllers.num_included_entries > 0) {
|
||||||
if (SDL_VIDPIDInList(vendor, product, &SDL_allowed_controllers)) {
|
if (SDL_VIDPIDInList(vendor, product, &SDL_allowed_controllers)) {
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -3073,11 +3071,6 @@ void SDL_GameControllerQuitMappings(void)
|
||||||
|
|
||||||
SDL_DelEventWatch(SDL_GameControllerEventWatcher, NULL);
|
SDL_DelEventWatch(SDL_GameControllerEventWatcher, NULL);
|
||||||
|
|
||||||
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
|
|
||||||
SDL_GameControllerIgnoreDevicesChanged, NULL);
|
|
||||||
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
|
|
||||||
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
|
|
||||||
|
|
||||||
SDL_FreeVIDPIDList(&SDL_allowed_controllers);
|
SDL_FreeVIDPIDList(&SDL_allowed_controllers);
|
||||||
SDL_FreeVIDPIDList(&SDL_ignored_controllers);
|
SDL_FreeVIDPIDList(&SDL_ignored_controllers);
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,284 @@ static SDL_JoystickID *SDL_joystick_players SDL_GUARDED_BY(SDL_joystick_lock) =
|
||||||
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE;
|
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE;
|
||||||
char SDL_joystick_magic;
|
char SDL_joystick_magic;
|
||||||
|
|
||||||
|
static Uint32 initial_arcadestick_devices[] = {
|
||||||
|
MAKE_VIDPID(0x0079, 0x181a), /* Venom Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x0079, 0x181b), /* Venom Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x0c12, 0x0ef6), /* Hitbox Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x0e6f, 0x0109), /* PDP Versus Fighting Pad */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x0016), /* Hori Real Arcade Pro.EX */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x001b), /* Hori Real Arcade Pro VX */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x0063), /* Hori Real Arcade Pro Hayabusa (USA) Xbox One */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x006a), /* Real Arcade Pro 4 */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x0078), /* Hori Real Arcade Pro V Kai Xbox One */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x008a), /* HORI Real Arcade Pro 4 */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x008c), /* Hori Real Arcade Pro 4 */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x00aa), /* HORI Real Arcade Pro V Hayabusa in Switch Mode */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x00ed), /* Hori Fighting Stick mini 4 kai */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x011c), /* Hori Fighting Stick α in PS4 Mode */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x011e), /* Hori Fighting Stick α in PC Mode */
|
||||||
|
MAKE_VIDPID(0x0f0d, 0x0184), /* Hori Fighting Stick α in PS5 Mode */
|
||||||
|
MAKE_VIDPID(0x146b, 0x0604), /* NACON Daija Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x1532, 0x0a00), /* Razer Atrox Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x1bad, 0xf03d), /* Street Fighter IV Arcade Stick TE - Chun Li */
|
||||||
|
MAKE_VIDPID(0x1bad, 0xf502), /* Hori Real Arcade Pro.VX SA */
|
||||||
|
MAKE_VIDPID(0x1bad, 0xf504), /* Hori Real Arcade Pro. EX */
|
||||||
|
MAKE_VIDPID(0x1bad, 0xf506), /* Hori Real Arcade Pro.EX Premium VLX */
|
||||||
|
MAKE_VIDPID(0x20d6, 0xa715), /* PowerA Nintendo Switch Fusion Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x24c6, 0x5000), /* Razer Atrox Arcade Stick */
|
||||||
|
MAKE_VIDPID(0x24c6, 0x5501), /* Hori Real Arcade Pro VX-SA */
|
||||||
|
MAKE_VIDPID(0x24c6, 0x550e), /* Hori Real Arcade Pro V Kai 360 */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2300), /* Qanba Obsidian Arcade Joystick in PS4 Mode */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2302), /* Qanba Obsidian Arcade Joystick in PS3 Mode */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2303), /* Qanba Obsidian Arcade Joystick in PC Mode */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2500), /* Qanba Dragon Arcade Joystick in PS4 Mode */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2502), /* Qanba Dragon Arcade Joystick in PS3 Mode */
|
||||||
|
MAKE_VIDPID(0x2c22, 0x2503), /* Qanba Dragon Arcade Joystick in PC Mode */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list arcadestick_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_arcadestick_devices), initial_arcadestick_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This list is taken from:
|
||||||
|
https://raw.githubusercontent.com/denilsonsa/udev-joystick-blacklist/master/generate_rules.py
|
||||||
|
*/
|
||||||
|
static Uint32 initial_blacklist_devices[] = {
|
||||||
|
/* Microsoft Microsoft Wireless Optical Desktop 2.10 */
|
||||||
|
/* Microsoft Wireless Desktop - Comfort Edition */
|
||||||
|
MAKE_VIDPID(0x045e, 0x009d),
|
||||||
|
|
||||||
|
/* Microsoft Microsoft Digital Media Pro Keyboard */
|
||||||
|
/* Microsoft Corp. Digital Media Pro Keyboard */
|
||||||
|
MAKE_VIDPID(0x045e, 0x00b0),
|
||||||
|
|
||||||
|
/* Microsoft Microsoft Digital Media Keyboard */
|
||||||
|
/* Microsoft Corp. Digital Media Keyboard 1.0A */
|
||||||
|
MAKE_VIDPID(0x045e, 0x00b4),
|
||||||
|
|
||||||
|
/* Microsoft Microsoft Digital Media Keyboard 3000 */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0730),
|
||||||
|
|
||||||
|
/* Microsoft Microsoft 2.4GHz Transceiver v6.0 */
|
||||||
|
/* Microsoft Microsoft 2.4GHz Transceiver v8.0 */
|
||||||
|
/* Microsoft Corp. Nano Transceiver v1.0 for Bluetooth */
|
||||||
|
/* Microsoft Wireless Mobile Mouse 1000 */
|
||||||
|
/* Microsoft Wireless Desktop 3000 */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0745),
|
||||||
|
|
||||||
|
/* Microsoft SideWinder(TM) 2.4GHz Transceiver */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0748),
|
||||||
|
|
||||||
|
/* Microsoft Corp. Wired Keyboard 600 */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0750),
|
||||||
|
|
||||||
|
/* Microsoft Corp. Sidewinder X4 keyboard */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0768),
|
||||||
|
|
||||||
|
/* Microsoft Corp. Arc Touch Mouse Transceiver */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0773),
|
||||||
|
|
||||||
|
/* Microsoft 2.4GHz Transceiver v9.0 */
|
||||||
|
/* Microsoft Nano Transceiver v2.1 */
|
||||||
|
/* Microsoft Sculpt Ergonomic Keyboard (5KV-00001) */
|
||||||
|
MAKE_VIDPID(0x045e, 0x07a5),
|
||||||
|
|
||||||
|
/* Microsoft Nano Transceiver v1.0 */
|
||||||
|
/* Microsoft Wireless Keyboard 800 */
|
||||||
|
MAKE_VIDPID(0x045e, 0x07b2),
|
||||||
|
|
||||||
|
/* Microsoft Nano Transceiver v2.0 */
|
||||||
|
MAKE_VIDPID(0x045e, 0x0800),
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x046d, 0xc30a), /* Logitech, Inc. iTouch Composite keboard */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x04d9, 0xa0df), /* Tek Syndicate Mouse (E-Signal USB Gaming Mouse) */
|
||||||
|
|
||||||
|
/* List of Wacom devices at: http://linuxwacom.sourceforge.net/wiki/index.php/Device_IDs */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0010), /* Wacom ET-0405 Graphire */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0011), /* Wacom ET-0405A Graphire2 (4x5) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0012), /* Wacom ET-0507A Graphire2 (5x7) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0013), /* Wacom CTE-430 Graphire3 (4x5) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0014), /* Wacom CTE-630 Graphire3 (6x8) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0015), /* Wacom CTE-440 Graphire4 (4x5) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0016), /* Wacom CTE-640 Graphire4 (6x8) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0017), /* Wacom CTE-450 Bamboo Fun (4x5) */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0018), /* Wacom CTE-650 Bamboo Fun 6x8 */
|
||||||
|
MAKE_VIDPID(0x056a, 0x0019), /* Wacom CTE-631 Bamboo One */
|
||||||
|
MAKE_VIDPID(0x056a, 0x00d1), /* Wacom Bamboo Pen and Touch CTH-460 */
|
||||||
|
MAKE_VIDPID(0x056a, 0x030e), /* Wacom Intuos Pen (S) CTL-480 */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x09da, 0x054f), /* A4 Tech Co., G7 750 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x1410), /* A4 Tech Co., Ltd Bloody AL9 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x3043), /* A4 Tech Co., Ltd Bloody R8A Gaming Mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x31b5), /* A4 Tech Co., Ltd Bloody TL80 Terminator Laser Gaming Mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x3997), /* A4 Tech Co., Ltd Bloody RT7 Terminator Wireless */
|
||||||
|
MAKE_VIDPID(0x09da, 0x3f8b), /* A4 Tech Co., Ltd Bloody V8 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x51f4), /* Modecom MC-5006 Keyboard */
|
||||||
|
MAKE_VIDPID(0x09da, 0x5589), /* A4 Tech Co., Ltd Terminator TL9 Laser Gaming Mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x7b22), /* A4 Tech Co., Ltd Bloody V5 */
|
||||||
|
MAKE_VIDPID(0x09da, 0x7f2d), /* A4 Tech Co., Ltd Bloody R3 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x8090), /* A4 Tech Co., Ltd X-718BK Oscar Optical Gaming Mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x9033), /* A4 Tech Co., X7 X-705K */
|
||||||
|
MAKE_VIDPID(0x09da, 0x9066), /* A4 Tech Co., Sharkoon Fireglider Optical */
|
||||||
|
MAKE_VIDPID(0x09da, 0x9090), /* A4 Tech Co., Ltd XL-730K / XL-750BK / XL-755BK Laser Mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0x90c0), /* A4 Tech Co., Ltd X7 G800V keyboard */
|
||||||
|
MAKE_VIDPID(0x09da, 0xf012), /* A4 Tech Co., Ltd Bloody V7 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0xf32a), /* A4 Tech Co., Ltd Bloody B540 keyboard */
|
||||||
|
MAKE_VIDPID(0x09da, 0xf613), /* A4 Tech Co., Ltd Bloody V2 mouse */
|
||||||
|
MAKE_VIDPID(0x09da, 0xf624), /* A4 Tech Co., Ltd Bloody B120 Keyboard */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x1b1c, 0x1b3c), /* Corsair Harpoon RGB gaming mouse */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x1d57, 0xad03), /* [T3] 2.4GHz and IR Air Mouse Remote Control */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x1e7d, 0x2e4a), /* Roccat Tyon Mouse */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x20a0, 0x422d), /* Winkeyless.kr Keyboards */
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x2516, 0x001f), /* Cooler Master Storm Mizar Mouse */
|
||||||
|
MAKE_VIDPID(0x2516, 0x0028), /* Cooler Master Storm Alcor Mouse */
|
||||||
|
|
||||||
|
/*****************************************************************/
|
||||||
|
/* Additional entries */
|
||||||
|
/*****************************************************************/
|
||||||
|
|
||||||
|
MAKE_VIDPID(0x04d9, 0x8008), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
||||||
|
MAKE_VIDPID(0x04d9, 0x8009), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
||||||
|
MAKE_VIDPID(0x04d9, 0xa292), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
||||||
|
MAKE_VIDPID(0x04d9, 0xa293), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
||||||
|
MAKE_VIDPID(0x1532, 0x0266), /* Razer Huntsman V2 Analog, non-functional DInput device */
|
||||||
|
MAKE_VIDPID(0x1532, 0x0282), /* Razer Huntsman Mini Analog, non-functional DInput device */
|
||||||
|
MAKE_VIDPID(0x26ce, 0x01a2), /* ASRock LED Controller */
|
||||||
|
MAKE_VIDPID(0x20d6, 0x0002), /* PowerA Enhanced Wireless Controller for Nintendo Switch (charging port only) */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list blacklist_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_BLACKLIST_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_blacklist_devices), initial_blacklist_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_flightstick_devices[] = {
|
||||||
|
MAKE_VIDPID(0x044f, 0x0402), /* HOTAS Warthog Joystick */
|
||||||
|
MAKE_VIDPID(0x0738, 0x2221), /* Saitek Pro Flight X-56 Rhino Stick */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb10a), /* ThrustMaster, Inc. T.16000M Joystick */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc215), /* Logitech Extreme 3D */
|
||||||
|
MAKE_VIDPID(0x231d, 0x0126), /* Gunfighter Mk.III ‘Space Combat Edition’ (right) */
|
||||||
|
MAKE_VIDPID(0x231d, 0x0127), /* Gunfighter Mk.III ‘Space Combat Edition’ (left) */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list flightstick_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_flightstick_devices), initial_flightstick_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_gamecube_devices[] = {
|
||||||
|
MAKE_VIDPID(0x0e6f, 0x0185), /* PDP Wired Fight Pad Pro for Nintendo Switch */
|
||||||
|
MAKE_VIDPID(0x20d6, 0xa711), /* PowerA Wired Controller Nintendo GameCube Style */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list gamecube_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_GAMECUBE_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_gamecube_devices), initial_gamecube_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_rog_gamepad_mice[] = {
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1906), /* ROG Pugio II */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1958), /* ROG Chakram Core Mouse */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x18e3), /* ROG Chakram (wired) Mouse */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x18e5), /* ROG Chakram (wireless) Mouse */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1a18), /* ROG Chakram X (wired) Mouse */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1a1a), /* ROG Chakram X (wireless) Mouse */
|
||||||
|
MAKE_VIDPID(0x0b05, 0x1a1c), /* ROG Chakram X (Bluetooth) Mouse */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list rog_gamepad_mice = {
|
||||||
|
SDL_HINT_ROG_GAMEPAD_MICE, 0, 0, NULL,
|
||||||
|
SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_rog_gamepad_mice), initial_rog_gamepad_mice,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_throttle_devices[] = {
|
||||||
|
MAKE_VIDPID(0x044f, 0x0404), /* HOTAS Warthog Throttle */
|
||||||
|
MAKE_VIDPID(0x0738, 0xa221), /* Saitek Pro Flight X-56 Rhino Throttle */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list throttle_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_THROTTLE_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_throttle_devices), initial_throttle_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_wheel_devices[] = {
|
||||||
|
MAKE_VIDPID(0x0079, 0x1864), /* DragonRise Inc. Wired Wheel (active mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc294), /* Logitech generic wheel */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc295), /* Logitech Momo Force */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc298), /* Logitech Driving Force Pro */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc299), /* Logitech G25 */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc29a), /* Logitech Driving Force GT */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc29b), /* Logitech G27 */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc24f), /* Logitech G29 (PS3) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc260), /* Logitech G29 (PS4) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc261), /* Logitech G920 (initial mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc268), /* Logitech PRO Racing Wheel (PC mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc269), /* Logitech PRO Racing Wheel (PS4/PS5 mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc272), /* Logitech PRO Racing Wheel for Xbox (PC mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc26d), /* Logitech G923 (Xbox) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc26e), /* Logitech G923 */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc266), /* Logitech G923 for Playstation 4 and PC (PC mode) */
|
||||||
|
MAKE_VIDPID(0x046d, 0xc267), /* Logitech G923 for Playstation 4 and PC (PS4 mode)*/
|
||||||
|
MAKE_VIDPID(0x046d, 0xca03), /* Logitech Momo Racing */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster Wheel FFB */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb677), /* Thrustmaster T150 */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb696), /* Thrustmaster T248 */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb66e), /* Thrustmaster T300RS (normal mode) */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb66f), /* Thrustmaster T300RS (advanced mode) */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster T300RS (PS4 mode) */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb65e), /* Thrustmaster T500RS */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
|
||||||
|
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
|
||||||
|
MAKE_VIDPID(0x0483, 0x0522), /* Simagic Wheelbase (including M10, Alpha Mini, Alpha, Alpha U) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0001), /* Fanatec ClubSport Wheel Base V2 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0004), /* Fanatec ClubSport Wheel Base V2.5 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0005), /* Fanatec CSL Elite Wheel Base+ (PS4) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0006), /* Fanatec Podium Wheel Base DD1 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0007), /* Fanatec Podium Wheel Base DD2 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0011), /* Fanatec Forza Motorsport (CSR Wheel / CSR Elite Wheel) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0020), /* Fanatec generic wheel / CSL DD / GT DD Pro */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0197), /* Fanatec Porsche Wheel (Turbo / GT3 RS / Turbo S / GT3 V2 / GT2) */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x038e), /* Fanatec ClubSport Wheel Base V1 */
|
||||||
|
MAKE_VIDPID(0x0eb7, 0x0e03), /* Fanatec CSL Elite Wheel Base */
|
||||||
|
MAKE_VIDPID(0x11ff, 0x0511), /* DragonRise Inc. Wired Wheel (initial mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf300), /* Asetek SimSports Invicta Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf301), /* Asetek SimSports Forte Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf303), /* Asetek SimSports La Prima Wheelbase */
|
||||||
|
MAKE_VIDPID(0x2433, 0xf306), /* Asetek SimSports Tony Kannan Wheelbase */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list wheel_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_WHEEL_DEVICES, 0, 0, NULL,
|
||||||
|
SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_wheel_devices), initial_wheel_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
static Uint32 initial_zero_centered_devices[] = {
|
||||||
|
MAKE_VIDPID(0x0e8f, 0x3013), /* HuiJia SNES USB adapter */
|
||||||
|
MAKE_VIDPID(0x05a0, 0x3232), /* 8Bitdo Zero Gamepad */
|
||||||
|
};
|
||||||
|
static SDL_vidpid_list zero_centered_devices = {
|
||||||
|
SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES, 0, 0, NULL,
|
||||||
|
NULL, 0, 0, NULL,
|
||||||
|
SDL_arraysize(initial_zero_centered_devices), initial_zero_centered_devices,
|
||||||
|
SDL_FALSE
|
||||||
|
};
|
||||||
|
|
||||||
#define CHECK_JOYSTICK_MAGIC(joystick, retval) \
|
#define CHECK_JOYSTICK_MAGIC(joystick, retval) \
|
||||||
if (!joystick || joystick->magic != &SDL_joystick_magic) { \
|
if (!joystick || joystick->magic != &SDL_joystick_magic) { \
|
||||||
SDL_InvalidParamError("joystick"); \
|
SDL_InvalidParamError("joystick"); \
|
||||||
|
@ -331,6 +609,15 @@ int SDL_JoystickInit(void)
|
||||||
|
|
||||||
SDL_GameControllerInitMappings();
|
SDL_GameControllerInitMappings();
|
||||||
|
|
||||||
|
SDL_LoadVIDPIDList(&arcadestick_devices);
|
||||||
|
SDL_LoadVIDPIDList(&blacklist_devices);
|
||||||
|
SDL_LoadVIDPIDList(&flightstick_devices);
|
||||||
|
SDL_LoadVIDPIDList(&gamecube_devices);
|
||||||
|
SDL_LoadVIDPIDList(&rog_gamepad_mice);
|
||||||
|
SDL_LoadVIDPIDList(&throttle_devices);
|
||||||
|
SDL_LoadVIDPIDList(&wheel_devices);
|
||||||
|
SDL_LoadVIDPIDList(&zero_centered_devices);
|
||||||
|
|
||||||
/* See if we should allow joystick events while in the background */
|
/* See if we should allow joystick events while in the background */
|
||||||
SDL_AddHintCallback(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,
|
SDL_AddHintCallback(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,
|
||||||
SDL_JoystickAllowBackgroundEventsChanged, NULL);
|
SDL_JoystickAllowBackgroundEventsChanged, NULL);
|
||||||
|
@ -436,35 +723,14 @@ static SDL_bool SDL_JoystickAxesCenteredAtZero(SDL_Joystick *joystick)
|
||||||
#ifdef __WINRT__
|
#ifdef __WINRT__
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
#else
|
#else
|
||||||
static Uint32 zero_centered_joysticks[] = {
|
|
||||||
MAKE_VIDPID(0x0e8f, 0x3013), /* HuiJia SNES USB adapter */
|
|
||||||
MAKE_VIDPID(0x05a0, 0x3232), /* 8Bitdo Zero Gamepad */
|
|
||||||
};
|
|
||||||
|
|
||||||
SDL_bool retval = SDL_FALSE;
|
|
||||||
int i;
|
|
||||||
Uint32 id = MAKE_VIDPID(SDL_JoystickGetVendor(joystick),
|
|
||||||
SDL_JoystickGetProduct(joystick));
|
|
||||||
|
|
||||||
/*printf("JOYSTICK '%s' VID/PID 0x%.4x/0x%.4x AXES: %d\n", joystick->name, vendor, product, joystick->naxes);*/
|
/*printf("JOYSTICK '%s' VID/PID 0x%.4x/0x%.4x AXES: %d\n", joystick->name, vendor, product, joystick->naxes);*/
|
||||||
|
|
||||||
SDL_LockJoysticks();
|
|
||||||
{
|
|
||||||
if (joystick->naxes == 2) {
|
if (joystick->naxes == 2) {
|
||||||
/* Assume D-pad or thumbstick style axes are centered at 0 */
|
/* Assume D-pad or thumbstick style axes are centered at 0 */
|
||||||
retval = SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(zero_centered_joysticks); ++i) {
|
return SDL_VIDPIDInList(SDL_JoystickGetVendor(joystick), SDL_JoystickGetProduct(joystick), &zero_centered_devices);
|
||||||
if (id == zero_centered_joysticks[i]) {
|
|
||||||
retval = SDL_TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SDL_UnlockJoysticks();
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
#endif /* __WINRT__ */
|
#endif /* __WINRT__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1346,6 +1612,15 @@ void SDL_JoystickQuit(void)
|
||||||
SDL_DelHintCallback(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,
|
SDL_DelHintCallback(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,
|
||||||
SDL_JoystickAllowBackgroundEventsChanged, NULL);
|
SDL_JoystickAllowBackgroundEventsChanged, NULL);
|
||||||
|
|
||||||
|
SDL_FreeVIDPIDList(&arcadestick_devices);
|
||||||
|
SDL_FreeVIDPIDList(&blacklist_devices);
|
||||||
|
SDL_FreeVIDPIDList(&flightstick_devices);
|
||||||
|
SDL_FreeVIDPIDList(&gamecube_devices);
|
||||||
|
SDL_FreeVIDPIDList(&rog_gamepad_mice);
|
||||||
|
SDL_FreeVIDPIDList(&throttle_devices);
|
||||||
|
SDL_FreeVIDPIDList(&wheel_devices);
|
||||||
|
SDL_FreeVIDPIDList(&zero_centered_devices);
|
||||||
|
|
||||||
SDL_GameControllerQuitMappings();
|
SDL_GameControllerQuitMappings();
|
||||||
|
|
||||||
SDL_joysticks_quitting = SDL_FALSE;
|
SDL_joysticks_quitting = SDL_FALSE;
|
||||||
|
@ -2494,152 +2769,48 @@ SDL_bool SDL_IsJoystickVirtual(SDL_JoystickGUID guid)
|
||||||
return (guid.data[14] == 'v') ? SDL_TRUE : SDL_FALSE;
|
return (guid.data[14] == 'v') ? SDL_TRUE : SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_bool SDL_IsJoystickProductWheel(Uint32 vidpid)
|
static SDL_bool SDL_IsJoystickWheel(Uint16 vendor_id, Uint16 product_id)
|
||||||
{
|
{
|
||||||
static Uint32 wheel_joysticks[] = {
|
return SDL_VIDPIDInList(vendor_id, product_id, &wheel_devices);
|
||||||
MAKE_VIDPID(0x0079, 0x1864), /* DragonRise Inc. Wired Wheel (active mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc294), /* Logitech generic wheel */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc295), /* Logitech Momo Force */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc298), /* Logitech Driving Force Pro */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc299), /* Logitech G25 */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc29a), /* Logitech Driving Force GT */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc29b), /* Logitech G27 */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc24f), /* Logitech G29 (PS3) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc260), /* Logitech G29 (PS4) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc261), /* Logitech G920 (initial mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc268), /* Logitech PRO Racing Wheel (PC mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc269), /* Logitech PRO Racing Wheel (PS4/PS5 mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc272), /* Logitech PRO Racing Wheel for Xbox (PC mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc26d), /* Logitech G923 (Xbox) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc26e), /* Logitech G923 */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc266), /* Logitech G923 for Playstation 4 and PC (PC mode) */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc267), /* Logitech G923 for Playstation 4 and PC (PS4 mode)*/
|
|
||||||
MAKE_VIDPID(0x046d, 0xca03), /* Logitech Momo Racing */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster Wheel FFB */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb677), /* Thrustmaster T150 */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb696), /* Thrustmaster T248 */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb66e), /* Thrustmaster T300RS (normal mode) */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb66f), /* Thrustmaster T300RS (advanced mode) */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster T300RS (PS4 mode) */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb65e), /* Thrustmaster T500RS */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
|
|
||||||
MAKE_VIDPID(0x0483, 0x0522), /* Simagic Wheelbase (including M10, Alpha Mini, Alpha, Alpha U) */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0001), /* Fanatec ClubSport Wheel Base V2 */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0004), /* Fanatec ClubSport Wheel Base V2.5 */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0005), /* Fanatec CSL Elite Wheel Base+ (PS4) */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0006), /* Fanatec Podium Wheel Base DD1 */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0007), /* Fanatec Podium Wheel Base DD2 */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0011), /* Fanatec Forza Motorsport (CSR Wheel / CSR Elite Wheel) */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0020), /* Fanatec generic wheel / CSL DD / GT DD Pro */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0197), /* Fanatec Porsche Wheel (Turbo / GT3 RS / Turbo S / GT3 V2 / GT2) */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x038e), /* Fanatec ClubSport Wheel Base V1 */
|
|
||||||
MAKE_VIDPID(0x0eb7, 0x0e03), /* Fanatec CSL Elite Wheel Base */
|
|
||||||
MAKE_VIDPID(0x11ff, 0x0511), /* DragonRise Inc. Wired Wheel (initial mode) (also known as PXN V900 (PS3), Superdrive SV-750, or a Genesis Seaborg 400) */
|
|
||||||
MAKE_VIDPID(0x2433, 0xf300), /* Asetek SimSports Invicta Wheelbase */
|
|
||||||
MAKE_VIDPID(0x2433, 0xf301), /* Asetek SimSports Forte Wheelbase */
|
|
||||||
MAKE_VIDPID(0x2433, 0xf303), /* Asetek SimSports La Prima Wheelbase */
|
|
||||||
MAKE_VIDPID(0x2433, 0xf306), /* Asetek SimSports Tony Kannan Wheelbase */
|
|
||||||
};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(wheel_joysticks); ++i) {
|
|
||||||
if (vidpid == wheel_joysticks[i]) {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_bool SDL_IsJoystickProductArcadeStick(Uint32 vidpid)
|
static SDL_bool SDL_IsJoystickArcadeStick(Uint16 vendor_id, Uint16 product_id)
|
||||||
{
|
{
|
||||||
static Uint32 arcadestick_joysticks[] = {
|
return SDL_VIDPIDInList(vendor_id, product_id, &arcadestick_devices);
|
||||||
MAKE_VIDPID(0x0079, 0x181a), /* Venom Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x0079, 0x181b), /* Venom Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x0c12, 0x0ef6), /* Hitbox Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x0e6f, 0x0109), /* PDP Versus Fighting Pad */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x0016), /* Hori Real Arcade Pro.EX */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x001b), /* Hori Real Arcade Pro VX */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x0063), /* Hori Real Arcade Pro Hayabusa (USA) Xbox One */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x006a), /* Real Arcade Pro 4 */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x0078), /* Hori Real Arcade Pro V Kai Xbox One */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x008a), /* HORI Real Arcade Pro 4 */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x008c), /* Hori Real Arcade Pro 4 */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x00aa), /* HORI Real Arcade Pro V Hayabusa in Switch Mode */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x00ed), /* Hori Fighting Stick mini 4 kai */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x011c), /* Hori Fighting Stick α in PS4 Mode */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x011e), /* Hori Fighting Stick α in PC Mode */
|
|
||||||
MAKE_VIDPID(0x0f0d, 0x0184), /* Hori Fighting Stick α in PS5 Mode */
|
|
||||||
MAKE_VIDPID(0x146b, 0x0604), /* NACON Daija Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x1532, 0x0a00), /* Razer Atrox Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x1bad, 0xf03d), /* Street Fighter IV Arcade Stick TE - Chun Li */
|
|
||||||
MAKE_VIDPID(0x1bad, 0xf502), /* Hori Real Arcade Pro.VX SA */
|
|
||||||
MAKE_VIDPID(0x1bad, 0xf504), /* Hori Real Arcade Pro. EX */
|
|
||||||
MAKE_VIDPID(0x1bad, 0xf506), /* Hori Real Arcade Pro.EX Premium VLX */
|
|
||||||
MAKE_VIDPID(0x20d6, 0xa715), /* PowerA Nintendo Switch Fusion Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x24c6, 0x5000), /* Razer Atrox Arcade Stick */
|
|
||||||
MAKE_VIDPID(0x24c6, 0x5501), /* Hori Real Arcade Pro VX-SA */
|
|
||||||
MAKE_VIDPID(0x24c6, 0x550e), /* Hori Real Arcade Pro V Kai 360 */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2300), /* Qanba Obsidian Arcade Joystick in PS4 Mode */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2302), /* Qanba Obsidian Arcade Joystick in PS3 Mode */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2303), /* Qanba Obsidian Arcade Joystick in PC Mode */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2500), /* Qanba Dragon Arcade Joystick in PS4 Mode */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2502), /* Qanba Dragon Arcade Joystick in PS3 Mode */
|
|
||||||
MAKE_VIDPID(0x2c22, 0x2503), /* Qanba Dragon Arcade Joystick in PC Mode */
|
|
||||||
};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(arcadestick_joysticks); ++i) {
|
|
||||||
if (vidpid == arcadestick_joysticks[i]) {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_bool SDL_IsJoystickProductFlightStick(Uint32 vidpid)
|
static SDL_bool SDL_IsJoystickFlightStick(Uint16 vendor_id, Uint16 product_id)
|
||||||
{
|
{
|
||||||
static Uint32 flightstick_joysticks[] = {
|
return SDL_VIDPIDInList(vendor_id, product_id, &flightstick_devices);
|
||||||
MAKE_VIDPID(0x044f, 0x0402), /* HOTAS Warthog Joystick */
|
|
||||||
MAKE_VIDPID(0x0738, 0x2221), /* Saitek Pro Flight X-56 Rhino Stick */
|
|
||||||
MAKE_VIDPID(0x044f, 0xb10a), /* ThrustMaster, Inc. T.16000M Joystick */
|
|
||||||
MAKE_VIDPID(0x046d, 0xc215), /* Logitech Extreme 3D */
|
|
||||||
MAKE_VIDPID(0x231d, 0x0126), /* Gunfighter Mk.III ‘Space Combat Edition’ (right) */
|
|
||||||
MAKE_VIDPID(0x231d, 0x0127), /* Gunfighter Mk.III ‘Space Combat Edition’ (left) */
|
|
||||||
};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(flightstick_joysticks); ++i) {
|
|
||||||
if (vidpid == flightstick_joysticks[i]) {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_bool SDL_IsJoystickProductThrottle(Uint32 vidpid)
|
static SDL_bool SDL_IsJoystickThrottle(Uint16 vendor_id, Uint16 product_id)
|
||||||
{
|
{
|
||||||
static Uint32 throttle_joysticks[] = {
|
return SDL_VIDPIDInList(vendor_id, product_id, &throttle_devices);
|
||||||
MAKE_VIDPID(0x044f, 0x0404), /* HOTAS Warthog Throttle */
|
|
||||||
MAKE_VIDPID(0x0738, 0xa221), /* Saitek Pro Flight X-56 Rhino Throttle */
|
|
||||||
};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < SDL_arraysize(throttle_joysticks); ++i) {
|
|
||||||
if (vidpid == throttle_joysticks[i]) {
|
|
||||||
return SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
|
static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
|
||||||
{
|
{
|
||||||
Uint16 vendor;
|
Uint16 vendor;
|
||||||
Uint16 product;
|
Uint16 product;
|
||||||
Uint32 vidpid;
|
|
||||||
|
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL, NULL);
|
||||||
|
|
||||||
|
if (SDL_IsJoystickWheel(vendor, product)) {
|
||||||
|
return SDL_JOYSTICK_TYPE_WHEEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_IsJoystickArcadeStick(vendor, product)) {
|
||||||
|
return SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_IsJoystickFlightStick(vendor, product)) {
|
||||||
|
return SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_IsJoystickThrottle(vendor, product)) {
|
||||||
|
return SDL_JOYSTICK_TYPE_THROTTLE;
|
||||||
|
}
|
||||||
|
|
||||||
if (SDL_IsJoystickXInput(guid)) {
|
if (SDL_IsJoystickXInput(guid)) {
|
||||||
/* XInput GUID, get the type based on the XInput device subtype */
|
/* XInput GUID, get the type based on the XInput device subtype */
|
||||||
|
@ -2675,25 +2846,6 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
|
||||||
return (SDL_JoystickType)guid.data[15];
|
return (SDL_JoystickType)guid.data[15];
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL, NULL);
|
|
||||||
vidpid = MAKE_VIDPID(vendor, product);
|
|
||||||
|
|
||||||
if (SDL_IsJoystickProductWheel(vidpid)) {
|
|
||||||
return SDL_JOYSTICK_TYPE_WHEEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SDL_IsJoystickProductArcadeStick(vidpid)) {
|
|
||||||
return SDL_JOYSTICK_TYPE_ARCADE_STICK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SDL_IsJoystickProductFlightStick(vidpid)) {
|
|
||||||
return SDL_JOYSTICK_TYPE_FLIGHT_STICK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SDL_IsJoystickProductThrottle(vidpid)) {
|
|
||||||
return SDL_JOYSTICK_TYPE_THROTTLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SDL_JOYSTICK_HIDAPI
|
#ifdef SDL_JOYSTICK_HIDAPI
|
||||||
if (SDL_IsJoystickHIDAPI(guid)) {
|
if (SDL_IsJoystickHIDAPI(guid)) {
|
||||||
return HIDAPI_GetJoystickTypeFromGUID(guid);
|
return HIDAPI_GetJoystickTypeFromGUID(guid);
|
||||||
|
@ -2709,150 +2861,20 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
|
||||||
|
|
||||||
SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
|
SDL_bool SDL_ShouldIgnoreJoystick(const char *name, SDL_JoystickGUID guid)
|
||||||
{
|
{
|
||||||
/* This list is taken from:
|
|
||||||
https://raw.githubusercontent.com/denilsonsa/udev-joystick-blacklist/master/generate_rules.py
|
|
||||||
*/
|
|
||||||
static Uint32 joystick_blacklist[] = {
|
|
||||||
/* Microsoft Microsoft Wireless Optical Desktop 2.10 */
|
|
||||||
/* Microsoft Wireless Desktop - Comfort Edition */
|
|
||||||
MAKE_VIDPID(0x045e, 0x009d),
|
|
||||||
|
|
||||||
/* Microsoft Microsoft Digital Media Pro Keyboard */
|
|
||||||
/* Microsoft Corp. Digital Media Pro Keyboard */
|
|
||||||
MAKE_VIDPID(0x045e, 0x00b0),
|
|
||||||
|
|
||||||
/* Microsoft Microsoft Digital Media Keyboard */
|
|
||||||
/* Microsoft Corp. Digital Media Keyboard 1.0A */
|
|
||||||
MAKE_VIDPID(0x045e, 0x00b4),
|
|
||||||
|
|
||||||
/* Microsoft Microsoft Digital Media Keyboard 3000 */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0730),
|
|
||||||
|
|
||||||
/* Microsoft Microsoft 2.4GHz Transceiver v6.0 */
|
|
||||||
/* Microsoft Microsoft 2.4GHz Transceiver v8.0 */
|
|
||||||
/* Microsoft Corp. Nano Transceiver v1.0 for Bluetooth */
|
|
||||||
/* Microsoft Wireless Mobile Mouse 1000 */
|
|
||||||
/* Microsoft Wireless Desktop 3000 */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0745),
|
|
||||||
|
|
||||||
/* Microsoft SideWinder(TM) 2.4GHz Transceiver */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0748),
|
|
||||||
|
|
||||||
/* Microsoft Corp. Wired Keyboard 600 */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0750),
|
|
||||||
|
|
||||||
/* Microsoft Corp. Sidewinder X4 keyboard */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0768),
|
|
||||||
|
|
||||||
/* Microsoft Corp. Arc Touch Mouse Transceiver */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0773),
|
|
||||||
|
|
||||||
/* Microsoft 2.4GHz Transceiver v9.0 */
|
|
||||||
/* Microsoft Nano Transceiver v2.1 */
|
|
||||||
/* Microsoft Sculpt Ergonomic Keyboard (5KV-00001) */
|
|
||||||
MAKE_VIDPID(0x045e, 0x07a5),
|
|
||||||
|
|
||||||
/* Microsoft Nano Transceiver v1.0 */
|
|
||||||
/* Microsoft Wireless Keyboard 800 */
|
|
||||||
MAKE_VIDPID(0x045e, 0x07b2),
|
|
||||||
|
|
||||||
/* Microsoft Nano Transceiver v2.0 */
|
|
||||||
MAKE_VIDPID(0x045e, 0x0800),
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x046d, 0xc30a), /* Logitech, Inc. iTouch Composite keboard */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x04d9, 0xa0df), /* Tek Syndicate Mouse (E-Signal USB Gaming Mouse) */
|
|
||||||
|
|
||||||
/* List of Wacom devices at: http://linuxwacom.sourceforge.net/wiki/index.php/Device_IDs */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0010), /* Wacom ET-0405 Graphire */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0011), /* Wacom ET-0405A Graphire2 (4x5) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0012), /* Wacom ET-0507A Graphire2 (5x7) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0013), /* Wacom CTE-430 Graphire3 (4x5) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0014), /* Wacom CTE-630 Graphire3 (6x8) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0015), /* Wacom CTE-440 Graphire4 (4x5) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0016), /* Wacom CTE-640 Graphire4 (6x8) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0017), /* Wacom CTE-450 Bamboo Fun (4x5) */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0018), /* Wacom CTE-650 Bamboo Fun 6x8 */
|
|
||||||
MAKE_VIDPID(0x056a, 0x0019), /* Wacom CTE-631 Bamboo One */
|
|
||||||
MAKE_VIDPID(0x056a, 0x00d1), /* Wacom Bamboo Pen and Touch CTH-460 */
|
|
||||||
MAKE_VIDPID(0x056a, 0x030e), /* Wacom Intuos Pen (S) CTL-480 */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x09da, 0x054f), /* A4 Tech Co., G7 750 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x1410), /* A4 Tech Co., Ltd Bloody AL9 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x3043), /* A4 Tech Co., Ltd Bloody R8A Gaming Mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x31b5), /* A4 Tech Co., Ltd Bloody TL80 Terminator Laser Gaming Mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x3997), /* A4 Tech Co., Ltd Bloody RT7 Terminator Wireless */
|
|
||||||
MAKE_VIDPID(0x09da, 0x3f8b), /* A4 Tech Co., Ltd Bloody V8 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x51f4), /* Modecom MC-5006 Keyboard */
|
|
||||||
MAKE_VIDPID(0x09da, 0x5589), /* A4 Tech Co., Ltd Terminator TL9 Laser Gaming Mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x7b22), /* A4 Tech Co., Ltd Bloody V5 */
|
|
||||||
MAKE_VIDPID(0x09da, 0x7f2d), /* A4 Tech Co., Ltd Bloody R3 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x8090), /* A4 Tech Co., Ltd X-718BK Oscar Optical Gaming Mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x9033), /* A4 Tech Co., X7 X-705K */
|
|
||||||
MAKE_VIDPID(0x09da, 0x9066), /* A4 Tech Co., Sharkoon Fireglider Optical */
|
|
||||||
MAKE_VIDPID(0x09da, 0x9090), /* A4 Tech Co., Ltd XL-730K / XL-750BK / XL-755BK Laser Mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0x90c0), /* A4 Tech Co., Ltd X7 G800V keyboard */
|
|
||||||
MAKE_VIDPID(0x09da, 0xf012), /* A4 Tech Co., Ltd Bloody V7 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0xf32a), /* A4 Tech Co., Ltd Bloody B540 keyboard */
|
|
||||||
MAKE_VIDPID(0x09da, 0xf613), /* A4 Tech Co., Ltd Bloody V2 mouse */
|
|
||||||
MAKE_VIDPID(0x09da, 0xf624), /* A4 Tech Co., Ltd Bloody B120 Keyboard */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x1b1c, 0x1b3c), /* Corsair Harpoon RGB gaming mouse */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x1d57, 0xad03), /* [T3] 2.4GHz and IR Air Mouse Remote Control */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x1e7d, 0x2e4a), /* Roccat Tyon Mouse */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x20a0, 0x422d), /* Winkeyless.kr Keyboards */
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x2516, 0x001f), /* Cooler Master Storm Mizar Mouse */
|
|
||||||
MAKE_VIDPID(0x2516, 0x0028), /* Cooler Master Storm Alcor Mouse */
|
|
||||||
|
|
||||||
/*****************************************************************/
|
|
||||||
/* Additional entries */
|
|
||||||
/*****************************************************************/
|
|
||||||
|
|
||||||
MAKE_VIDPID(0x04d9, 0x8008), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
|
||||||
MAKE_VIDPID(0x04d9, 0x8009), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
|
||||||
MAKE_VIDPID(0x04d9, 0xa292), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
|
||||||
MAKE_VIDPID(0x04d9, 0xa293), /* OBINLB USB-HID Keyboard (Anne Pro II) */
|
|
||||||
MAKE_VIDPID(0x1532, 0x0266), /* Razer Huntsman V2 Analog, non-functional DInput device */
|
|
||||||
MAKE_VIDPID(0x1532, 0x0282), /* Razer Huntsman Mini Analog, non-functional DInput device */
|
|
||||||
MAKE_VIDPID(0x26ce, 0x01a2), /* ASRock LED Controller */
|
|
||||||
MAKE_VIDPID(0x20d6, 0x0002), /* PowerA Enhanced Wireless Controller for Nintendo Switch (charging port only) */
|
|
||||||
};
|
|
||||||
|
|
||||||
static Uint32 rog_chakram_list[] = {
|
|
||||||
MAKE_VIDPID(0x0b05, 0x1906), /* ROG Pugio II */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x1958), /* ROG Chakram Core Mouse */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x18e3), /* ROG Chakram (wired) Mouse */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x18e5), /* ROG Chakram (wireless) Mouse */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x1a18), /* ROG Chakram X (wired) Mouse */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x1a1a), /* ROG Chakram X (wireless) Mouse */
|
|
||||||
MAKE_VIDPID(0x0b05, 0x1a1c), /* ROG Chakram X (Bluetooth) Mouse */
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int i;
|
|
||||||
Uint32 id;
|
|
||||||
Uint16 vendor;
|
Uint16 vendor;
|
||||||
Uint16 product;
|
Uint16 product;
|
||||||
|
|
||||||
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL, NULL);
|
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL, NULL);
|
||||||
|
|
||||||
/* Check the joystick blacklist */
|
/* Check the joystick blacklist */
|
||||||
id = MAKE_VIDPID(vendor, product);
|
if (SDL_VIDPIDInList(vendor, product, &blacklist_devices)) {
|
||||||
for (i = 0; i < SDL_arraysize(joystick_blacklist); ++i) {
|
|
||||||
if (id == joystick_blacklist[i]) {
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_ROG_CHAKRAM, SDL_FALSE)) {
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_ROG_CHAKRAM, SDL_FALSE)) {
|
||||||
for (i = 0; i < SDL_arraysize(rog_chakram_list); ++i) {
|
if (SDL_VIDPIDInList(vendor, product, &rog_gamepad_mice)) {
|
||||||
if (id == rog_chakram_list[i]) {
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (SDL_ShouldIgnoreGameController(name, guid)) {
|
if (SDL_ShouldIgnoreGameController(name, guid)) {
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
|
@ -3226,14 +3248,12 @@ int SDL_PrivateJoystickSensor(SDL_Joystick *joystick, SDL_SensorType type, Uint6
|
||||||
return posted;
|
return posted;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
|
static void SDL_LoadVIDPIDListFromHint(const char *hint, int *num_entries, int *max_entries, Uint32 **entries)
|
||||||
{
|
{
|
||||||
Uint32 entry;
|
Uint32 entry;
|
||||||
char *spot;
|
char *spot;
|
||||||
char *file = NULL;
|
char *file = NULL;
|
||||||
|
|
||||||
list->num_entries = 0;
|
|
||||||
|
|
||||||
if (hint && *hint == '@') {
|
if (hint && *hint == '@') {
|
||||||
spot = file = (char *)SDL_LoadFile(hint + 1, NULL);
|
spot = file = (char *)SDL_LoadFile(hint + 1, NULL);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3253,17 +3273,17 @@ void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
|
||||||
}
|
}
|
||||||
entry |= (Uint16)SDL_strtol(spot, &spot, 0);
|
entry |= (Uint16)SDL_strtol(spot, &spot, 0);
|
||||||
|
|
||||||
if (list->num_entries == list->max_entries) {
|
if (*num_entries == *max_entries) {
|
||||||
int max_entries = list->max_entries + 16;
|
int new_max_entries = *max_entries + 16;
|
||||||
Uint32 *entries = (Uint32 *)SDL_realloc(list->entries, max_entries * sizeof(*list->entries));
|
Uint32 *new_entries = (Uint32 *)SDL_realloc(*entries, new_max_entries * sizeof(**entries));
|
||||||
if (entries == NULL) {
|
if (!new_entries) {
|
||||||
/* Out of memory, go with what we have already */
|
/* Out of memory, go with what we have already */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
list->entries = entries;
|
*entries = new_entries;
|
||||||
list->max_entries = max_entries;
|
*max_entries = new_max_entries;
|
||||||
}
|
}
|
||||||
list->entries[list->num_entries++] = entry;
|
(*entries)[(*num_entries)++] = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
|
@ -3271,13 +3291,100 @@ void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDL_LoadVIDPIDListFromHints(SDL_vidpid_list *list, const char *included_list, const char *excluded_list)
|
||||||
|
{
|
||||||
|
/* Empty the list */
|
||||||
|
list->num_included_entries = 0;
|
||||||
|
list->num_excluded_entries = 0;
|
||||||
|
|
||||||
|
/* Add the initial entries */
|
||||||
|
if (list->num_initial_entries > 0) {
|
||||||
|
if (list->num_included_entries < list->num_initial_entries) {
|
||||||
|
Uint32 *entries = (Uint32 *)SDL_malloc(list->num_initial_entries * sizeof(*entries));
|
||||||
|
if (entries) {
|
||||||
|
SDL_memcpy(entries, list->initial_entries, list->num_initial_entries * sizeof(*entries));
|
||||||
|
list->included_entries = entries;
|
||||||
|
list->num_included_entries = list->num_initial_entries;
|
||||||
|
list->max_included_entries = list->num_initial_entries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the included entries from the hint */
|
||||||
|
SDL_LoadVIDPIDListFromHint(included_list, &list->num_included_entries, &list->max_included_entries, &list->included_entries);
|
||||||
|
|
||||||
|
/* Add the excluded entries from the hint */
|
||||||
|
SDL_LoadVIDPIDListFromHint(excluded_list, &list->num_excluded_entries, &list->max_excluded_entries, &list->excluded_entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SDLCALL SDL_VIDPIDIncludedHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
|
{
|
||||||
|
SDL_vidpid_list *list = (SDL_vidpid_list *)userdata;
|
||||||
|
const char *included_list = hint;
|
||||||
|
const char *excluded_list = NULL;
|
||||||
|
|
||||||
|
if (!list->initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->excluded_hint_name) {
|
||||||
|
excluded_list = SDL_GetHint(list->excluded_hint_name);
|
||||||
|
}
|
||||||
|
SDL_LoadVIDPIDListFromHints(list, included_list, excluded_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SDLCALL SDL_VIDPIDExcludedHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
|
{
|
||||||
|
SDL_vidpid_list *list = (SDL_vidpid_list *)userdata;
|
||||||
|
const char *included_list = NULL;
|
||||||
|
const char *excluded_list = hint;
|
||||||
|
|
||||||
|
if (!list->initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->included_hint_name) {
|
||||||
|
included_list = SDL_GetHint(list->included_hint_name);
|
||||||
|
}
|
||||||
|
SDL_LoadVIDPIDListFromHints(list, included_list, excluded_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_LoadVIDPIDList(SDL_vidpid_list *list)
|
||||||
|
{
|
||||||
|
const char *included_list = NULL;
|
||||||
|
const char *excluded_list = NULL;
|
||||||
|
|
||||||
|
if (list->included_hint_name) {
|
||||||
|
SDL_AddHintCallback(list->included_hint_name, SDL_VIDPIDIncludedHintChanged, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->excluded_hint_name) {
|
||||||
|
SDL_AddHintCallback(list->excluded_hint_name, SDL_VIDPIDExcludedHintChanged, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
list->initialized = SDL_TRUE;
|
||||||
|
|
||||||
|
if (list->included_hint_name) {
|
||||||
|
included_list = SDL_GetHint(list->included_hint_name);
|
||||||
|
}
|
||||||
|
if (list->excluded_hint_name) {
|
||||||
|
excluded_list = SDL_GetHint(list->excluded_hint_name);
|
||||||
|
}
|
||||||
|
SDL_LoadVIDPIDListFromHints(list, included_list, excluded_list);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_list *list)
|
SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_list *list)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Uint32 vidpid = MAKE_VIDPID(vendor_id, product_id);
|
Uint32 vidpid = MAKE_VIDPID(vendor_id, product_id);
|
||||||
|
|
||||||
for (i = 0; i < list->num_entries; ++i) {
|
for (i = 0; i < list->num_excluded_entries; ++i) {
|
||||||
if (vidpid == list->entries[i]) {
|
if (vidpid == list->excluded_entries[i]) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < list->num_included_entries; ++i) {
|
||||||
|
if (vidpid == list->included_entries[i]) {
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3286,10 +3393,29 @@ SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_
|
||||||
|
|
||||||
void SDL_FreeVIDPIDList(SDL_vidpid_list *list)
|
void SDL_FreeVIDPIDList(SDL_vidpid_list *list)
|
||||||
{
|
{
|
||||||
if (list->entries) {
|
if (list->included_hint_name) {
|
||||||
SDL_free(list->entries);
|
SDL_DelHintCallback(list->included_hint_name, SDL_VIDPIDIncludedHintChanged, list);
|
||||||
SDL_zerop(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (list->excluded_hint_name) {
|
||||||
|
SDL_DelHintCallback(list->excluded_hint_name, SDL_VIDPIDExcludedHintChanged, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->included_entries) {
|
||||||
|
SDL_free(list->included_entries);
|
||||||
|
list->included_entries = NULL;
|
||||||
|
list->num_included_entries = 0;
|
||||||
|
list->max_included_entries = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->excluded_entries) {
|
||||||
|
SDL_free(list->excluded_entries);
|
||||||
|
list->excluded_entries = NULL;
|
||||||
|
list->num_excluded_entries = 0;
|
||||||
|
list->max_excluded_entries = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->initialized = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -234,12 +234,24 @@ extern SDL_bool SDL_PrivateJoystickGetAutoGamepadMapping(int device_index,
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int num_entries;
|
const char *included_hint_name;
|
||||||
int max_entries;
|
int num_included_entries;
|
||||||
Uint32 *entries;
|
int max_included_entries;
|
||||||
|
Uint32 *included_entries;
|
||||||
|
|
||||||
|
const char *excluded_hint_name;
|
||||||
|
int num_excluded_entries;
|
||||||
|
int max_excluded_entries;
|
||||||
|
Uint32 *excluded_entries;
|
||||||
|
|
||||||
|
int num_initial_entries;
|
||||||
|
Uint32 *initial_entries;
|
||||||
|
|
||||||
|
SDL_bool initialized;
|
||||||
} SDL_vidpid_list;
|
} SDL_vidpid_list;
|
||||||
|
|
||||||
extern void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list);
|
extern void SDL_LoadVIDPIDList(SDL_vidpid_list *list);
|
||||||
|
extern void SDL_LoadVIDPIDListFromHints(SDL_vidpid_list *list, const char *included_list, const char *excluded_list);
|
||||||
extern SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const 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);
|
extern void SDL_FreeVIDPIDList(SDL_vidpid_list *list);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue