diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 65cbd0360d..b54caae0b8 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -138,7 +138,7 @@ int main(int argc, char* argv[]) UICommon::CreateDirectories(); UICommon::Init(); Resources::Init(); - Settings::Instance().SetBatchModeEnabled(options.is_set("batch") && options.is_set("exec")); + Settings::Instance().SetBatchModeEnabled(options.is_set("batch")); // Hook up alerts from core Common::RegisterMsgAlertHandler(QtMsgAlertHandler); @@ -152,12 +152,14 @@ int main(int argc, char* argv[]) &app, &Core::HostDispatchJobs); std::unique_ptr boot; + bool game_specified = false; if (options.is_set("exec")) { const std::list paths_list = options.all("exec"); const std::vector paths{std::make_move_iterator(std::begin(paths_list)), std::make_move_iterator(std::end(paths_list))}; boot = BootParameters::GenerateFromFile(paths); + game_specified = true; } else if (options.is_set("nand_title")) { @@ -171,14 +173,30 @@ int main(int argc, char* argv[]) { ModalMessageBox::critical(nullptr, QObject::tr("Error"), QObject::tr("Invalid title ID.")); } + game_specified = true; } else if (!args.empty()) { boot = BootParameters::GenerateFromFile(args.front()); + game_specified = true; } int retval; + if (Settings::Instance().IsBatchModeEnabled() && !game_specified) + { + ModalMessageBox::critical( + nullptr, QObject::tr("Error"), + QObject::tr("Batch mode cannot be used without specifying a game to launch.")); + retval = 1; + } + else if (Settings::Instance().IsBatchModeEnabled() && !boot) + { + // A game to launch was specified, but it was invalid. + // An error has already been shown by code above, so exit without showing another error. + retval = 1; + } + else { DolphinAnalytics::Instance().ReportDolphinStart("qt"); diff --git a/Source/Core/UICommon/CommandLineParse.cpp b/Source/Core/UICommon/CommandLineParse.cpp index 5a12d62997..bf3a556a29 100644 --- a/Source/Core/UICommon/CommandLineParse.cpp +++ b/Source/Core/UICommon/CommandLineParse.cpp @@ -22,7 +22,7 @@ class CommandLineConfigLayerLoader final : public Config::ConfigLayerLoader { public: CommandLineConfigLayerLoader(const std::list& args, const std::string& video_backend, - const std::string& audio_backend) + const std::string& audio_backend, bool batch) : ConfigLayerLoader(Config::LayerType::CommandLine) { if (!video_backend.empty()) @@ -31,6 +31,11 @@ public: if (!audio_backend.empty()) m_values.emplace_back(Config::MAIN_DSP_HLE.location, ValueToString(audio_backend == "HLE")); + // Batch mode hides the main window, and render to main hides the render window. To avoid a + // situation where we would have no window at all, disable render to main when using batch mode. + if (batch) + m_values.emplace_back(Config::MAIN_RENDER_TO_MAIN.location, ValueToString(false)); + // Arguments are in the format of .
.=Value for (const auto& arg : args) { @@ -98,7 +103,7 @@ std::unique_ptr CreateParser(ParserOptions options) parser->add_option("-l", "--logger").action("store_true").help("Open the logger"); parser->add_option("-b", "--batch") .action("store_true") - .help("Run Dolphin without the user interface (Requires --exec)"); + .help("Run Dolphin without the user interface (Requires --exec or --nand-title)"); parser->add_option("-c", "--confirm").action("store_true").help("Set Confirm on Stop"); } @@ -114,13 +119,14 @@ std::unique_ptr CreateParser(ParserOptions options) static void AddConfigLayer(const optparse::Values& options) { + std::list config_args; if (options.is_set_by_user("config")) - { - const std::list& config_args = options.all("config"); - Config::AddLayer(std::make_unique( - config_args, static_cast(options.get("video_backend")), - static_cast(options.get("audio_emulation")))); - } + config_args = options.all("config"); + + Config::AddLayer(std::make_unique( + std::move(config_args), static_cast(options.get("video_backend")), + static_cast(options.get("audio_emulation")), + static_cast(options.get("batch")))); } optparse::Values& ParseArguments(optparse::OptionParser* parser, int argc, char** argv)