From 5936ee00dd19bc669a11b22f66838b4238f7de80 Mon Sep 17 00:00:00 2001 From: Nintorch <92302738+Nintorch@users.noreply.github.com> Date: Thu, 21 May 2026 23:17:16 +0500 Subject: [PATCH] [skip ci] Fix joycon handling --- src/hidapi/emscripten/hid.c | 28 +++++++++++++---------- src/joystick/emscripten/SDL_sysjoystick.c | 12 +++++++++- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/hidapi/emscripten/hid.c b/src/hidapi/emscripten/hid.c index b66d672517..a97815edf2 100644 --- a/src/hidapi/emscripten/hid.c +++ b/src/hidapi/emscripten/hid.c @@ -285,18 +285,22 @@ static void set_report(hid_device *dev, unsigned char *data, size_t length) EM_ASYNC_JS(void, hid_js_open, (int device_id, hid_device *dev, SetByteCallback callback, SetReportCallback set_report_callback), { let device = window._hidDeviceList[device_id]; if (device) { - await device.open(); - device.addEventListener("inputreport", function (event) { - const { data, device, reportId } = event; - - let dataLength = data['byteLength']+1; - let pointer = _malloc(dataLength); - dynCall("viiii", callback, [pointer, dataLength, reportId, 0]); - for (let i = 0; i < data['byteLength']; i++) { - dynCall("viiii", callback, [pointer, dataLength, data['getUint8'](i), i+1]); - } - dynCall("viii", set_report_callback, [dev, pointer, dataLength]); - }); + try { + await device.open(); + device.addEventListener("inputreport", function (event) { + const { data, device, reportId } = event; + + let dataLength = data['byteLength']+1; + let pointer = _malloc(dataLength); + dynCall("viiii", callback, [pointer, dataLength, reportId, 0]); + for (let i = 0; i < data['byteLength']; i++) { + dynCall("viiii", callback, [pointer, dataLength, data['getUint8'](i), i+1]); + } + dynCall("viii", set_report_callback, [dev, pointer, dataLength]); + }); + } catch (e) { + // Pass? + } } }); diff --git a/src/joystick/emscripten/SDL_sysjoystick.c b/src/joystick/emscripten/SDL_sysjoystick.c index 3707386222..1d8e894ee4 100644 --- a/src/joystick/emscripten/SDL_sysjoystick.c +++ b/src/joystick/emscripten/SDL_sysjoystick.c @@ -139,6 +139,11 @@ static void SDL_WebHID_DisconnectEmscriptenGamepad(int device_index) static void SDL_RequestWebHIDDevice(Uint16 vendor, Uint16 product, int device_index) { + Uint16 product2 = 0; + if (vendor == USB_VENDOR_NINTENDO && product == USB_PRODUCT_NINTENDO_SWITCH_JOYCON_GRIP) { + product = USB_PRODUCT_NINTENDO_SWITCH_JOYCON_LEFT; + product2 = USB_PRODUCT_NINTENDO_SWITCH_JOYCON_RIGHT; + } MAIN_THREAD_EM_ASM({ function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); @@ -149,6 +154,11 @@ static void SDL_RequestWebHIDDevice(Uint16 vendor, Uint16 product, int device_in while (true) { try { let devices = await navigator["hid"]["requestDevice"]({ "filters": [ { "vendorId": $0, "productId": $1, } ]}); + let device_length = devices["length"]; + if ($4) { // product2 + devices = await navigator["hid"]["requestDevice"]({ "filters": [ { "vendorId": $0, "productId": $4, } ]}); + device_length += devices["length"]; + } if (devices["length"]) { dynCall("vi", $2, [$3]); } @@ -162,7 +172,7 @@ static void SDL_RequestWebHIDDevice(Uint16 vendor, Uint16 product, int device_in } handler(); } - }, vendor, product, SDL_WebHID_DisconnectEmscriptenGamepad, device_index); + }, vendor, product, SDL_WebHID_DisconnectEmscriptenGamepad, device_index, product2); } #endif