diff --git a/CHANGES b/CHANGES index 84f785795..68638bb67 100644 --- a/CHANGES +++ b/CHANGES @@ -47,6 +47,7 @@ Misc: - Qt: Pass logging context through to video proxy thread (fixes mgba.io/i/3095) - Qt: Show maker code and game version in ROM info - Qt: Show a dummy shader settings tab if shaders aren't supported + - Qt: Allow passing multiple games on command line for multiplayer (closes mgba.io/i/3061) - Res: Port NSO-gba-colors shader (closes mgba.io/i/2834) - Scripting: Add `callbacks:oneshot` for single-call callbacks - Updater: Fix rewriting folders and files on Windows (fixes mgba.io/i/3384) diff --git a/src/platform/qt/ConfigController.cpp b/src/platform/qt/ConfigController.cpp index ed000ab3b..a12768709 100644 --- a/src/platform/qt/ConfigController.cpp +++ b/src/platform/qt/ConfigController.cpp @@ -196,6 +196,14 @@ ConfigController::ConfigController(QObject* parent) m_subparsers[1].extraOptions = nullptr; m_subparsers[1].longOptions = s_frontendOptions; m_subparsers[1].opts = this; + m_subparsers[1].handleExtraArg = [](struct mSubParser* parser, const char* arg) { + ConfigController* self = static_cast(parser->opts); + if (self->m_fnames.count() >= MAX_GBAS) { + return false; + } + self->m_fnames.append(QString::fromUtf8(arg)); + return true; + }; } ConfigController::~ConfigController() { diff --git a/src/platform/qt/ConfigController.h b/src/platform/qt/ConfigController.h index 4325a46ba..5aa9b7ac2 100644 --- a/src/platform/qt/ConfigController.h +++ b/src/platform/qt/ConfigController.h @@ -102,6 +102,7 @@ public: const mArguments* args() const { return &m_args; } const mGraphicsOpts* graphicsOpts() const { return &m_graphicsOpts; } + QStringList fileNames() const { return m_fnames; } void usage(const char* arg0) const; static const QString& configDir(); @@ -129,6 +130,7 @@ private: mArguments m_args{}; mGraphicsOpts m_graphicsOpts{}; std::array m_subparsers; + QStringList m_fnames; bool m_parsed = false; QHash m_argvOptions; diff --git a/src/platform/qt/GBAApp.cpp b/src/platform/qt/GBAApp.cpp index 90fc89170..258df9f0c 100644 --- a/src/platform/qt/GBAApp.cpp +++ b/src/platform/qt/GBAApp.cpp @@ -397,6 +397,26 @@ void GBAApp::finishJob(qint64 jobId) { m_workerJobCallbacks.remove(jobId); } +void GBAApp::initMultiplayer() { + QStringList fnames = m_configController->fileNames(); + if (fnames.count() < 2) { + return; + } + + Window* w = m_windows[0]; + for (const auto& fname : fnames) { + if (!w) { + w = newWindow(); + } + if (!w) { + break; + } + CoreController* core = m_manager.loadGame(fname); + w->setController(core, fname); + w = nullptr; + } +} + GBAApp::WorkerJob::WorkerJob(qint64 id, std::function&& job, GBAApp* owner) : m_id(id) , m_job(std::move(job)) diff --git a/src/platform/qt/GBAApp.h b/src/platform/qt/GBAApp.h index 2388bc297..43848b183 100644 --- a/src/platform/qt/GBAApp.h +++ b/src/platform/qt/GBAApp.h @@ -82,6 +82,8 @@ public: ApplicationUpdater* updater() { return &m_updater; } QString invokeOnExit() { return m_invokeOnExit; } + void initMultiplayer(); + public slots: void restartForUpdate(); Window* newWindow(); diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index f98d2cd88..48f1984f7 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -131,10 +131,9 @@ int main(int argc, char* argv[]) { } Window* w = application.newWindow(); - w->loadConfig(); w->argumentsPassed(); - w->show(); + application.initMultiplayer(); int ret = application.exec(); if (ret != 0) {