[skip ci] Fix joycon handling

This commit is contained in:
Nintorch 2026-05-21 23:17:16 +05:00
parent b0823349bb
commit 5936ee00dd
2 changed files with 27 additions and 13 deletions

View file

@ -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?
}
}
});

View file

@ -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