@@ -121,6 +121,284 @@ static SDL_JoystickID *SDL_joystick_players SDL_GUARDED_BY(SDL_joystick_lock) =
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE ;
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) \
if (!joystick || joystick->magic != &SDL_joystick_magic) { \
SDL_InvalidParamError("joystick"); \
@@ -333,6 +611,15 @@ int SDL_InitJoysticks(void)
SDL_InitGamepadMappings ( ) ;
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 */
SDL_AddHintCallback ( SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS ,
SDL_JoystickAllowBackgroundEventsChanged , NULL ) ;
@@ -474,35 +761,14 @@ static SDL_bool SDL_JoystickAxesCenteredAtZero(SDL_Joystick *joystick)
# ifdef __WINRT__
return SDL_TRUE ;
# 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_GetJoystickVendor ( joystick ) ,
SDL_GetJoystickProduct ( joystick ) ) ;
/*printf("JOYSTICK '%s' VID/PID 0x%.4x/0x%.4x AXES: %d\n", joystick->name, vendor, product, joystick->naxes);*/
SDL_LockJoysticks ( ) ;
{
if ( joystick - > naxes = = 2 ) {
/* Assume D-pad or thumbstick style axes are centered at 0 */
retval = SDL_TRUE ;
}
for ( i = 0 ; i < SDL_arraysize ( zero_centered_joysticks ) ; + + i ) {
if ( id = = zero_centered_joysticks [ i ] ) {
retval = SDL_TRUE ;
break ;
}
}
if ( joystick - > naxes = = 2 ) {
/* Assume D-pad or thumbstick style axes are centered at 0 */
return SDL_TRUE ;
}
SDL_UnlockJoysticks ( ) ;
return retval ;
return SDL_VIDPIDInList ( SDL_GetJoystickVendor ( joystick ) , SDL_GetJoystickProduct ( joystick ) , & zero_centered_devices ) ;
# endif /* __WINRT__ */
}
@@ -587,7 +853,7 @@ static SDL_bool ShouldAttemptSensorFusion(SDL_Joystick *joystick, SDL_bool *inve
/* See if the gamepad is in our list of devices to enable */
guid = SDL_GetJoystickGUID ( joystick ) ;
SDL_GetJoystickGUIDInfo ( guid , & vendor , & product , NULL , NULL ) ;
SDL_LoadVIDPIDListFromHint ( hint , & gamepads ) ;
SDL_LoadVIDPIDListFromHints ( & gamepads , hint , NULL );
enabled = SDL_VIDPIDInList ( vendor , product , & gamepads ) ;
SDL_FreeVIDPIDList ( & gamepads ) ;
if ( enabled ) {
@@ -1560,6 +1826,15 @@ void SDL_QuitJoysticks(void)
SDL_DelHintCallback ( SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS ,
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_QuitGamepadMappings ( ) ;
SDL_joysticks_quitting = SDL_FALSE ;
@@ -2613,19 +2888,7 @@ SDL_bool SDL_IsJoystickNintendoSwitchJoyConPair(Uint16 vendor_id, Uint16 product
SDL_bool SDL_IsJoystickGameCube ( Uint16 vendor_id , Uint16 product_id )
{
static Uint32 gamecube_formfactor [ ] = {
MAKE_VIDPID ( 0x0e6f , 0x0185 ) , /* PDP Wired Fight Pad Pro for Nintendo Switch */
MAKE_VIDPID ( 0x20d6 , 0xa711 ) , /* PowerA Wired Controller Nintendo GameCube Style */
} ;
Uint32 id = MAKE_VIDPID ( vendor_id , product_id ) ;
int i ;
for ( i = 0 ; i < SDL_arraysize ( gamecube_formfactor ) ; + + i ) {
if ( id = = gamecube_formfactor [ i ] ) {
return SDL_TRUE ;
}
}
return SDL_FALSE ;
return SDL_VIDPIDInList ( vendor_id , product_id , & gamecube_devices ) ;
}
SDL_bool SDL_IsJoystickAmazonLunaController ( Uint16 vendor_id , Uint16 product_id )
@@ -2682,152 +2945,48 @@ SDL_bool SDL_IsJoystickVIRTUAL(SDL_JoystickGUID guid)
return ( guid . data [ 14 ] = = ' v ' ) ? SDL_TRUE : SDL_FALSE ;
}
static SDL_bool SDL_IsJoystickProduct Wheel ( Uint32 vidp id )
static SDL_bool SDL_IsJoystickWheel ( Uint16 vendor_id , Uint16 product_ id )
{
static Uint32 wheel_joyst ick s [ ] = {
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 ;
return SDL_VIDPIDInList ( vendor_id , product_id , & wheel_dev ice s ) ;
}
static SDL_bool SDL_IsJoystickProduct ArcadeStick ( Uint32 vidp id )
static SDL_bool SDL_IsJoystickArcadeStick ( Uint16 vendor_id , Uint16 product_ id )
{
static Uint32 arcadestick_joyst ick s [ ] = {
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 ;
return SDL_VIDPIDInList ( vendor_id , product_id , & arcadestick_dev ice s ) ;
}
static SDL_bool SDL_IsJoystickProduct FlightStick ( Uint32 vidp id )
static SDL_bool SDL_IsJoystickFlightStick ( Uint16 vendor_id , Uint16 product_ id )
{
static Uint32 flightstick_joyst ick s [ ] = {
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 ;
return SDL_VIDPIDInList ( vendor_id , product_id , & flightstick_dev ice s ) ;
}
static SDL_bool SDL_IsJoystickProduct Throttle ( Uint32 vidp id )
static SDL_bool SDL_IsJoystickThrottle ( Uint16 vendor_id , Uint16 product_ id )
{
static Uint32 throttle_joyst ick s [ ] = {
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 ;
return SDL_VIDPIDInList ( vendor_id , product_id , & throttle_dev ice s ) ;
}
static SDL_JoystickType SDL_GetJoystickGUIDType ( SDL_JoystickGUID guid )
{
Uint16 vendor ;
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 ) ) {
/* XInput GUID, get the type based on the XInput device subtype */
@@ -2863,25 +3022,6 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
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
if ( SDL_IsJoystickHIDAPI ( guid ) ) {
return HIDAPI_GetJoystickTypeFromGUID ( guid ) ;
@@ -2897,148 +3037,18 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(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 product ;
SDL_GetJoystickGUIDInfo ( guid , & vendor , & product , NULL , NULL ) ;
/* Check the joystick blacklist */
id = MAKE _VIDPID( vendor , product ) ;
for ( i = 0 ; i < SDL_arraysize ( joystick_blacklist ) ; + + i ) {
if ( id = = joystick_blacklist [ i ] ) {
return SDL_TRUE ;
}
if ( SDL _VIDPIDInList ( vendor , product , & blacklist_devices ) ) {
return SDL_TRUE ;
}
if ( ! SDL_GetHintBoolean ( SDL_HINT_JOYSTICK_ROG_CHAKRAM , SDL_FALSE ) ) {
for ( i = 0 ; i < SDL_arraysize ( rog_chakram_list ) ; + + i ) {
if ( id = = rog_chakram_list [ i ] ) {
return SDL_TRUE ;
}
i f ( SDL_VIDPIDInList ( vendor , product , & rog_gamepad_mice ) ) {
return SDL_TRUE ;
}
}
@@ -3392,14 +3402,12 @@ int SDL_SendJoystickSensor(Uint64 timestamp, SDL_Joystick *joystick, SDL_SensorT
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 ;
char * spot ;
char * file = NULL ;
list - > num_entries = 0 ;
if ( hint & & * hint = = ' @ ' ) {
spot = file = ( char * ) SDL_LoadFile ( hint + 1 , NULL ) ;
} else {
@@ -3419,17 +3427,17 @@ void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
}
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 ) {
if ( * num_entries = = * max_entries ) {
int new_ max_entries = * max_entries + 16 ;
Uint32 * new_ entries = ( Uint32 * ) SDL_realloc ( * entries , new_ max_entries * sizeof ( * * entries ) ) ;
if ( ! new_ entries) {
/* Out of memory, go with what we have already */
break ;
}
list - > entries = entries ;
list - > max_entries = max_entries ;
* entries = new_ entries;
* max_entries = new_ max_entries;
}
list - > entries [ list - > num_entries + + ] = entry ;
( * entries ) [ ( * num_entries ) + + ] = entry ;
}
if ( file ) {
@@ -3437,13 +3445,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 )
{
int i ;
Uint32 vidpid = MAKE_VIDPID ( vendor_id , product_id ) ;
for ( i = 0 ; i < list - > num_entries ; + + i ) {
if ( vidpid = = list - > entries [ i ] ) {
for ( i = 0 ; i < list - > num_excluded_ 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 ;
}
}
@@ -3452,8 +3547,27 @@ SDL_bool SDL_VIDPIDInList(Uint16 vendor_id, Uint16 product_id, const SDL_vidpid_
void SDL_FreeVIDPIDList ( SDL_vidpid_list * list )
{
if ( list - > entries ) {
SDL_free ( list - > entries ) ;
SDL_zerop ( list ) ;
if ( list - > included_hint_name ) {
SDL_DelHintCallback ( list - > included_hint_name , SDL_VIDPIDIncludedHintChanged , 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 ;
}