From 5935fe73d3c4d8ca8a973d3fbd8c5ea7ee0d2a92 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 3 Feb 2026 10:41:23 -0800
Subject: [PATCH] Fixed detecting Nintendo Switch Pro 2 controller on Steam
Link hardware
In this case, it's available via both libusb and hidraw, but the hidraw device isn't usable. If a device needs to be opened via libusb, don't expose it via hidraw enumeration.
(cherry picked from commit f60231759da865f3d45385c58d0d67974a356559)
---
src/hidapi/SDL_hidapi.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c
index 1151b068989e8..e71201c1d5f1a 100644
--- a/src/hidapi/SDL_hidapi.c
+++ b/src/hidapi/SDL_hidapi.c
@@ -834,6 +834,8 @@ typedef struct LIBUSB_hid_device_ LIBUSB_hid_device;
#undef read_thread
#undef return_data
+#endif // HAVE_LIBUSB
+
/* If the platform has any backend other than libusb, try to avoid using
* libusb as the main backend for devices, since it detaches drivers and
* therefore makes devices inaccessible to the rest of the OS.
@@ -845,7 +847,7 @@ typedef struct LIBUSB_hid_device_ LIBUSB_hid_device;
static const struct {
Uint16 vendor;
Uint16 product;
-} SDL_libusb_whitelist[] = {
+} SDL_libusb_required[] = {
{ USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_GAMECUBE_ADAPTER },
{ USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_SWITCH2_GAMECUBE_CONTROLLER },
{ USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_SWITCH2_JOYCON_LEFT },
@@ -853,20 +855,17 @@ static const struct {
{ USB_VENDOR_NINTENDO, USB_PRODUCT_NINTENDO_SWITCH2_PRO },
};
-static bool IsInWhitelist(Uint16 vendor, Uint16 product)
+static bool RequiresLibUSB(Uint16 vendor, Uint16 product)
{
- int i;
- for (i = 0; i < SDL_arraysize(SDL_libusb_whitelist); i += 1) {
- if (vendor == SDL_libusb_whitelist[i].vendor &&
- product == SDL_libusb_whitelist[i].product) {
+ for (int i = 0; i < SDL_arraysize(SDL_libusb_required); ++i) {
+ if (vendor == SDL_libusb_required[i].vendor &&
+ product == SDL_libusb_required[i].product) {
return true;
}
}
return false;
}
-#endif // HAVE_LIBUSB
-
#endif // !SDL_HIDAPI_DISABLED
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND)
@@ -1055,17 +1054,19 @@ static void SDLCALL IgnoredDevicesChanged(void *userdata, const char *name, cons
bool SDL_HIDAPI_ShouldIgnoreDevice(int bus, Uint16 vendor_id, Uint16 product_id, Uint16 usage_page, Uint16 usage, bool libusb)
{
-#ifdef HAVE_LIBUSB
if (libusb) {
- if (use_libusb_whitelist && !IsInWhitelist(vendor_id, product_id)) {
+ if (use_libusb_whitelist && !RequiresLibUSB(vendor_id, product_id)) {
return true;
}
if (!use_libusb_gamecube &&
vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_GAMECUBE_ADAPTER) {
return true;
}
+ } else {
+ if (RequiresLibUSB(vendor_id, product_id)) {
+ return true;
+ }
}
-#endif
// See if there are any devices we should skip in enumeration
if (SDL_hidapi_only_controllers && usage_page) {