From 1c326c933053c29da0abbecfbe3a7f01421f3bdf Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 6 Sep 2024 23:08:08 +0200 Subject: [PATCH] Trigger connected gamepads on start Trigger SDL_CONTROLLERDEVICEADDED for all gamepads already connected when scrcpy starts. We want to handle both the gamepads initially connected and the gamepads connected while scrcpy is running. It is a bit racy, because a device may be added after the controller subsystem initialization, but before the call to list the joysticks. In that case, a single device may in theory be detected as added twice. This should be harmless though (the second initialization will just fail without major impact). --- app/src/scrcpy.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index ef45c85b..f09bf121 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -322,6 +322,21 @@ scrcpy_generate_scid(void) { return sc_rand_u32(&rand) & 0x7FFFFFFF; } +static void +init_sdl_gamepads(void) { + // Trigger a SDL_CONTROLLERDEVICEADDED event for all gamepads already + // connected + int num_joysticks = SDL_NumJoysticks(); + for (int i = 0; i < num_joysticks; ++i) { + if (SDL_IsGameController(i)) { + SDL_Event event; + event.cdevice.type = SDL_CONTROLLERDEVICEADDED; + event.cdevice.which = i; + SDL_PushEvent(&event); + } + } +} + enum scrcpy_exit_code scrcpy(struct scrcpy_options *options) { static struct scrcpy scrcpy; @@ -836,6 +851,11 @@ aoa_complete: timeout_started = true; } + bool use_gamepads = true; + if (use_gamepads) { + init_sdl_gamepads(); + } + ret = event_loop(s); LOGD("quit...");