SDL: Wait for input before reconnecting a Bluetooth device

From 67db8a9103030ee1a3a54053381b4074ffe0c099 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 c9c24a3817b..7aefd79483e 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 423d4e9edb9..1bd1a2669d0 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 5c542b3ffba..62e826c41e6 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) {