From 27dd2c4aa4dcb63c6fa91e384e1bc82787497234 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Thu, 2 Jun 2022 23:32:21 -0700 Subject: [PATCH] qt: unregister Settings' DevicesChanged callback during shutdown fixes a crash on close --- Source/Core/DolphinQt/MainWindow.cpp | 2 ++ Source/Core/DolphinQt/Settings.cpp | 7 ++++++- Source/Core/DolphinQt/Settings.h | 7 ++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 361a182819..d2dea76787 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -360,6 +360,8 @@ void MainWindow::ShutdownControllers() { m_hotkey_scheduler->Stop(); + Settings::Instance().UnregisterDevicesChangedCallback(); + Pad::Shutdown(); Pad::ShutdownGBA(); Keyboard::Shutdown(); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 0ecee648d8..e08e32c0ad 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -69,7 +69,7 @@ Settings::Settings() } }); - g_controller_interface.RegisterDevicesChangedCallback([this] { + m_hotplug_callback_handle = g_controller_interface.RegisterDevicesChangedCallback([this] { if (Host::GetInstance()->IsHostThread()) { emit DevicesChanged(); @@ -90,6 +90,11 @@ Settings::Settings() Settings::~Settings() = default; +void Settings::UnregisterDevicesChangedCallback() +{ + g_controller_interface.UnregisterDevicesChangedCallback(m_hotplug_callback_handle); +} + Settings& Settings::Instance() { static Settings settings; diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index 1471daddec..335cef9a76 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -12,6 +12,7 @@ #include "Core/Config/MainSettings.h" #include "DiscIO/Enums.h" +#include "InputCommon/ControllerInterface/ControllerInterface.h" namespace Core { @@ -44,6 +45,8 @@ public: ~Settings(); + void UnregisterDevicesChangedCallback(); + static Settings& Instance(); static QSettings& GetQSettings(); @@ -199,10 +202,12 @@ signals: void USBKeyboardConnectionChanged(bool connected); private: + Settings(); + bool m_batch = false; std::shared_ptr m_client; std::shared_ptr m_server; - Settings(); + ControllerInterface::HotplugCallbackHandle m_hotplug_callback_handle; }; Q_DECLARE_METATYPE(Core::State);