Преглед изворни кода

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.
lat9nq пре 4 година
родитељ
комит
24d51e1c92
3 измењених фајлова са 27 додато и 10 уклоњено
  1. 6 4
      src/yuzu_cmd/config.cpp
  2. 3 2
      src/yuzu_cmd/config.h
  3. 18 4
      src/yuzu_cmd/yuzu.cpp

+ 6 - 4
src/yuzu_cmd/config.cpp

@@ -3,6 +3,7 @@
 // Refer to the license.txt file included.
 
 #include <memory>
+#include <optional>
 #include <sstream>
 
 // 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<INIReader>(FS::PathToUTF8String(sdl2_config_loc));
+const std::filesystem::path default_config_path =
+    FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "sdl2-config.ini";
 
+Config::Config(std::optional<std::filesystem::path> config_path)
+    : sdl2_config_loc{config_path.value_or(default_config_path)},
+      sdl2_config{std::make_unique<INIReader>(FS::PathToUTF8String(sdl2_config_loc))} {
     Reload();
 }
 

+ 3 - 2
src/yuzu_cmd/config.h

@@ -6,6 +6,7 @@
 
 #include <filesystem>
 #include <memory>
+#include <optional>
 #include <string>
 
 #include "common/settings.h"
@@ -13,14 +14,14 @@
 class INIReader;
 
 class Config {
-    std::unique_ptr<INIReader> sdl2_config;
     std::filesystem::path sdl2_config_loc;
+    std::unique_ptr<INIReader> sdl2_config;
 
     bool LoadINI(const std::string& default_contents = "", bool retry = true);
     void ReadValues();
 
 public:
-    Config();
+    explicit Config(std::optional<std::filesystem::path> config_path);
     ~Config();
 
     void Reload();

+ 18 - 4
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<std::string> 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<char>(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