Added SingleInstanceManager

This commit is contained in:
delia 2025-04-29 01:06:13 +02:00
parent 9fb4facfb3
commit cc669ac2cd
6 changed files with 95 additions and 13 deletions

View File

@ -34,7 +34,7 @@ find_package(MPV REQUIRED)
find_package(LZ4 REQUIRED)
find_package(FFMPEG REQUIRED)
find_package(PulseAudio REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt5 REQUIRED COMPONENTS Widgets Network)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
@ -214,6 +214,8 @@ add_executable(
src/Qt/UIWindow.h
src/Qt/UIWindow.cpp
src/Qt/SingleInstanceManager.h
src/Qt/SingleInstanceManager.cpp
src/External/Android/fft.cpp
src/External/Android/fft.h
@ -474,7 +476,8 @@ target_link_libraries (linux-wallpaperengine PUBLIC
${PULSEAUDIO_LIBRARY}
glfw
libcef_lib libcef_dll_wrapper
Qt5::Widgets)
Qt5::Widgets
Qt5::Network)
if (WAYLAND_SUPPORT_FOUND)

View File

@ -1,5 +1,6 @@
#include <csignal>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <QApplication>
@ -10,6 +11,7 @@
#include <QProcess>
#include <QFileInfo>
#include <QObject>
#include <QLocalServer>
#include <iterator>
#include <qboxlayout.h>
#include <qcoreapplication.h>
@ -17,6 +19,7 @@
#include <qgridlayout.h>
#include <qlabel.h>
#include <qnamespace.h>
#include <qobject.h>
#include <qprocess.h>
#include <qpushbutton.h>
#include <qscrollarea.h>
@ -25,6 +28,7 @@
#include <filesystem>
#include <vector>
#include "Qt/SingleInstanceManager.h"
#include "Qt/UIWindow.h"
#include "Steam/FileSystem/FileSystem.h"
#include "WallpaperEngine/Application/CApplicationContext.h"
@ -34,6 +38,8 @@
WallpaperEngine::Application::CWallpaperApplication* appPointer;
QCoreApplication* globalApp = nullptr;
SingleInstanceManager* g_instanceManager = nullptr;
class UIWindow;
@ -41,6 +47,7 @@ void signalhandler(int sig)
{
if (appPointer == nullptr) {
if(globalApp != nullptr) {
if (g_instanceManager) g_instanceManager->cleanUpServer();
globalApp->quit();
} else return;
}
@ -56,16 +63,14 @@ void initLogging ()
int main (int argc, char* argv[]) {
initLogging ();
bool runGui = false;
for (int i = 1; i < argc; i++) {
if(std::strcmp(argv[i], "--gui") == 0) {
runGui = true;
break;
}
}
g_instanceManager = new SingleInstanceManager("linux-wallpaperengine");
if (runGui) {
if (argc <= 1) {
if (!g_instanceManager->tryListen()) {
std::cout << "App is already running!!!!\n";
return 0;
}
std::string path = Steam::FileSystem::workshopDirectory(431960);
std::vector<std::string> wallpaperPaths;
@ -81,7 +86,7 @@ int main (int argc, char* argv[]) {
std::signal (SIGINT, signalhandler);
std::signal (SIGTERM, signalhandler);
auto* uiWindow = new UIWindow(nullptr, &qapp);
auto* uiWindow = new UIWindow(nullptr, &qapp, g_instanceManager);
uiWindow->setupUIWindow(wallpaperPaths);

View File

@ -0,0 +1,32 @@
#include "SingleInstanceManager.h"
#include <qchar.h>
#include <qlocalserver.h>
#include <qlocalsocket.h>
#include <qobject.h>
SingleInstanceManager::SingleInstanceManager(const QString& name, QObject* parent) : QObject(parent), m_serverName(name) {
this->server = new QLocalServer(this);
}
SingleInstanceManager::~SingleInstanceManager() {
cleanUpServer();
}
void SingleInstanceManager::cleanUpServer() {
if(server->isListening()) {
server->close();
}
}
bool SingleInstanceManager::tryListen() {
if (!server->listen(m_serverName)) return false;
connect(server, &QLocalServer::newConnection, this, [this]() {
auto client = server->nextPendingConnection();
connect(client, &QLocalSocket::readyRead, client, [this, client]() {
emit messageReceived(client->readAll());
client->disconnectFromServer();
});
});
return true;
}

View File

@ -0,0 +1,27 @@
#pragma once
#include <QObject>
#include <qlocalserver.h>
#include <QLocalSocket>
#include <qobject.h>
#include <qobjectdefs.h>
#include <QByteArray>
class SingleInstanceManager : public QObject {
Q_OBJECT
public:
SingleInstanceManager(const QString& serverName, QObject* parent = nullptr);
~SingleInstanceManager() override;
void cleanUpServer();
bool tryListen();
void sendMessage(const QByteArray& message);
signals:
void messageReceived(const QByteArray& message);
private:
QLocalServer* server;
QString m_serverName;
};

View File

@ -1,26 +1,31 @@
#include "UIWindow.h"
#include "Qt/SingleInstanceManager.h"
#include <QtConcurrent/qtconcurrentrun.h>
#include <iostream>
#include <qapplication.h>
#include <qboxlayout.h>
#include <qcombobox.h>
#include <qcursor.h>
#include <qglobal.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qlocalsocket.h>
#include <qnamespace.h>
#include <qprocess.h>
#include <qwidget.h>
#include <qwindowdefs.h>
#include <QByteArray>
#include <string>
#include <vector>
#define PICTURE_SIZE 256
UIWindow::UIWindow(QWidget* parent, QApplication* qapp) {
UIWindow::UIWindow(QWidget* parent, QApplication* qapp, SingleInstanceManager* ig) {
this->qapp = qapp;
this->screenSelector = new QComboBox(this);
this->extraFlagsInput = new QLineEdit(this);
this->wallpaperEngine = new QProcess(this);
this->instanceGuard = ig;
}
void UIWindow::setupUIWindow(std::vector<std::string> wallpaperPaths) {
@ -67,6 +72,7 @@ void UIWindow::setupUIWindow(std::vector<std::string> wallpaperPaths) {
QAbstractButton::connect(button, &QPushButton::clicked, [button, this]() {
QString clickedPath = button->property("path").toString();
std::cout << clickedPath.toStdString() << "\n";
button->setEnabled(false);
this->selectedWallpapers[this->screenSelector->currentText().toStdString()] = clickedPath.toStdString();
@ -88,6 +94,12 @@ void UIWindow::setupUIWindow(std::vector<std::string> wallpaperPaths) {
QObject::connect(this->qapp, &QCoreApplication::aboutToQuit, this, [this]() {
wallpaperEngine->terminate();
wallpaperEngine->waitForFinished(3000);
instanceGuard->cleanUpServer();
});
QObject::connect(instanceGuard, &SingleInstanceManager::messageReceived, [this](const QByteArray& msg) {
qDebug() << msg;
});
container->setLayout(layout);

View File

@ -1,8 +1,10 @@
#pragma once
#include "Qt/SingleInstanceManager.h"
#include <map>
#include <qapplication.h>
#include <qcombobox.h>
#include <qglobal.h>
#include <qgridlayout.h>
#include <qlineedit.h>
#include <qobjectdefs.h>
@ -28,11 +30,12 @@ class UIWindow : public QWidget {
Q_OBJECT
public:
UIWindow(QWidget* parent, QApplication* qapp);
UIWindow(QWidget* parent, QApplication* qapp, SingleInstanceManager* instanceGuard);
void setupUIWindow(std::vector<std::string> wallpaperPaths);
private:
QApplication* qapp;
SingleInstanceManager* instanceGuard;
QComboBox* screenSelector;
QLineEdit* extraFlagsInput;
std::map<std::string, std::string> selectedWallpapers;