Merge pull request #6213 from ligfx/restoresysconf

BootManager: RestoreSYSCONF without resetting all other config
This commit is contained in:
Leo Lam
2017-11-20 13:16:31 +01:00
committed by GitHub

View File

@ -397,28 +397,31 @@ void Stop()
// SYSCONF can be modified during emulation by the user and internally, which makes it // 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. // 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. // 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() static void RestoreSYSCONF()
{ {
// This layer contains the new SYSCONF settings (including any temporary settings). // This layer contains the new SYSCONF settings (including any temporary settings).
auto layer = std::make_unique<Config::Layer>(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) for (const auto& setting : Config::SYSCONF_SETTINGS)
{ {
std::visit( std::visit(
[&](auto& info) { [&](auto& info) {
// If this setting was overridden, then we copy the base layer value back to the SYSCONF. // 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. // Otherwise we leave the new value in the SYSCONF.
if (Config::GetActiveLayerForConfig(info) != Config::LayerType::Base) if (Config::GetActiveLayerForConfig(info) == Config::LayerType::Base)
layer->Set(info, Config::GetBase(info)); Config::SetBase(info, temp_layer.Get(info));
}, },
setting.config_info); setting.config_info);
} }
// Save the SYSCONF. // Save the SYSCONF.
layer->Save(); Config::GetLayer(Config::LayerType::Base)->Save();
Config::AddLayer(std::move(layer));
} }
void RestoreConfig() void RestoreConfig()