mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-09-14 13:56:48 +08:00
Added SingleInstanceManager
This commit is contained in:
parent
9fb4facfb3
commit
cc669ac2cd
@ -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)
|
||||
|
23
main.cpp
23
main.cpp
@ -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);
|
||||
|
||||
|
32
src/Qt/SingleInstanceManager.cpp
Normal file
32
src/Qt/SingleInstanceManager.cpp
Normal 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;
|
||||
}
|
27
src/Qt/SingleInstanceManager.h
Normal file
27
src/Qt/SingleInstanceManager.h
Normal 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;
|
||||
};
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user