Added SDL_GameControllerType enumeration for Nintendo Switch Joy-Con controllers

This commit is contained in:
Sam Lantinga 2022-08-08 08:22:20 -07:00
parent 4f19421ed8
commit 878259722f
6 changed files with 51 additions and 27 deletions

View File

@ -70,7 +70,10 @@ typedef enum
SDL_CONTROLLER_TYPE_PS5, SDL_CONTROLLER_TYPE_PS5,
SDL_CONTROLLER_TYPE_AMAZON_LUNA, SDL_CONTROLLER_TYPE_AMAZON_LUNA,
SDL_CONTROLLER_TYPE_GOOGLE_STADIA, SDL_CONTROLLER_TYPE_GOOGLE_STADIA,
SDL_CONTROLLER_TYPE_NVIDIA_SHIELD SDL_CONTROLLER_TYPE_NVIDIA_SHIELD,
SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT,
SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT,
SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR
} SDL_GameControllerType; } SDL_GameControllerType;
typedef enum typedef enum

View File

@ -1833,11 +1833,6 @@ SDL_CreateJoystickName(Uint16 vendor, Uint16 product, const char *vendor_name, c
char *name; char *name;
size_t i, len; size_t i, len;
/* Use the given name for the Nintendo Online NES Controllers */
if (product_name && SDL_strncmp(product_name, "NES Controller", 14) == 0) {
return SDL_strdup(product_name);
}
custom_name = GuessControllerName(vendor, product); custom_name = GuessControllerName(vendor, product);
if (custom_name) { if (custom_name) {
return SDL_strdup(custom_name); return SDL_strdup(custom_name);
@ -1977,6 +1972,20 @@ SDL_GetJoystickGameControllerTypeFromVIDPID(Uint16 vendor, Uint16 product, const
} else if (vendor == USB_VENDOR_GOOGLE && product == USB_PRODUCT_GOOGLE_STADIA_CONTROLLER) { } else if (vendor == USB_VENDOR_GOOGLE && product == USB_PRODUCT_GOOGLE_STADIA_CONTROLLER) {
type = SDL_CONTROLLER_TYPE_GOOGLE_STADIA; type = SDL_CONTROLLER_TYPE_GOOGLE_STADIA;
} else if (vendor == USB_VENDOR_NINTENDO && product == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT) {
type = SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT;
} else if (vendor == USB_VENDOR_NINTENDO && product == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) {
if (name && SDL_strstr(name, "NES Controller") != NULL) {
/* We don't have a type for the Nintendo Online NES Controller */
type = SDL_CONTROLLER_TYPE_UNKNOWN;
} else {
type = SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT;
}
} else if (vendor == USB_VENDOR_NINTENDO && product == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_PAIR) {
type = SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR;
} else if (vendor == USB_VENDOR_NVIDIA && product == USB_PRODUCT_NVIDIA_SHIELD_CONTROLLER) { } else if (vendor == USB_VENDOR_NVIDIA && product == USB_PRODUCT_NVIDIA_SHIELD_CONTROLLER) {
type = SDL_CONTROLLER_TYPE_NVIDIA_SHIELD; type = SDL_CONTROLLER_TYPE_NVIDIA_SHIELD;
@ -2165,13 +2174,13 @@ SDL_IsJoystickNintendoSwitchJoyConRight(Uint16 vendor_id, Uint16 product_id)
SDL_bool SDL_bool
SDL_IsJoystickNintendoSwitchJoyConGrip(Uint16 vendor_id, Uint16 product_id) SDL_IsJoystickNintendoSwitchJoyConGrip(Uint16 vendor_id, Uint16 product_id)
{ {
return (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP); return (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP);
} }
SDL_bool SDL_bool
SDL_IsJoystickNintendoSwitchJoyConPair(Uint16 vendor_id, Uint16 product_id) SDL_IsJoystickNintendoSwitchJoyConPair(Uint16 vendor_id, Uint16 product_id)
{ {
return (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_PAIR); return (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_PAIR);
} }
SDL_bool SDL_bool

View File

@ -363,7 +363,7 @@ static SDL_bool
HIDAPI_DriverNintendoClassic_IsSupportedDevice(const char *name, SDL_GameControllerType type, Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, int interface_class, int interface_subclass, int interface_protocol) HIDAPI_DriverNintendoClassic_IsSupportedDevice(const char *name, SDL_GameControllerType type, Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, int interface_class, int interface_subclass, int interface_protocol)
{ {
if (vendor_id == USB_VENDOR_NINTENDO) { if (vendor_id == USB_VENDOR_NINTENDO) {
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_RIGHT) { if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) {
if (SDL_strncmp(name, "NES Controller", 14) == 0) { if (SDL_strncmp(name, "NES Controller", 14) == 0) {
return SDL_TRUE; return SDL_TRUE;
} }
@ -389,9 +389,9 @@ static SDL_bool
HIDAPI_DriverJoyCons_IsSupportedDevice(const char *name, SDL_GameControllerType type, Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, int interface_class, int interface_subclass, int interface_protocol) HIDAPI_DriverJoyCons_IsSupportedDevice(const char *name, SDL_GameControllerType type, Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, int interface_class, int interface_subclass, int interface_protocol)
{ {
if (vendor_id == USB_VENDOR_NINTENDO) { if (vendor_id == USB_VENDOR_NINTENDO) {
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_LEFT || if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT ||
product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_RIGHT || product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT ||
product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) { product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) {
return SDL_TRUE; return SDL_TRUE;
} }
} }
@ -425,18 +425,25 @@ HIDAPI_DriverSwitch_GetDeviceName(const char *name, Uint16 vendor_id, Uint16 pro
{ {
/* Give a user friendly name for this controller */ /* Give a user friendly name for this controller */
if (vendor_id == USB_VENDOR_NINTENDO) { if (vendor_id == USB_VENDOR_NINTENDO) {
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) { if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) {
return "Nintendo Switch Joy-Con Grip"; /* We don't know if this is left or right, just leave it alone */
return NULL;
} }
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_LEFT) { if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT) {
return "Nintendo Switch Joy-Con (L)"; return "Nintendo Switch Joy-Con (L)";
} }
if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_RIGHT) { if (product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT) {
/* Use the given name for the Nintendo Online NES Controllers */
if (SDL_strncmp(name, "NES Controller", 14) == 0) { if (SDL_strncmp(name, "NES Controller", 14) == 0) {
return name; if (SDL_strstr(name, "(L)") != 0) {
return "Nintendo NES Controller (L)";
} else if (SDL_strstr(name, "(R)") != 0) {
return "Nintendo NES Controller (R)";
} else {
/* Not sure what this is, just leave it alone */
return NULL;
}
} }
return "Nintendo Switch Joy-Con (R)"; return "Nintendo Switch Joy-Con (R)";
} }
@ -1062,7 +1069,7 @@ static int
GetMaxWriteAttempts(SDL_HIDAPI_Device *device) GetMaxWriteAttempts(SDL_HIDAPI_Device *device)
{ {
if (device->vendor_id == USB_VENDOR_NINTENDO && if (device->vendor_id == USB_VENDOR_NINTENDO &&
device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) { device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) {
/* This device is a little slow and we know we're always on USB */ /* This device is a little slow and we know we're always on USB */
return 20; return 20;
} else { } else {
@ -1159,7 +1166,7 @@ HIDAPI_DriverSwitch_InitDevice(SDL_HIDAPI_Device *device)
switch (eControllerType) { switch (eControllerType) {
case k_eSwitchDeviceInfoControllerType_Unknown: case k_eSwitchDeviceInfoControllerType_Unknown:
/* This might be a Joy-Con that's missing from a charging grip slot */ /* This might be a Joy-Con that's missing from a charging grip slot */
if (device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) { if (device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) {
if (device->interface_number == 1) { if (device->interface_number == 1) {
SDL_free(device->name); SDL_free(device->name);
device->name = SDL_strdup("Nintendo Switch Joy-Con (L)"); device->name = SDL_strdup("Nintendo Switch Joy-Con (L)");
@ -2006,7 +2013,7 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
} }
if (!ctx->m_bInputOnly && !ctx->m_bUsingBluetooth && if (!ctx->m_bInputOnly && !ctx->m_bUsingBluetooth &&
ctx->device->product_id != USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) { ctx->device->product_id != USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) {
const Uint32 INPUT_WAIT_TIMEOUT_MS = 100; const Uint32 INPUT_WAIT_TIMEOUT_MS = 100;
if (SDL_TICKS_PASSED(now, ctx->m_unLastInput + INPUT_WAIT_TIMEOUT_MS)) { if (SDL_TICKS_PASSED(now, ctx->m_unLastInput + INPUT_WAIT_TIMEOUT_MS)) {
/* Steam may have put the controller back into non-reporting mode */ /* Steam may have put the controller back into non-reporting mode */

View File

@ -312,7 +312,7 @@ HIDAPI_SetupDeviceDriver(SDL_HIDAPI_Device *device)
if (device->driver) { if (device->driver) {
SDL_bool enabled; SDL_bool enabled;
if (device->vendor_id == USB_VENDOR_NINTENDO && device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_PAIR) { if (device->vendor_id == USB_VENDOR_NINTENDO && device->product_id == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_PAIR) {
enabled = SDL_HIDAPI_combine_joycons; enabled = SDL_HIDAPI_combine_joycons;
} else { } else {
enabled = device->driver->enabled; enabled = device->driver->enabled;
@ -770,7 +770,7 @@ HIDAPI_CreateCombinedJoyCons()
SDL_zero(info); SDL_zero(info);
info.path = "nintendo_joycons_combined"; info.path = "nintendo_joycons_combined";
info.vendor_id = USB_VENDOR_NINTENDO; info.vendor_id = USB_VENDOR_NINTENDO;
info.product_id = USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_PAIR; info.product_id = USB_PRODUCT_NINTENDO_SWITCH_JOYCON_PAIR;
info.interface_number = -1; info.interface_number = -1;
info.usage_page = USB_USAGEPAGE_GENERIC_DESKTOP; info.usage_page = USB_USAGEPAGE_GENERIC_DESKTOP;
info.usage = USB_USAGE_GENERIC_GAMEPAD; info.usage = USB_USAGE_GENERIC_GAMEPAD;

View File

@ -48,10 +48,10 @@
#define USB_PRODUCT_NINTENDO_N64_CONTROLLER 0x2019 #define USB_PRODUCT_NINTENDO_N64_CONTROLLER 0x2019
#define USB_PRODUCT_NINTENDO_SEGA_GENESIS_CONTROLLER 0x201e #define USB_PRODUCT_NINTENDO_SEGA_GENESIS_CONTROLLER 0x201e
#define USB_PRODUCT_NINTENDO_SNES_CONTROLLER 0x2017 #define USB_PRODUCT_NINTENDO_SNES_CONTROLLER 0x2017
#define USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP 0x200e #define USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP 0x200e
#define USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_LEFT 0x2006 #define USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT 0x2006
#define USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_PAIR 0x2008 /* Used by joycond */ #define USB_PRODUCT_NINTENDO_SWITCH_JOYCON_PAIR 0x2008 /* Used by joycond */
#define USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_RIGHT 0x2007 #define USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT 0x2007
#define USB_PRODUCT_NINTENDO_SWITCH_PRO 0x2009 #define USB_PRODUCT_NINTENDO_SWITCH_PRO 0x2009
#define USB_PRODUCT_NVIDIA_SHIELD_CONTROLLER 0x7214 #define USB_PRODUCT_NVIDIA_SHIELD_CONTROLLER 0x7214
#define USB_PRODUCT_RAZER_PANTHERA 0x0401 #define USB_PRODUCT_RAZER_PANTHERA 0x0401

View File

@ -814,6 +814,11 @@ main(int argc, char *argv[])
case SDL_CONTROLLER_TYPE_GOOGLE_STADIA: case SDL_CONTROLLER_TYPE_GOOGLE_STADIA:
description = "Google Stadia Controller"; description = "Google Stadia Controller";
break; break;
case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT:
case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT:
case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR:
description = "Nintendo Switch Joy-Con";
break;
case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO: case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO:
description = "Nintendo Switch Pro Controller"; description = "Nintendo Switch Pro Controller";
break; break;