aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/browser.cpp4
-rw-r--r--src/browser.h2
-rw-r--r--src/main.cpp38
-rw-r--r--src/profilemanager.cpp2
-rw-r--r--src/singleapplication.cpp109
-rw-r--r--src/singleapplication.h42
7 files changed, 31 insertions, 171 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8cd03e6..2f80ad1 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,8 +9,6 @@ set(CMAKE_AUTORCC ON)
set(poi_SRC
# main
main.cpp
- singleapplication.cpp
- singleapplication.h
browser.cpp
browser.h
session.cpp
@@ -59,6 +57,7 @@ endif()
target_include_directories(poi
PRIVATE ${Boost_INCLUDE_DIRS}
+ PRIVATE ../3rd-party
PRIVATE ../lib ../plugins
PRIVATE ../lib/configuration
PRIVATE ../lib/web)
@@ -66,6 +65,7 @@ target_include_directories(poi
target_link_libraries(poi
Qt5::Core Qt5::Widgets Qt5::Concurrent Qt5::WebEngineWidgets
${Boost_LIBRARIES}
+ SingleApplication
about
addressbar
configuration
@@ -80,6 +80,7 @@ if(Plasma)
endif(Plasma)
target_compile_definitions(poi
+ PRIVATE QAPPLICATION_CLASS=QApplication
PRIVATE QTBUG_65223_WORKAROUND
#PRIVATE QTBUG_68224_WORKAROUND
)
diff --git a/src/browser.cpp b/src/browser.cpp
index 6ffcaaa..f6b3805 100644
--- a/src/browser.cpp
+++ b/src/browser.cpp
@@ -27,11 +27,13 @@
#include <QJsonDocument>
Browser::Browser(int &argc, char *argv[])
- : SingleApplication(argc, argv)
+ : SingleApplication(argc, argv, true, SingleApplication::User | SingleApplication::SecondaryNotification | SingleApplication::ExcludeAppVersion)
{
setApplicationName("smolbote");
setWindowIcon(QIcon(":/icon.svg"));
setApplicationVersion(SMOLBOTE_VERSION);
+
+ //qDebug(QAPPLICATION_CLASS);
}
Browser::~Browser()
diff --git a/src/browser.h b/src/browser.h
index 3405e85..b03243f 100644
--- a/src/browser.h
+++ b/src/browser.h
@@ -9,7 +9,7 @@
#ifndef SMOLBOTE_BROWSER_H
#define SMOLBOTE_BROWSER_H
-#include "singleapplication.h"
+#include "SingleApplication/singleapplication.h"
#include <QJsonObject>
#include <QVector>
#include <functional>
diff --git a/src/main.cpp b/src/main.cpp
index 00a57d5..870120e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -84,6 +84,13 @@ int main(int argc, char **argv)
// set this, otherwise the webview becomes black when using a stylesheet
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
+ if(app.isPrimary())
+ qDebug("app is primary");
+ else if(app.isSecondary())
+ qDebug("app is secondary");
+ else
+ qDebug("app is something?");
+
// translator
if(config->exists("browser.locale")) {
auto *translator = new QTranslator(&app);
@@ -127,28 +134,29 @@ int main(int argc, char **argv)
}
// set up socket
- bool isSingleInstance = app.bindLocalSocket(socket.value());
- if(isSingleInstance) {
-#ifdef QT_DEBUG
- qDebug("Local socket bound");
-#endif
-
- QObject::connect(&app, &Browser::messageAvailable, &app, &Browser::createSession);
- }
+ QObject::connect(&app, &Browser::receivedMessage, &app, [&app](quint32 instanceId, QByteArray message) {
+ auto doc = QJsonDocument::fromJson(message);
+ app.createSession(doc.object());
+ });
- if(session) {
+ if(app.isPrimary()) {
+ app.createSession(Session::toJsonObject(profile.value(), urls));
+ } else if(session) {
QFile sessionJson(session.value());
if(sessionJson.open(QIODevice::ReadOnly | QIODevice::Text)) {
app.sendMessage(sessionJson.readAll());
sessionJson.close();
+ qDebug("session data sent");
+ return EXIT_SUCCESS;
} else {
qWarning("Could not open session [%s].", qUtf8Printable(sessionJson.fileName()));
}
- } else
- app.sendMessage(Session::toJsonObject(profile.value(), urls));
-
- if(isSingleInstance)
- return app.exec();
- else
+ } else {
+ auto message = Session::toJsonObject(profile.value(), urls);
+ qDebug("sending message: %s", app.sendMessage(QJsonDocument(message).toJson()) ? "okay" : "failed");
+ qDebug("message>>>\n%s", qUtf8Printable(QJsonDocument(message).toJson()));
return EXIT_SUCCESS;
+ }
+
+ return app.exec();
}
diff --git a/src/profilemanager.cpp b/src/profilemanager.cpp
index 1038598..bb967b9 100644
--- a/src/profilemanager.cpp
+++ b/src/profilemanager.cpp
@@ -80,7 +80,7 @@ WebProfile *ProfileManager::profile(const QString &id)
if(profiles.contains(id))
return profiles.value(id);
else
- return nullptr;
+ return WebProfile::defaultProfile();
}
const QMap<QString, WebProfile *> &ProfileManager::profileList()
diff --git a/src/singleapplication.cpp b/src/singleapplication.cpp
deleted file mode 100644
index 3c442b4..0000000
--- a/src/singleapplication.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * This file is part of smolbote. It's copyrighted by the contributors recorded
- * in the version control history of the file, available from its original
- * location: https://neueland.iserlohn-fortress.net/smolbote.hg
- *
- * SPDX-License-Identifier: GPL-3.0
- */
-
-#include "singleapplication.h"
-#include <QDataStream>
-#include <QLocalServer>
-#include <QLocalSocket>
-#include <QJsonObject>
-#include <QJsonDocument>
-
-SingleApplication::SingleApplication(int &argc, char **argv)
- : QApplication(argc, argv)
-{
-}
-
-SingleApplication::~SingleApplication()
-{
- if(m_localServer != nullptr) {
- if(m_localServer->isListening()) {
- m_localServer->close();
- QLocalServer::removeServer(LOCALSERVER_KEY);
- }
- }
-}
-
-/**
- * @brief SingleApplication::bindLocalSocket check for running local server by connecting to it
- * @return true if no other instance, false otherwise
- */
-bool SingleApplication::bindLocalSocket(const QString &name)
-{
- LOCALSERVER_KEY = name;
-
- QLocalSocket socket;
- socket.connectToServer(LOCALSERVER_KEY);
-
- if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) {
- // another server is running
- socket.close();
- return false;
- }
-
- // there is either no such socket, or the socket wasn't cleaned up
- else {
- m_localServer = new QLocalServer(this);
- connect(m_localServer, &QLocalServer::newConnection, this, &SingleApplication::receiveMessage);
-
- // no other server
- QLocalServer::removeServer(LOCALSERVER_KEY);
- return m_localServer->listen(LOCALSERVER_KEY);
- }
-}
-
-QString SingleApplication::serverName() const
-{
- Q_CHECK_PTR(m_localServer);
- return m_localServer->fullServerName();
-}
-
-int SingleApplication::sendMessage(const QByteArray &data)
-{
- QLocalSocket socket;
- socket.connectToServer(LOCALSERVER_KEY);
- if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) {
- socket.write(data);
- socket.waitForBytesWritten(LOCALSERVER_TIMEOUT);
- return EXIT_SUCCESS;
- }
- return EXIT_FAILURE;
-}
-
-int SingleApplication::sendMessage(const QJsonObject &message)
-{
- QLocalSocket socket;
- socket.connectToServer(LOCALSERVER_KEY);
- if(socket.waitForConnected(LOCALSERVER_TIMEOUT)) {
- socket.write(QJsonDocument(message).toJson());
- socket.waitForBytesWritten(LOCALSERVER_TIMEOUT);
- return EXIT_SUCCESS;
- }
-
- return EXIT_FAILURE;
-}
-
-void SingleApplication::receiveMessage()
-{
- QLocalSocket *socket = m_localServer->nextPendingConnection();
- if(socket == nullptr) {
- return;
- }
-
- socket->waitForReadyRead();
- auto message = socket->readAll();
-
- if(message.isEmpty())
- return;
-
-#ifdef QT_DEBUG
- qDebug("received message: %s", qUtf8Printable(message));
-#endif
-
- QJsonDocument doc = QJsonDocument::fromJson(message);
- emit messageAvailable(doc.object());
-}
diff --git a/src/singleapplication.h b/src/singleapplication.h
deleted file mode 100644
index 84c0fda..0000000
--- a/src/singleapplication.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of smolbote. It's copyrighted by the contributors recorded
- * in the version control history of the file, available from its original
- * location: https://neueland.iserlohn-fortress.net/smolbote.hg
- *
- * SPDX-License-Identifier: GPL-3.0
- */
-
-#ifndef SMOLBOTE_SINGLEAPPLICATION_H
-#define SMOLBOTE_SINGLEAPPLICATION_H
-
-#include <QApplication>
-
-class QLocalServer;
-class SingleApplication : public QApplication
-{
- Q_OBJECT
-
-public:
- explicit SingleApplication(int &argc, char **argv);
- ~SingleApplication() override;
-
- bool bindLocalSocket(const QString &name);
- QString serverName() const;
-
- int sendMessage(const QByteArray &data);
- int sendMessage(const QJsonObject &message);
-
-signals:
- void messageAvailable(const QJsonObject &object);
-
-private slots:
- void receiveMessage();
-
-private:
- const int LOCALSERVER_TIMEOUT = 500;
- QString LOCALSERVER_KEY;
-
- QLocalServer *m_localServer = nullptr;
-};
-
-#endif // SMOLBOTE_SINGLEAPPLICATION_H