From 67db8a9103030ee1a3a54053381b4074ffe0c099 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 26 Sep 2022 20:41:51 -0700 Subject: [PATCH] Wait for input before reconnecting a Bluetooth device On Windows, the Bluetooth device can remain in a connected state if the controller just shut down. It won't return any errors, but it also won't generate any input reports in this state, so wait until we know for sure that the Bluetooth controller is sending data before letting the application know it's available. --- src/joystick/hidapi/SDL_hidapi_ps4.c | 4 +++- src/joystick/hidapi/SDL_hidapi_ps5.c | 4 +++- src/joystick/hidapi/SDL_hidapi_switch.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c index c9c24a381..7aefd7948 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -961,7 +961,9 @@ HIDAPI_DriverPS4_UpdateDevice(SDL_HIDAPI_Device *device) if (device->num_joysticks == 0 && device->is_bluetooth && !HIDAPI_HasConnectedUSBDevice(device->serial)) { - HIDAPI_JoystickConnected(device, NULL); + if (SDL_hid_read_timeout(device->dev, data, sizeof(data), 0) > 0) { + HIDAPI_JoystickConnected(device, NULL); + } } if (device->num_joysticks > 0) { diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c index 423d4e9ed..1bd1a2669 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps5.c +++ b/src/joystick/hidapi/SDL_hidapi_ps5.c @@ -1269,7 +1269,9 @@ HIDAPI_DriverPS5_UpdateDevice(SDL_HIDAPI_Device *device) if (device->num_joysticks == 0 && device->is_bluetooth && !HIDAPI_HasConnectedUSBDevice(device->serial)) { - HIDAPI_JoystickConnected(device, NULL); + if (SDL_hid_read_timeout(device->dev, data, sizeof(data), 0) > 0) { + HIDAPI_JoystickConnected(device, NULL); + } } if (device->num_joysticks > 0) { diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index 5c542b3ff..62e826c41 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -2089,7 +2089,9 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device) if (device->num_joysticks == 0 && device->is_bluetooth && !HIDAPI_HasConnectedUSBDevice(device->serial)) { - HIDAPI_JoystickConnected(device, NULL); + if (ReadInput(ctx) > 0) { + HIDAPI_JoystickConnected(device, NULL); + } } if (device->num_joysticks > 0) {