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(LZ4 REQUIRED)
|
||||||
find_package(FFMPEG REQUIRED)
|
find_package(FFMPEG REQUIRED)
|
||||||
find_package(PulseAudio REQUIRED)
|
find_package(PulseAudio REQUIRED)
|
||||||
find_package(Qt5 REQUIRED COMPONENTS Widgets)
|
find_package(Qt5 REQUIRED COMPONENTS Widgets Network)
|
||||||
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
set(CMAKE_AUTORCC ON)
|
set(CMAKE_AUTORCC ON)
|
||||||
@ -214,6 +214,8 @@ add_executable(
|
|||||||
|
|
||||||
src/Qt/UIWindow.h
|
src/Qt/UIWindow.h
|
||||||
src/Qt/UIWindow.cpp
|
src/Qt/UIWindow.cpp
|
||||||
|
src/Qt/SingleInstanceManager.h
|
||||||
|
src/Qt/SingleInstanceManager.cpp
|
||||||
|
|
||||||
src/External/Android/fft.cpp
|
src/External/Android/fft.cpp
|
||||||
src/External/Android/fft.h
|
src/External/Android/fft.h
|
||||||
@ -474,7 +476,8 @@ target_link_libraries (linux-wallpaperengine PUBLIC
|
|||||||
${PULSEAUDIO_LIBRARY}
|
${PULSEAUDIO_LIBRARY}
|
||||||
glfw
|
glfw
|
||||||
libcef_lib libcef_dll_wrapper
|
libcef_lib libcef_dll_wrapper
|
||||||
Qt5::Widgets)
|
Qt5::Widgets
|
||||||
|
Qt5::Network)
|
||||||
|
|
||||||
|
|
||||||
if (WAYLAND_SUPPORT_FOUND)
|
if (WAYLAND_SUPPORT_FOUND)
|
||||||
|
23
main.cpp
23
main.cpp
@ -1,5 +1,6 @@
|
|||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
@ -10,6 +11,7 @@
|
|||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QLocalServer>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <qboxlayout.h>
|
#include <qboxlayout.h>
|
||||||
#include <qcoreapplication.h>
|
#include <qcoreapplication.h>
|
||||||
@ -17,6 +19,7 @@
|
|||||||
#include <qgridlayout.h>
|
#include <qgridlayout.h>
|
||||||
#include <qlabel.h>
|
#include <qlabel.h>
|
||||||
#include <qnamespace.h>
|
#include <qnamespace.h>
|
||||||
|
#include <qobject.h>
|
||||||
#include <qprocess.h>
|
#include <qprocess.h>
|
||||||
#include <qpushbutton.h>
|
#include <qpushbutton.h>
|
||||||
#include <qscrollarea.h>
|
#include <qscrollarea.h>
|
||||||
@ -25,6 +28,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Qt/SingleInstanceManager.h"
|
||||||
#include "Qt/UIWindow.h"
|
#include "Qt/UIWindow.h"
|
||||||
#include "Steam/FileSystem/FileSystem.h"
|
#include "Steam/FileSystem/FileSystem.h"
|
||||||
#include "WallpaperEngine/Application/CApplicationContext.h"
|
#include "WallpaperEngine/Application/CApplicationContext.h"
|
||||||
@ -34,6 +38,8 @@
|
|||||||
|
|
||||||
WallpaperEngine::Application::CWallpaperApplication* appPointer;
|
WallpaperEngine::Application::CWallpaperApplication* appPointer;
|
||||||
QCoreApplication* globalApp = nullptr;
|
QCoreApplication* globalApp = nullptr;
|
||||||
|
SingleInstanceManager* g_instanceManager = nullptr;
|
||||||
|
|
||||||
|
|
||||||
class UIWindow;
|
class UIWindow;
|
||||||
|
|
||||||
@ -41,6 +47,7 @@ void signalhandler(int sig)
|
|||||||
{
|
{
|
||||||
if (appPointer == nullptr) {
|
if (appPointer == nullptr) {
|
||||||
if(globalApp != nullptr) {
|
if(globalApp != nullptr) {
|
||||||
|
if (g_instanceManager) g_instanceManager->cleanUpServer();
|
||||||
globalApp->quit();
|
globalApp->quit();
|
||||||
} else return;
|
} else return;
|
||||||
}
|
}
|
||||||
@ -56,16 +63,14 @@ void initLogging ()
|
|||||||
|
|
||||||
int main (int argc, char* argv[]) {
|
int main (int argc, char* argv[]) {
|
||||||
initLogging ();
|
initLogging ();
|
||||||
bool runGui = false;
|
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
g_instanceManager = new SingleInstanceManager("linux-wallpaperengine");
|
||||||
if(std::strcmp(argv[i], "--gui") == 0) {
|
|
||||||
runGui = true;
|
if (argc <= 1) {
|
||||||
break;
|
if (!g_instanceManager->tryListen()) {
|
||||||
|
std::cout << "App is already running!!!!\n";
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (runGui) {
|
|
||||||
std::string path = Steam::FileSystem::workshopDirectory(431960);
|
std::string path = Steam::FileSystem::workshopDirectory(431960);
|
||||||
|
|
||||||
std::vector<std::string> wallpaperPaths;
|
std::vector<std::string> wallpaperPaths;
|
||||||
@ -81,7 +86,7 @@ int main (int argc, char* argv[]) {
|
|||||||
std::signal (SIGINT, signalhandler);
|
std::signal (SIGINT, signalhandler);
|
||||||
std::signal (SIGTERM, signalhandler);
|
std::signal (SIGTERM, signalhandler);
|
||||||
|
|
||||||
auto* uiWindow = new UIWindow(nullptr, &qapp);
|
auto* uiWindow = new UIWindow(nullptr, &qapp, g_instanceManager);
|
||||||
|
|
||||||
uiWindow->setupUIWindow(wallpaperPaths);
|
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 "UIWindow.h"
|
||||||
|
#include "Qt/SingleInstanceManager.h"
|
||||||
#include <QtConcurrent/qtconcurrentrun.h>
|
#include <QtConcurrent/qtconcurrentrun.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include <qboxlayout.h>
|
#include <qboxlayout.h>
|
||||||
#include <qcombobox.h>
|
#include <qcombobox.h>
|
||||||
#include <qcursor.h>
|
#include <qcursor.h>
|
||||||
|
#include <qglobal.h>
|
||||||
#include <qlabel.h>
|
#include <qlabel.h>
|
||||||
#include <qlineedit.h>
|
#include <qlineedit.h>
|
||||||
|
#include <qlocalsocket.h>
|
||||||
#include <qnamespace.h>
|
#include <qnamespace.h>
|
||||||
#include <qprocess.h>
|
#include <qprocess.h>
|
||||||
#include <qwidget.h>
|
#include <qwidget.h>
|
||||||
#include <qwindowdefs.h>
|
#include <qwindowdefs.h>
|
||||||
|
#include <QByteArray>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#define PICTURE_SIZE 256
|
#define PICTURE_SIZE 256
|
||||||
|
|
||||||
UIWindow::UIWindow(QWidget* parent, QApplication* qapp) {
|
UIWindow::UIWindow(QWidget* parent, QApplication* qapp, SingleInstanceManager* ig) {
|
||||||
this->qapp = qapp;
|
this->qapp = qapp;
|
||||||
this->screenSelector = new QComboBox(this);
|
this->screenSelector = new QComboBox(this);
|
||||||
this->extraFlagsInput = new QLineEdit(this);
|
this->extraFlagsInput = new QLineEdit(this);
|
||||||
this->wallpaperEngine = new QProcess(this);
|
this->wallpaperEngine = new QProcess(this);
|
||||||
|
this->instanceGuard = ig;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIWindow::setupUIWindow(std::vector<std::string> wallpaperPaths) {
|
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]() {
|
QAbstractButton::connect(button, &QPushButton::clicked, [button, this]() {
|
||||||
QString clickedPath = button->property("path").toString();
|
QString clickedPath = button->property("path").toString();
|
||||||
|
std::cout << clickedPath.toStdString() << "\n";
|
||||||
button->setEnabled(false);
|
button->setEnabled(false);
|
||||||
|
|
||||||
this->selectedWallpapers[this->screenSelector->currentText().toStdString()] = clickedPath.toStdString();
|
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]() {
|
QObject::connect(this->qapp, &QCoreApplication::aboutToQuit, this, [this]() {
|
||||||
wallpaperEngine->terminate();
|
wallpaperEngine->terminate();
|
||||||
wallpaperEngine->waitForFinished(3000);
|
wallpaperEngine->waitForFinished(3000);
|
||||||
|
|
||||||
|
instanceGuard->cleanUpServer();
|
||||||
|
});
|
||||||
|
|
||||||
|
QObject::connect(instanceGuard, &SingleInstanceManager::messageReceived, [this](const QByteArray& msg) {
|
||||||
|
qDebug() << msg;
|
||||||
});
|
});
|
||||||
|
|
||||||
container->setLayout(layout);
|
container->setLayout(layout);
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Qt/SingleInstanceManager.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include <qcombobox.h>
|
#include <qcombobox.h>
|
||||||
|
#include <qglobal.h>
|
||||||
#include <qgridlayout.h>
|
#include <qgridlayout.h>
|
||||||
#include <qlineedit.h>
|
#include <qlineedit.h>
|
||||||
#include <qobjectdefs.h>
|
#include <qobjectdefs.h>
|
||||||
@ -28,11 +30,12 @@ class UIWindow : public QWidget {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UIWindow(QWidget* parent, QApplication* qapp);
|
UIWindow(QWidget* parent, QApplication* qapp, SingleInstanceManager* instanceGuard);
|
||||||
void setupUIWindow(std::vector<std::string> wallpaperPaths);
|
void setupUIWindow(std::vector<std::string> wallpaperPaths);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QApplication* qapp;
|
QApplication* qapp;
|
||||||
|
SingleInstanceManager* instanceGuard;
|
||||||
QComboBox* screenSelector;
|
QComboBox* screenSelector;
|
||||||
QLineEdit* extraFlagsInput;
|
QLineEdit* extraFlagsInput;
|
||||||
std::map<std::string, std::string> selectedWallpapers;
|
std::map<std::string, std::string> selectedWallpapers;
|
||||||
|
Loading…
Reference in New Issue
Block a user