From 2b10a040ff9b1dd62ed8027427608ce516d47c0c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 16 Nov 2024 13:10:02 -0800 Subject: [PATCH] Fixed rare case of wireless Steam Controller not being detected at startup --- src/joystick/hidapi/SDL_hidapi_steam.c | 51 +++++++++++++++++--------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src/joystick/hidapi/SDL_hidapi_steam.c b/src/joystick/hidapi/SDL_hidapi_steam.c index 796c709b3a..ad41b93003 100644 --- a/src/joystick/hidapi/SDL_hidapi_steam.c +++ b/src/joystick/hidapi/SDL_hidapi_steam.c @@ -1214,6 +1214,31 @@ static bool HIDAPI_DriverSteam_SetSensorsEnabled(SDL_HIDAPI_Device *device, SDL_ return true; } +static bool ControllerConnected(SDL_HIDAPI_Device *device, SDL_Joystick **joystick) +{ + SDL_DriverSteam_Context *ctx = (SDL_DriverSteam_Context *)device->context; + + if (!HIDAPI_JoystickConnected(device, NULL)) { + return false; + } + + // We'll automatically accept this controller if we're in pairing mode + HIDAPI_DriverSteam_CommitPairing(ctx); + + *joystick = SDL_GetJoystickFromID(device->joysticks[0]); + ctx->connected = true; + return true; +} + +static void ControllerDisconnected(SDL_HIDAPI_Device *device, SDL_Joystick **joystick) +{ + SDL_DriverSteam_Context *ctx = (SDL_DriverSteam_Context *)device->context; + + HIDAPI_JoystickDisconnected(device, device->joysticks[0]); + ctx->connected = false; + *joystick = NULL; +} + static bool HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) { SDL_DriverSteam_Context *ctx = (SDL_DriverSteam_Context *)device->context; @@ -1232,10 +1257,7 @@ static bool HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) if (r <= 0) { if (r < 0) { // Failed to read from controller - if (ctx->connected) { - HIDAPI_JoystickDisconnected(device, device->joysticks[0]); - ctx->connected = false; - } + ControllerDisconnected(device, &joystick); return false; } break; @@ -1251,6 +1273,11 @@ static bool HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) if (nPacketLength > 0 && UpdateSteamControllerState(pPacket, nPacketLength, &ctx->m_state)) { Uint64 timestamp = SDL_GetTicksNS(); + if (!ctx->connected) { + // Maybe we missed a wireless status packet? + ControllerConnected(device, &joystick); + } + if (!joystick) { continue; } @@ -1336,21 +1363,9 @@ static bool HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) ctx->m_last_state = ctx->m_state; } else if (!ctx->connected && D0G_IS_WIRELESS_CONNECT(pPacket, nPacketLength)) { - // Controller has connected to the wireless dongle - if (!HIDAPI_JoystickConnected(device, NULL)) { - return false; - } - - // We'll automatically accept this controller if we're in pairing mode - HIDAPI_DriverSteam_CommitPairing(ctx); - - joystick = SDL_GetJoystickFromID(device->joysticks[0]); - ctx->connected = true; + ControllerConnected(device, &joystick); } else if (ctx->connected && D0G_IS_WIRELESS_DISCONNECT(pPacket, nPacketLength)) { - // Controller has disconnected from the wireless dongle - HIDAPI_JoystickDisconnected(device, device->joysticks[0]); - joystick = NULL; - ctx->connected = false; + ControllerDisconnected(device, &joystick); } } return true;