From 5ebf6835896748db400341189cfd4417338fc9e5 Mon Sep 17 00:00:00 2001 From: iota97 Date: Sun, 9 Oct 2022 15:04:19 +0200 Subject: [PATCH] Allow to append some configs --- Core/Config.cpp | 31 +++++++++++++++++++++++++++++++ Core/Config.h | 5 +++++ UI/NativeApp.cpp | 4 ++++ 3 files changed, 40 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index 1145037ab5..d4360b4c51 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1310,6 +1310,29 @@ void Config::UpdateIniLocation(const char *iniFileName, const char *controllerIn controllerIniFilename_ = FindConfigFile(useControllerIniFilename ? controllerIniFilename : controlsIniFilename); } +bool Config::LoadAppendedConfig() { + IniFile iniFile; + if (!iniFile.Load(appendedConfigFileName_)) { + ERROR_LOG(LOADER, "Failed to read appended config '%s'.", appendedConfigFileName_.c_str()); + return false; + } + + IterateSettings(iniFile, [&iniFile](Section *section, ConfigSetting *setting) { + if (iniFile.Exists(section->name().c_str(), setting->iniKey_)) + setting->Get(section); + }); + + INFO_LOG(LOADER, "Loaded appended config '%s'.", appendedConfigFileName_.c_str()); + + Save("Loaded appended config"); // Let's prevent reset + return true; +} + +void Config::SetAppendedConfigIni(const Path &path) { + appendedConfigFileName_ = path; +} + + void Config::Load(const char *iniFileName, const char *controllerIniFilename) { if (!bUpdatedInstanceCounter) { InitInstanceCounter(); @@ -1916,6 +1939,14 @@ bool Config::loadGameConfig(const std::string &pGameId, const std::string &title }); KeyMap::LoadFromIni(iniFile); + + if (!appendedConfigFileName_.ToString().empty() && + std::find(appendedConfigUpdatedGames_.begin(), appendedConfigUpdatedGames_.end(), pGameId) == appendedConfigUpdatedGames_.end()) { + + LoadAppendedConfig(); + appendedConfigUpdatedGames_.push_back(pGameId); + } + PostLoadCleanup(true); return true; } diff --git a/Core/Config.h b/Core/Config.h index c8df6334a9..a6b8a04d91 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -567,6 +567,8 @@ public: void ClearRecentIsos(); const std::map> &GetLangValuesMapping(); + bool LoadAppendedConfig(); + void SetAppendedConfigIni(const Path &path); protected: void LoadStandardControllerIni(); @@ -585,6 +587,9 @@ private: Path iniFilename_; Path controllerIniFilename_; Path searchPath_; + Path appendedConfigFileName_; + // A set make more sense, but won't have many entry, and I dont want to include the whole std::set header here + std::vector appendedConfigUpdatedGames_; ConfigPrivate *private_ = nullptr; }; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index ef5b11227d..e983e3e832 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -665,6 +665,10 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch gotoTouchScreenTest = true; if (!strcmp(argv[i], "--gamesettings")) gotoGameSettings = true; + if (!strncmp(argv[i], "--appendconfig=", strlen("--appendconfig=")) && strlen(argv[i]) > strlen("--appendconfig=")) { + g_Config.SetAppendedConfigIni(Path(std::string(argv[i] + strlen("--appendconfig=")))); + g_Config.LoadAppendedConfig(); + } break; } } else {