From 24d51e1c925896e18e4536916b8c80f0b41e54fb Mon Sep 17 00:00:00 2001 From: lat9nq Date: Tue, 15 Mar 2022 01:05:55 -0400 Subject: [PATCH] yuzu_cmd: Allow user to specify config file location Adds an option `-c` or `--config` with one required argument that allows the user to specify to where the config file is located. Useful for scripts that run specific games with different preferences for settings. --- src/yuzu_cmd/config.cpp | 10 ++++++---- src/yuzu_cmd/config.h | 5 +++-- src/yuzu_cmd/yuzu.cpp | 22 ++++++++++++++++++---- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index b74411c84f..131bc22012 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include // Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307 @@ -29,11 +30,12 @@ namespace FS = Common::FS; -Config::Config() { - // TODO: Don't hardcode the path; let the frontend decide where to put the config files. - sdl2_config_loc = FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "sdl2-config.ini"; - sdl2_config = std::make_unique(FS::PathToUTF8String(sdl2_config_loc)); +const std::filesystem::path default_config_path = + FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "sdl2-config.ini"; +Config::Config(std::optional config_path) + : sdl2_config_loc{config_path.value_or(default_config_path)}, + sdl2_config{std::make_unique(FS::PathToUTF8String(sdl2_config_loc))} { Reload(); } diff --git a/src/yuzu_cmd/config.h b/src/yuzu_cmd/config.h index 1ee932be2e..f61ba23ecf 100644 --- a/src/yuzu_cmd/config.h +++ b/src/yuzu_cmd/config.h @@ -6,6 +6,7 @@ #include #include +#include #include #include "common/settings.h" @@ -13,14 +14,14 @@ class INIReader; class Config { - std::unique_ptr sdl2_config; std::filesystem::path sdl2_config_loc; + std::unique_ptr sdl2_config; bool LoadINI(const std::string& default_contents = "", bool retry = true); void ReadValues(); public: - Config(); + explicit Config(std::optional config_path); ~Config(); void Reload(); diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index b44ea0cc4b..f6d563017e 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -66,7 +66,8 @@ static void PrintHelp(const char* argv0) { "-f, --fullscreen Start in fullscreen mode\n" "-h, --help Display this help and exit\n" "-v, --version Output version information and exit\n" - "-p, --program Pass following string as arguments to executable\n"; + "-p, --program Pass following string as arguments to executable\n" + "-c, --config Load the specified configuration file\n"; } static void PrintVersion() { @@ -78,7 +79,6 @@ int main(int argc, char** argv) { Common::Log::Initialize(); Common::Log::SetColorConsoleBackendEnabled(true); Common::DetachedTasks detached_tasks; - Config config; int option_index = 0; #ifdef _WIN32 @@ -91,19 +91,24 @@ int main(int argc, char** argv) { } #endif std::string filepath; + std::optional config_path; + std::string program_args; bool fullscreen = false; static struct option long_options[] = { + // clang-format off {"fullscreen", no_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, {"program", optional_argument, 0, 'p'}, + {"config", required_argument, 0, 'c'}, {0, 0, 0, 0}, + // clang-format on }; while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvp::", long_options, &option_index); + int arg = getopt_long(argc, argv, "g:fhvp::c:", long_options, &option_index); if (arg != -1) { switch (static_cast(arg)) { case 'f': @@ -117,9 +122,12 @@ int main(int argc, char** argv) { PrintVersion(); return 0; case 'p': - Settings::values.program_args = argv[optind]; + program_args = argv[optind]; ++optind; break; + case 'c': + config_path = optarg; + break; } } else { #ifdef _WIN32 @@ -131,6 +139,12 @@ int main(int argc, char** argv) { } } + Config config{config_path}; + + if (!program_args.empty()) { + Settings::values.program_args = program_args; + } + #ifdef _WIN32 LocalFree(argv_w); #endif