diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index ba1dcd171e..0684ab17bb 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp @@ -631,14 +631,11 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback lock.unlock(); + // Reconnect controller if input is detected if (!is_connected) { - if (npad_id_type == NpadIdType::Player1 && npad_type != NpadStyleIndex::Handheld) { - Connect(); - } - if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) { - Connect(); - } + TryReconnectController(index); } + TriggerOnChange(ControllerTriggerType::Button, true); } @@ -990,6 +987,33 @@ bool EmulatedController::IsControllerSupported(bool use_temporary_value) const { return false; } } +void EmulatedController::TryReconnectController(std::size_t button_index) { + if (button_index >= button_params.size()) { + return; + } + + const auto engine = button_params[button_index].Get("engine", ""); + bool reconnect_controller = false; + + // TAS is not allowed to turn on controllers + if (engine == "tas") { + return; + } + // Only connect the controller if button config is custom + if (engine != "keyboard") { + reconnect_controller = true; + } + if (npad_id_type == NpadIdType::Player1 && npad_type != NpadStyleIndex::Handheld) { + reconnect_controller = true; + } + if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) { + reconnect_controller = true; + } + + if (reconnect_controller) { + Connect(); + } +} void EmulatedController::Connect(bool use_temporary_value) { if (!IsControllerSupported(use_temporary_value)) { diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h index 3f02ed3c07..dd7d0386c1 100644 --- a/src/core/hid/emulated_controller.h +++ b/src/core/hid/emulated_controller.h @@ -166,6 +166,12 @@ public: */ void SetSupportedNpadStyleTag(NpadStyleTag supported_styles); + /** + * Tries to turn on the controller if a button is pressed + * @param button_index index to verify if controller should be connected + */ + void TryReconnectController(std::size_t button_index); + /** * Sets the connected status to true * @param use_temporary_value If true tmp_npad_type will be used