From ebc547030dffadb9da09ff23c9c115802a897ea4 Mon Sep 17 00:00:00 2001 From: Michael M Date: Sun, 19 Nov 2017 17:15:50 -0800 Subject: [PATCH] BootManager: RestoreSYSCONF without resetting all other config This was causing an issue where DolphinQt couldn't save graphics options (DolphinWX doesn't hit this code path), because this function was being called before the in-memory config was flushed to disk. With this PR, the in-memory config isn't reset, and only SYSCONF-related variables may get changed. --- Source/Core/Core/BootManager.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index e7d2cc91eb..965c182afb 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -397,28 +397,31 @@ void Stop() // SYSCONF can be modified during emulation by the user and internally, which makes it // a bad idea to just always overwrite it with the settings from the base layer. // -// Conversely, we also shouldn't just ignore any changes to SYSCONF, as it may cause +// Conversely, we also shouldn't just accept any changes to SYSCONF, as it may cause // temporary settings (from Movie, Netplay, game INIs, etc.) to stick around. // -// To avoid inconveniences in most cases, we always restore only the overridden settings. +// To avoid inconveniences in most cases, we accept changes that aren't being overriden by a +// non-base layer, and restore only the overriden settings. static void RestoreSYSCONF() { // This layer contains the new SYSCONF settings (including any temporary settings). - auto layer = std::make_unique(ConfigLoaders::GenerateBaseConfigLoader()); + Config::Layer temp_layer(Config::LayerType::Base); + // Use a separate loader so the temp layer doesn't automatically save + ConfigLoaders::GenerateBaseConfigLoader()->Load(&temp_layer); + for (const auto& setting : Config::SYSCONF_SETTINGS) { std::visit( [&](auto& info) { // If this setting was overridden, then we copy the base layer value back to the SYSCONF. // Otherwise we leave the new value in the SYSCONF. - if (Config::GetActiveLayerForConfig(info) != Config::LayerType::Base) - layer->Set(info, Config::GetBase(info)); + if (Config::GetActiveLayerForConfig(info) == Config::LayerType::Base) + Config::SetBase(info, temp_layer.Get(info)); }, setting.config_info); } // Save the SYSCONF. - layer->Save(); - Config::AddLayer(std::move(layer)); + Config::GetLayer(Config::LayerType::Base)->Save(); } void RestoreConfig()