From 650a59f964f3603711f4fee8e5ede131b00e9faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 20 Jul 2026 16:50:34 +0200 Subject: [PATCH] Migrate more config parsing to the new parser --- Core/CmdLine.cpp | 13 ++++++++++--- Core/CmdLine.h | 4 ++++ UI/NativeApp.cpp | 49 ++++++++++++++++++------------------------------ 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/Core/CmdLine.cpp b/Core/CmdLine.cpp index c3ea16f688..aa3c68a4b1 100644 --- a/Core/CmdLine.cpp +++ b/Core/CmdLine.cpp @@ -133,8 +133,14 @@ static const CommandLineParam g_autoParams[] = { {POFF(startScreen), CmdParamType::String, "start-screen", 0, "Start on a specific screen (e.g. 'gamesettings', 'touchscreentest')"}, {POFF(escapeExit), CmdParamType::Bool, "escape-exit", 0, "Escape key exits the application"}, {POFF(pauseMenuExit), CmdParamType::Bool, "pause-menu-exit", 0, "Change \"Exit to menu\" in pause menu to \"Exit\""}, + {POFF(appendConfig), CmdParamType::String, "appendconfig", 0, "Merge config FILE into the current configuration"}, + {POFF(root), CmdParamType::String, "root", 0, "Mount root directory"}, + {POFF(stateToLoad), CmdParamType::String, "state", 0, "Load state from specified file"}, }; +// NOTE: On Windows this prints nothing unfortunately, since PPSSPP is not a "console app". +// A fun trick we could do is AttachConsole(ATTACH_PARENT_PROCESS) which works at least from git bash and powershell, if we also use WriteConsole. +// However it's not exactly ideal. static int printUsage(int argc, const char *argv[]) { // NOTE: by convention, --help outputs to stdout, // not to stderr, since it is intended output in this @@ -175,9 +181,6 @@ static int printUsage(int argc, const char *argv[]) { PRINT_STDOUT(" --scale FACTOR set scale\n"); PRINT_STDOUT(" --graphics=BACKEND use a different gpu backend\n"); PRINT_STDOUT(" options: gles, software, etc. (also opengl3.1, etc.)\n"); - - PRINT_STDOUT(" --appendconfig=FILE merge config FILE into the current configuration\n"); - return 0; } @@ -350,6 +353,10 @@ void CommandLineOptions::ApplyToConfig() const { g_logManager.SetAllLogLevels(logLevel.value()); } + if (root.has_value()) { + g_Config.DoNotSaveSetting(&g_Config.mountRoot); + g_Config.mountRoot = Path(root.value()); + } // Note: dpi is not applied here - it's platform-specific. // Platforms should check cmdLineOptions.dpi.has_value() and handle accordingly. } diff --git a/Core/CmdLine.h b/Core/CmdLine.h index 9495b5f970..b4c203c2e7 100644 --- a/Core/CmdLine.h +++ b/Core/CmdLine.h @@ -26,6 +26,10 @@ struct CommandLineOptions { std::optional escapeExit; std::optional pauseMenuExit; + std::optional appendConfig; + std::optional root; // mount root, needs more explanation + std::optional stateToLoad; + // SDL only: Option to force a specific OpenGL version (42="4.2", // etc.; -1 means "try them all"). // Implemented as a workaround for https://github.com/hrydgard/ppsspp/issues/20687 diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index ba019f3a53..eeef028103 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -587,12 +587,8 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO cmdLineOptions.ApplyToConfig(); const char *fileToLog = nullptr; - Path stateToLoad; bool gotBootFilename = false; - bool gotoGameSettings = false; - bool gotoTouchScreenTest = false; - bool gotoDeveloperTools = false; boot_filename.clear(); // Parse command line @@ -606,14 +602,6 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO if (cmdLineOptions.logLevel.has_value()) { setLogLevel(cmdLineOptions.logLevel.value()); } - if (cmdLineOptions.startScreen.has_value()) { - if (equals(cmdLineOptions.startScreen.value(), "touchscreentest")) - gotoTouchScreenTest = true; - if (equals(cmdLineOptions.startScreen.value(), "gamesettings")) - gotoGameSettings = true; - if (equals(cmdLineOptions.startScreen.value(), "developertools")) - gotoDeveloperTools = true; - } for (int i = 1; i < argc; i++) { if (argv[i][0] == '-') { @@ -630,16 +618,6 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO setLogLevel(static_cast(std::atoi(argv[i] + strlen("--loglevel=")))); if (!strncmp(argv[i], "--log=", strlen("--log=")) && strlen(argv[i]) > strlen("--log=")) fileToLog = argv[i] + strlen("--log="); - if (!strncmp(argv[i], "--state=", strlen("--state=")) && strlen(argv[i]) > strlen("--state=")) - stateToLoad = Path(argv[i] + strlen("--state=")); - if (!strncmp(argv[i], "--root=", strlen("--root=")) && strlen(argv[i]) > strlen("--root=")) { - g_Config.DoNotSaveSetting(&g_Config.mountRoot); - g_Config.mountRoot = Path(argv[i] + strlen("--root=")); - } - if (!strncmp(argv[i], "--appendconfig=", strlen("--appendconfig=")) && strlen(argv[i]) > strlen("--appendconfig=")) { - g_Config.SetAppendedConfigIni(Path(argv[i] + strlen("--appendconfig="))); - g_Config.LoadAppendedConfig(); - } break; } } else { @@ -647,6 +625,11 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO } } + if (cmdLineOptions.appendConfig.has_value()) { + g_Config.SetAppendedConfigIni(Path(cmdLineOptions.appendConfig.value())); + g_Config.LoadAppendedConfig(); + } + // This parameter should be a boot filename. Only accept it if we // don't already have one. if (cmdLineOptions.bootFilename.has_value()) { @@ -730,8 +713,8 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO g_BackgroundAudio.SFX().Init(); - if (!boot_filename.empty() && stateToLoad.Valid()) { - SaveState::Load(stateToLoad, -1, &ShowMessageAfterSaveStateAction); + if (!boot_filename.empty() && cmdLineOptions.stateToLoad.has_value()) { + SaveState::Load(Path(cmdLineOptions.stateToLoad.value()), -1, &ShowMessageAfterSaveStateAction); } if (g_Config.bAchievementsEnable) { @@ -751,14 +734,18 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO if (g_Config.memStickDirectory.empty()) { INFO_LOG(Log::System, "No memstick directory! Asking for one to be configured."); g_screenManager->switchScreen(new LogoScreen(AfterLogoScreen::MEMSTICK_SCREEN_INITIAL_SETUP)); - } else if (gotoGameSettings) { - g_screenManager->switchScreen(new LogoScreen(AfterLogoScreen::TO_GAME_SETTINGS)); - } else if (gotoTouchScreenTest) { - g_screenManager->switchScreen(new MainScreen()); + } else if (cmdLineOptions.startScreen.has_value()) { + // Launch into specified start screen. This is useful for testing UI, more screens can be easily added here. + if (equals(cmdLineOptions.startScreen.value(), "touchscreentest")) { + g_screenManager->switchScreen(new MainScreen()); + } g_screenManager->push(new TouchTestScreen(Path())); - } else if (gotoDeveloperTools) { - g_screenManager->switchScreen(new MainScreen()); - g_screenManager->push(new DeveloperToolsScreen(Path())); + if (equals(cmdLineOptions.startScreen.value(), "gamesettings")) { + g_screenManager->switchScreen(new LogoScreen(AfterLogoScreen::TO_GAME_SETTINGS)); + } else if (equals(cmdLineOptions.startScreen.value(), "developertools")) { + g_screenManager->switchScreen(new MainScreen()); + g_screenManager->push(new DeveloperToolsScreen(Path())); + } } else if (skipLogo && !boot_filename.empty()) { INFO_LOG(Log::System, "Launching EmuScreen with boot filename '%s'", boot_filename.c_str()); g_screenManager->switchScreen(new EmuScreen(boot_filename));