summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraqua <aqua@iserlohn-fortress.net>2022-08-17 15:31:23 +0300
committeraqua <aqua@iserlohn-fortress.net>2022-08-17 15:31:23 +0300
commitc9b00d9b114eac7fe0f50c63cf2eede704c8f067 (patch)
treec06f2cae37436d2138eb92f007ff36bf2ea76741
parentAdd bitbucket-pipelines.yml (diff)
downloadrekonq-c9b00d9b114eac7fe0f50c63cf2eede704c8f067.tar.xz
Pass command line from secondary to primary instance
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/application.cpp7
-rw-r--r--src/application.hpp (renamed from src/application.h)16
-rw-r--r--src/application_instance.cpp50
-rw-r--r--src/main.cpp43
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(), {});
/*