From f3b6ecf0983dbb85a61faee21f41160df63cc575 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Tue, 21 Feb 2017 16:40:25 +0100 Subject: Single instance --- src/browser.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'src/browser.cpp') diff --git a/src/browser.cpp b/src/browser.cpp index 1ca9abb..46af166 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -24,11 +24,9 @@ #include Browser::Browser(int &argc, char *argv[]) : - QApplication(argc, argv), - m_bookmarksManager(new BookmarksDialog), - m_downloadManager(new DownloadDialog) + QApplication(argc, argv) { - QtWebEngine::initialize(); + setApplicationName("smolbote"); } Browser::~Browser() @@ -40,6 +38,50 @@ Browser::~Browser() delete m_downloadManager; } +/*! + * Anything that needs to run after the QCommandLineParser but before showing a main window + */ +bool Browser::preLaunch(QStringList urls) +{ + Settings settings; + + if(settings.value("browser/singleInstance", true).toBool()) { + QString serverName = settings.value("browser/localSocket", "smolbote-singlelock").toString(); + + // Check for other running instance + QLocalSocket socket; + socket.connectToServer(serverName); + if(socket.waitForConnected(500)) { + QTextStream stream(&socket); + stream << urls.join('|'); + stream.flush(); + socket.waitForBytesWritten(); + return false; + } + + // There is no other instance + m_localServer = new QLocalServer(this); + connect(m_localServer, SIGNAL(newConnection()), this, SLOT(handleNewConnection())); + if (!m_localServer->listen(serverName) && m_localServer->serverError() == QAbstractSocket::AddressInUseError) { + // Could not create local server because the socket is already in use + QLocalServer::removeServer(serverName); + if (!m_localServer->listen(serverName)) { + // Couldn't free the socket + qWarning("Could not create local socket %s.", qPrintable(serverName)); + } + } else { + qDebug("Created local socket."); + } + } + + m_bookmarksManager = new BookmarksDialog; + m_downloadManager = new DownloadDialog; + + QtWebEngine::initialize(); + + return true; +} + Browser *Browser::instance() { return static_cast(QCoreApplication::instance()); @@ -80,7 +122,32 @@ void Browser::addWindow(MainWindow *window) window->show(); } +MainWindow *Browser::mainWindow() +{ + if(m_windows.isEmpty()) { + addWindow(new MainWindow()); + } + return m_windows.first(); +} + void Browser::removeWindow(MainWindow *window) { m_windows.removeOne(window); } + +void Browser::handleNewConnection() +{ + QLocalSocket *socket = m_localServer->nextPendingConnection(); + if(!socket) { + // null socket -> return + return; + } + + socket->waitForReadyRead(); + QStringList urls = QString(socket->readAll()).split('|'); + delete socket; + + for(QString s : urls) { + mainWindow()->addNewTab(QUrl::fromUserInput(s)); + } +} -- cgit v1.2.1