diff options
author | aqua <aqua@iserlohn-fortress.net> | 2022-08-17 15:31:23 +0300 |
---|---|---|
committer | aqua <aqua@iserlohn-fortress.net> | 2022-08-17 15:31:23 +0300 |
commit | c9b00d9b114eac7fe0f50c63cf2eede704c8f067 (patch) | |
tree | c06f2cae37436d2138eb92f007ff36bf2ea76741 | |
parent | Add bitbucket-pipelines.yml (diff) | |
download | rekonq-c9b00d9b114eac7fe0f50c63cf2eede704c8f067.tar.xz |
Pass command line from secondary to primary instance
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/application.cpp | 7 | ||||
-rw-r--r-- | src/application.hpp (renamed from src/application.h) | 16 | ||||
-rw-r--r-- | src/application_instance.cpp | 50 | ||||
-rw-r--r-- | src/main.cpp | 43 |
5 files changed, 72 insertions, 46 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5f154e3f..f1596ceb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -215,7 +215,7 @@ ADD_DEFINITIONS ( ${KDE4_DEFINITIONS} ) #KDE4_ADD_KDEINIT_EXECUTABLE( rekonq ${rekonq_KDEINIT_SRCS} main.cpp ) add_executable(rekonq - main.cpp application.cpp application.h + main.cpp application.cpp application_instance.cpp application.hpp # ---------------------------------------- plugins/rplugininterface.hpp plugins/rview.hpp ) diff --git a/src/application.cpp b/src/application.cpp index 9e34e5e2..f3bb5559 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -9,7 +9,7 @@ * Description: Application Main Class * ============================================================ */ -#include "application.h" +#include "application.hpp" #include "plugins/pluginloader.h" #include "plugins/rplugininterface.hpp" #include <QPluginLoader> @@ -17,8 +17,11 @@ // --------------------------------------------------------------------------------------------------------------- // Ctor and Dtor -Application::Application(int &argc, char *argv[]) : SingleApplication(argc, argv) +Application::Application(int &argc, char *argv[]) : SingleApplication(argc, argv, true) { + // constructor needs to allow secondary instances (allowSecondary = true) + connect(this, &SingleApplication::receivedMessage, this, &Application::parseCommandLine); + // updating rekonq configuration // updateConfiguration(); diff --git a/src/application.h b/src/application.hpp index 407a8681..e74350f1 100644 --- a/src/application.h +++ b/src/application.hpp @@ -30,8 +30,8 @@ class PluginLoader; // --------------------------------------------------------------------------------------------------------------- /** - * Rekonq Application class - */ + * Rekonq Application class + */ class Application : public SingleApplication { Q_OBJECT @@ -42,7 +42,7 @@ public: bool registerPlugin(const QString &path); // int newInstance(); - static Application *instance() { return (qobject_cast<Application *>(QCoreApplication::instance())); } + [[deprecated]] static Application *instance() { return (qobject_cast<Application *>(QCoreApplication::instance())); } // RekonqWindow *rekonqWindow(const QString &activityID = QString()); // RekonqWindowList rekonqWindowList(); @@ -67,6 +67,13 @@ public: public slots: /** + * Parse the command line in @param message and carry out the required actions + * @param instanceId if the current instance, check QCoreApplication::arguments instead of @param message + * @param message the command line + */ + void parseCommandLine(int instanceId, const QByteArray &message); + + /** * Save application's configuration * * @see ReKonfig::self()->writeConfig(); @@ -114,6 +121,3 @@ private: // RekonqWindowList m_rekonqWindows; QList<rView *> m_webApps; }; - -[[deprecated]] static inline auto *rApp_f() { return Application::instance(); } -#define rApp rApp_f() diff --git a/src/application_instance.cpp b/src/application_instance.cpp new file mode 100644 index 00000000..c2005acd --- /dev/null +++ b/src/application_instance.cpp @@ -0,0 +1,50 @@ +/* ============================================================ + * The rekonq project + * ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2022 aqua <aqua@iserlohn-fortress.net> + * ============================================================ + * Description: Application Main Class + * Instance communication and Command Line parsing + * ============================================================ */ + +#include "application.hpp" +#include <QCommandLineParser> + +static const char *description = "A lightweight Web Browser based on Qt WebEngine"; + +void Application::parseCommandLine(int instanceId, const QByteArray &message) +{ + // Initialize command line args + QCommandLineParser parser; + parser.setApplicationDescription(description); + parser.addHelpOption(); + parser.addVersionOption(); + + // Define the command line options + QCommandLineOption options_incognito("incognito", QCoreApplication::translate("main", "Open in incognito mode")); + QCommandLineOption options_webapp("webapp", + QCoreApplication::translate("main", "Open URL as web app (in a simple window)")); + QCommandLineOption options_plugin({"l", "load"}, QCoreApplication::translate("main", "Add plugin to load path"), + "path"); + parser.addOptions({options_incognito, options_webapp, options_plugin}); + + // Define the positional arguments + parser.addPositionalArgument("URL", QCoreApplication::translate("main", "Location to open")); + + if (instanceId == this->instanceId()) parser.process(*this); + else { + QStringList arguments; + for (const auto &arg : message.split('\n')) arguments.append(arg); + parser.process(arguments); + } + + if (parser.isSet(options_plugin)) { + for (const auto &plugin : parser.values(options_plugin)) this->registerPlugin(plugin); + } + + const auto positionalArguments = parser.positionalArguments(); + if (parser.isSet(options_webapp)) + positionalArguments.isEmpty() ? this->newWebApp() + : this->newWebApp(QUrl::fromUserInput(positionalArguments.first())); +} diff --git a/src/main.cpp b/src/main.cpp index 6db6f36c..1d6e30da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,13 +9,7 @@ * Description: Application Entry Point * ============================================================ */ -#include "application.h" -//#include "sessionmanager.h" -//#include "rekonqwindow.h" -//#include "urlresolver.h" -#include <QCommandLineParser> - -static const char *description = "A lightweight Web Browser based on Qt WebEngine"; +#include "application.hpp" int main(int argc, char **argv) { @@ -27,37 +21,12 @@ int main(int argc, char **argv) QCoreApplication::setApplicationName(QL1S("rekonq")); QCoreApplication::setApplicationVersion(REKONQ_VERSION); - // Initialize command line args - QCommandLineParser parser; - parser.setApplicationDescription(description); - parser.addHelpOption(); - parser.addVersionOption(); - - // Define the command line options - QCommandLineOption options_incognito("incognito", QCoreApplication::translate("main", "Open in incognito mode")); - QCommandLineOption options_webapp("webapp", - QCoreApplication::translate("main", "Open URL as web app (in a simple window)")); - QCommandLineOption options_plugin({"l", "load"}, QCoreApplication::translate("main", "Add plugin to load path"), - "path"); - parser.addOptions({options_incognito, options_webapp, options_plugin}); - - // Define the positional arguments - parser.addPositionalArgument("URL", QCoreApplication::translate("main", "Location to open")); - - parser.process(app); - - if (parser.isSet(options_plugin)) { - for (const auto &plugin : parser.values(options_plugin)) app.registerPlugin(plugin); - } - - const auto positionalArguments = parser.positionalArguments(); - if (parser.isSet(options_webapp)) - positionalArguments.isEmpty() ? app.newWebApp() : app.newWebApp(QUrl::fromUserInput(positionalArguments.first())); - - /*if (!Application::start()) { - kWarning() << "rekonq is already running!"; + if (app.isSecondary()) { + app.sendMessage(Application::arguments().join('\n').toUtf8()); return 0; - }*/ + } + else + app.parseCommandLine(app.instanceId(), {}); /* |