From 7b2b6d7a32bb4936841f6257b3540c9da235348b Mon Sep 17 00:00:00 2001 From: dreamsyntax Date: Sun, 3 Nov 2024 23:26:25 -0700 Subject: [PATCH 1/2] DolphinQt: DualSense Player LED toggle --- Source/Core/Core/Config/MainSettings.cpp | 1 + Source/Core/Core/Config/MainSettings.h | 1 + .../DolphinQt/Config/CommonControllersWidget.cpp | 8 ++++++++ .../DolphinQt/Config/CommonControllersWidget.h | 1 + .../InputCommon/ControllerInterface/SDL/SDL.cpp | 14 ++++++++++++-- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 7f4e9989b7..f773b8df50 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -487,6 +487,7 @@ const Info MAIN_MOVIE_SHOW_RERECORD{{System::Main, "Movie", "ShowRerecord" // Main.Input const Info MAIN_INPUT_BACKGROUND_INPUT{{System::Main, "Input", "BackgroundInput"}, false}; +const Info MAIN_INPUT_SDL_PS5_PLAYER_LED{{System::Main, "Input", "SDLPS5PlayerLED"}, false}; // Main.Debug diff --git a/Source/Core/Core/Config/MainSettings.h b/Source/Core/Core/Config/MainSettings.h index b6e8f966c7..238735a5ec 100644 --- a/Source/Core/Core/Config/MainSettings.h +++ b/Source/Core/Core/Config/MainSettings.h @@ -320,6 +320,7 @@ extern const Info MAIN_MOVIE_SHOW_RERECORD; // Main.Input extern const Info MAIN_INPUT_BACKGROUND_INPUT; +extern const Info MAIN_INPUT_SDL_PS5_PLAYER_LED; // Main.Debug diff --git a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp index 9535895a73..30eb3c5d94 100644 --- a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp @@ -33,10 +33,12 @@ void CommonControllersWidget::CreateLayout() m_common_box = new QGroupBox(tr("Common")); m_common_layout = new QVBoxLayout(); m_common_bg_input = new QCheckBox(tr("Background Input")); + m_common_sdl_ps5_player_led = new QCheckBox(tr("Enable DualSense Player LED")); m_common_configure_controller_interface = new NonDefaultQPushButton(tr("Alternate Input Sources")); m_common_layout->addWidget(m_common_bg_input); + m_common_layout->addWidget(m_common_sdl_ps5_player_led); m_common_layout->addWidget(m_common_configure_controller_interface); m_common_box->setLayout(m_common_layout); @@ -51,6 +53,8 @@ void CommonControllersWidget::CreateLayout() void CommonControllersWidget::ConnectWidgets() { connect(m_common_bg_input, &QCheckBox::toggled, this, &CommonControllersWidget::SaveSettings); + connect(m_common_sdl_ps5_player_led, &QCheckBox::toggled, this, + &CommonControllersWidget::SaveSettings); connect(m_common_configure_controller_interface, &QPushButton::clicked, this, &CommonControllersWidget::OnControllerInterfaceConfigure); } @@ -67,10 +71,14 @@ void CommonControllersWidget::OnControllerInterfaceConfigure() void CommonControllersWidget::LoadSettings() { SignalBlocking(m_common_bg_input)->setChecked(Config::Get(Config::MAIN_INPUT_BACKGROUND_INPUT)); + SignalBlocking(m_common_sdl_ps5_player_led) + ->setChecked(Config::Get(Config::MAIN_INPUT_SDL_PS5_PLAYER_LED)); } void CommonControllersWidget::SaveSettings() { Config::SetBaseOrCurrent(Config::MAIN_INPUT_BACKGROUND_INPUT, m_common_bg_input->isChecked()); + Config::SetBaseOrCurrent(Config::MAIN_INPUT_SDL_PS5_PLAYER_LED, + m_common_sdl_ps5_player_led->isChecked()); Config::Save(); } diff --git a/Source/Core/DolphinQt/Config/CommonControllersWidget.h b/Source/Core/DolphinQt/Config/CommonControllersWidget.h index 90129bbf69..49a7277d24 100644 --- a/Source/Core/DolphinQt/Config/CommonControllersWidget.h +++ b/Source/Core/DolphinQt/Config/CommonControllersWidget.h @@ -30,5 +30,6 @@ private: QGroupBox* m_common_box; QVBoxLayout* m_common_layout; QCheckBox* m_common_bg_input; + QCheckBox* m_common_sdl_ps5_player_led; QPushButton* m_common_configure_controller_interface; }; diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp index 324619c927..4a5867ac6d 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp @@ -14,6 +14,7 @@ #include "Common/Logging/Log.h" #include "Common/MathUtil.h" #include "Common/ScopeGuard.h" +#include "Core/Config/MainSettings.h" #include "InputCommon/ControllerInterface/ControllerInterface.h" #ifdef _WIN32 @@ -287,6 +288,7 @@ public: private: void OpenAndAddDevice(int index); + void SetPS5PlayerLED(); bool HandleEventAndContinue(const SDL_Event& e); @@ -294,6 +296,7 @@ private: Uint32 m_stop_event_type; Uint32 m_populate_event_type; std::thread m_hotplug_thread; + Config::ConfigChangedCallbackID m_config_changed_callback_id; }; std::unique_ptr CreateInputBackend(ControllerInterface* controller_interface) @@ -435,8 +438,8 @@ InputBackend::InputBackend(ControllerInterface* controller_interface) // We want buttons to come in as positions, not labels SDL_SetHint(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, "0"); - // Disable DualSense Player LEDs; We already colorize the Primary LED - SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, "0"); + m_config_changed_callback_id = Config::AddConfigChangedCallback([this] { SetPS5PlayerLED(); }); + SetPS5PlayerLED(); m_hotplug_thread = std::thread([this] { Common::ScopeGuard quit_guard([] { @@ -513,6 +516,7 @@ InputBackend::~InputBackend() if (!m_hotplug_thread.joinable()) return; + Config::RemoveConfigChangedCallback(m_config_changed_callback_id); SDL_Event stop_event{m_stop_event_type}; SDL_PushEvent(&stop_event); @@ -528,6 +532,12 @@ void InputBackend::PopulateDevices() SDL_PushEvent(&populate_event); } +void InputBackend::SetPS5PlayerLED() +{ + SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, + Config::Get(Config::MAIN_INPUT_SDL_PS5_PLAYER_LED) ? "1" : "0"); +} + struct SDLMotionAxis { std::string_view name; From 3ec5454b10274c5476f0dd269592db45d3d3436f Mon Sep 17 00:00:00 2001 From: dreamsyntax Date: Mon, 4 Nov 2024 00:32:50 -0700 Subject: [PATCH 2/2] address comment (move callback deregister to quit guard) --- .../Core/InputCommon/ControllerInterface/SDL/SDL.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp index 4a5867ac6d..455158d58a 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp @@ -296,7 +296,6 @@ private: Uint32 m_stop_event_type; Uint32 m_populate_event_type; std::thread m_hotplug_thread; - Config::ConfigChangedCallbackID m_config_changed_callback_id; }; std::unique_ptr CreateInputBackend(ControllerInterface* controller_interface) @@ -438,11 +437,13 @@ InputBackend::InputBackend(ControllerInterface* controller_interface) // We want buttons to come in as positions, not labels SDL_SetHint(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, "0"); - m_config_changed_callback_id = Config::AddConfigChangedCallback([this] { SetPS5PlayerLED(); }); + const Config::ConfigChangedCallbackID config_changed_callback_id = + Config::AddConfigChangedCallback([this] { SetPS5PlayerLED(); }); SetPS5PlayerLED(); - m_hotplug_thread = std::thread([this] { - Common::ScopeGuard quit_guard([] { + m_hotplug_thread = std::thread([this, config_changed_callback_id] { + Common::ScopeGuard quit_guard([config_changed_callback_id] { + Config::RemoveConfigChangedCallback(config_changed_callback_id); // TODO: there seems to be some sort of memory leak with SDL, quit isn't freeing everything up SDL_Quit(); }); @@ -516,7 +517,6 @@ InputBackend::~InputBackend() if (!m_hotplug_thread.joinable()) return; - Config::RemoveConfigChangedCallback(m_config_changed_callback_id); SDL_Event stop_event{m_stop_event_type}; SDL_PushEvent(&stop_event);