diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index fb652f50a3..b3aa51157b 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -1438,6 +1438,7 @@ void AchievementManager::LoadIntegrationCallback(int result, const char* error_m case RC_OK: INFO_LOG_FMT(ACHIEVEMENTS, "RAIntegration.dll found."); instance.m_dll_found = true; + rc_client_raintegration_set_event_handler(instance.m_client, RAIntegrationEventHandler); instance.m_dev_menu_callback(); // TODO: hook up menu and dll event handlers break; @@ -1456,6 +1457,31 @@ void AchievementManager::LoadIntegrationCallback(int result, const char* error_m instance.Login(""); INFO_LOG_FMT(ACHIEVEMENTS, "Achievement Manager Initialized"); } + +void AchievementManager::RAIntegrationEventHandler(const rc_client_raintegration_event_t* event, + rc_client_t* client) +{ + auto& instance = AchievementManager::GetInstance(); + switch (event->type) + { + case RC_CLIENT_RAINTEGRATION_EVENT_MENU_CHANGED: + case RC_CLIENT_RAINTEGRATION_EVENT_MENUITEM_CHECKED_CHANGED: + instance.m_dev_menu_callback(); + break; + case RC_CLIENT_RAINTEGRATION_EVENT_PAUSE: + { + Core::QueueHostJob([](Core::System& system) { Core::SetState(system, Core::State::Paused); }); + break; + } + case RC_CLIENT_RAINTEGRATION_EVENT_HARDCORE_CHANGED: + Config::SetBaseOrCurrent(Config::RA_HARDCORE_ENABLED, + !Config::Get(Config::RA_HARDCORE_ENABLED)); + break; + default: + WARN_LOG_FMT(ACHIEVEMENTS, "Unsupported raintegration event. {}", event->type); + break; + } +} #endif // RC_CLIENT_SUPPORTS_RAINTEGRATION #endif // USE_RETRO_ACHIEVEMENTS diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 4027d20841..e0a142113d 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -251,6 +251,8 @@ private: #ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION static void LoadIntegrationCallback(int result, const char* error_message, rc_client_t* client, void* userdata); + static void RAIntegrationEventHandler(const rc_client_raintegration_event_t* event, + rc_client_t* client); #endif // RC_CLIENT_SUPPORTS_RAINTEGRATION rc_runtime_t m_runtime{}; diff --git a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp index c58e3d6fae..6d3ed55ebd 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp @@ -34,10 +34,6 @@ AchievementSettingsWidget::AchievementSettingsWidget(QWidget* parent) : QWidget( connect(&Settings::Instance(), &Settings::ConfigChanged, this, &AchievementSettingsWidget::LoadSettings); - - // If hardcore is enabled when the emulator starts, make sure it turns off what it needs to - if (Config::Get(Config::RA_HARDCORE_ENABLED)) - UpdateHardcoreMode(); } void AchievementSettingsWidget::UpdateData(int login_failed_code) @@ -259,7 +255,6 @@ void AchievementSettingsWidget::ToggleRAIntegration() instance.Init(reinterpret_cast(winId())); else instance.Shutdown(); - UpdateHardcoreMode(); } void AchievementSettingsWidget::Login() @@ -297,7 +292,6 @@ void AchievementSettingsWidget::ToggleHardcore() } } SaveSettings(); - UpdateHardcoreMode(); } void AchievementSettingsWidget::ToggleUnofficial() @@ -327,14 +321,4 @@ void AchievementSettingsWidget::ToggleProgress() SaveSettings(); } -void AchievementSettingsWidget::UpdateHardcoreMode() -{ - if (Config::Get(Config::RA_HARDCORE_ENABLED)) - { - Settings::Instance().SetDebugModeEnabled(false); - } - emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance())); - emit Settings::Instance().HardcoreStateChanged(); -} - #endif // USE_RETRO_ACHIEVEMENTS diff --git a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h index 92f360cac9..20a6d03c6d 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h +++ b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h @@ -39,8 +39,6 @@ private: void ToggleDiscordPresence(); void ToggleProgress(); - void UpdateHardcoreMode(); - QGroupBox* m_common_box; QVBoxLayout* m_common_layout; ToolTipCheckBox* m_common_integration_enabled_input; diff --git a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp index 6bb7dea6c2..c9a00a01ed 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp @@ -39,8 +39,6 @@ AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent) }); connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [this] { m_settings_widget->UpdateData(RC_OK); }); - connect(&Settings::Instance(), &Settings::HardcoreStateChanged, this, - [this] { AchievementsWindow::UpdateData({.all = true}); }); } void AchievementsWindow::showEvent(QShowEvent* event) diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 71fc949b7d..dcf03e5c18 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -43,6 +43,7 @@ #include "Core/BootManager.h" #include "Core/CommonTitles.h" #include "Core/Config/AchievementSettings.h" +#include "Core/Config/FreeLookSettings.h" #include "Core/Config/MainSettings.h" #include "Core/Config/NetplaySettings.h" #include "Core/Config/UISettings.h" @@ -275,6 +276,12 @@ MainWindow::MainWindow(Core::System& system, std::unique_ptr boo AchievementManager::GetInstance().Init(reinterpret_cast(winId())); if (AchievementManager::GetInstance().IsHardcoreModeActive()) Settings::Instance().SetDebugModeEnabled(false); + // This needs to trigger on both RA_HARDCORE_ENABLED and RA_ENABLED + Config::AddConfigChangedCallback( + [this]() { QueueOnObject(this, [this] { this->OnHardcoreChanged(); }); }); + // If hardcore is enabled when the emulator starts, make sure it turns off what it needs to + if (Config::Get(Config::RA_HARDCORE_ENABLED)) + OnHardcoreChanged(); #endif // USE_RETRO_ACHIEVEMENTS #if defined(__unix__) || defined(__unix) || defined(__APPLE__) @@ -1992,6 +1999,13 @@ void MainWindow::ShowAchievementSettings() ShowAchievementsWindow(); m_achievements_window->ForceSettingsTab(); } + +void MainWindow::OnHardcoreChanged() +{ + if (Config::Get(Config::RA_HARDCORE_ENABLED)) + Settings::Instance().SetDebugModeEnabled(false); + emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance())); +} #endif // USE_RETRO_ACHIEVEMENTS void MainWindow::ShowMemcardManager() diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h index f9f0f1c95d..a43f98ead0 100644 --- a/Source/Core/DolphinQt/MainWindow.h +++ b/Source/Core/DolphinQt/MainWindow.h @@ -181,6 +181,7 @@ private: #ifdef USE_RETRO_ACHIEVEMENTS void ShowAchievementsWindow(); void ShowAchievementSettings(); + void OnHardcoreChanged(); #endif // USE_RETRO_ACHIEVEMENTS void NetPlayInit(); diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index 39337ceb5b..b6c50c9404 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -222,7 +222,6 @@ signals: void SDCardInsertionChanged(bool inserted); void USBKeyboardConnectionChanged(bool connected); void EnableGfxModsChanged(bool enabled); - void HardcoreStateChanged(); private: Settings();