From 73932d8999883e6711cfbe4153dda965d6ac428f Mon Sep 17 00:00:00 2001 From: Elias Steurer Date: Fri, 5 Jan 2024 16:51:11 +0100 Subject: [PATCH] Add pid as addition check method if content... ... or the main app is still running --- ScreenPlay/src/screenplaywallpaper.cpp | 11 ++++- ScreenPlay/src/screenplaywidget.cpp | 10 ++++- ScreenPlaySDK/CMakeLists.txt | 5 ++- .../inc/public/ScreenPlaySDK/screenplaysdk.h | 9 ++++ ScreenPlaySDK/src/screenplaysdk.cpp | 27 +++++++++++- .../inc/public/ScreenPlayUtil/exitcodes.h | 23 ++++++++++ .../public/ScreenPlayUtil/processmanager.h | 5 ++- ScreenPlayUtil/src/exitcodes.cpp | 5 +++ ScreenPlayUtil/src/processmanager.cpp | 12 ++++- ScreenPlayWallpaper/main.cpp | 21 +++++++-- ScreenPlayWallpaper/src/basewindow.cpp | 14 ++++++ ScreenPlayWallpaper/src/basewindow.h | 19 ++++---- ScreenPlayWidget/main.cpp | 44 +++++++++++-------- ScreenPlayWidget/src/widgetwindow.cpp | 19 +++++++- ScreenPlayWidget/src/widgetwindow.h | 10 +++++ 15 files changed, 191 insertions(+), 43 deletions(-) diff --git a/ScreenPlay/src/screenplaywallpaper.cpp b/ScreenPlay/src/screenplaywallpaper.cpp index 8543bd3e..0f312b02 100644 --- a/ScreenPlay/src/screenplaywallpaper.cpp +++ b/ScreenPlay/src/screenplaywallpaper.cpp @@ -92,7 +92,8 @@ ScreenPlayWallpaper::ScreenPlayWallpaper( "--volume", QString::number(static_cast(volume)), "--fillmode", QVariant::fromValue(fillMode).toString(), "--type", QVariant::fromValue(type).toString(), - "--check", QString::number(m_settings->checkWallpaperVisible()) + "--check", QString::number(m_settings->checkWallpaperVisible()), + "--mainapppid", QString::number(m_processManager.getCurrentPID()) }; // Fixes issue 84 media key overlay in Qt apps @@ -262,6 +263,14 @@ void ScreenPlayWallpaper::setSDKConnection(std::unique_ptr connec QObject::connect(m_connection.get(), &SDKConnection::pingAliveReceived, this, [this]() { m_pingAliveTimer.stop(); m_pingAliveTimer.start(GlobalVariables::contentPingAliveIntervalMS); + + std::optional running = m_processManager.isRunning(m_processID); + + if (running.has_value()) { + qInfo() << "running:" << running.value(); + } else { + qInfo() << "INVALID PID:" << m_processID; + } }); } diff --git a/ScreenPlay/src/screenplaywidget.cpp b/ScreenPlay/src/screenplaywidget.cpp index 1bda7b0f..f2b98180 100644 --- a/ScreenPlay/src/screenplaywidget.cpp +++ b/ScreenPlay/src/screenplaywidget.cpp @@ -56,8 +56,7 @@ ScreenPlayWidget::ScreenPlayWidget( QString::number(m_position.x()), "--posY", QString::number(m_position.y()), - "--debug", - "--false", + "--mainapppid", QString::number(m_processManager.getCurrentPID()) }; } @@ -113,6 +112,13 @@ void ScreenPlayWidget::setSDKConnection(std::unique_ptr connectio QObject::connect(m_connection.get(), &SDKConnection::pingAliveReceived, this, [this]() { m_pingAliveTimer.stop(); m_pingAliveTimer.start(GlobalVariables::contentPingAliveIntervalMS); + std::optional running = m_processManager.isRunning(m_processID); + + if (running.has_value()) { + qInfo() << "running:" << running.value(); + } else { + qInfo() << "INVALID PID:" << m_processID; + } }); QObject::connect(&m_pingAliveTimer, &QTimer::timeout, this, [this]() { diff --git a/ScreenPlaySDK/CMakeLists.txt b/ScreenPlaySDK/CMakeLists.txt index 4cf4e740..df45410b 100644 --- a/ScreenPlaySDK/CMakeLists.txt +++ b/ScreenPlaySDK/CMakeLists.txt @@ -20,7 +20,8 @@ target_include_directories(${PROJECT_NAME} PUBLIC inc/public/) target_link_libraries( ${PROJECT_NAME} - PRIVATE Qt6::Core + PUBLIC Qt6::Core Qt6::Quick Qt6::Gui - Qt6::Network) + Qt6::Network + ScreenPlayUtil) diff --git a/ScreenPlaySDK/inc/public/ScreenPlaySDK/screenplaysdk.h b/ScreenPlaySDK/inc/public/ScreenPlaySDK/screenplaysdk.h index 3631f9df..5c469c7b 100644 --- a/ScreenPlaySDK/inc/public/ScreenPlaySDK/screenplaysdk.h +++ b/ScreenPlaySDK/inc/public/ScreenPlaySDK/screenplaysdk.h @@ -2,6 +2,7 @@ #pragma once +#include "ScreenPlayUtil/processmanager.h" #include #include #include @@ -26,11 +27,15 @@ public: Q_PROPERTY(QString type READ type WRITE setType NOTIFY typeChanged) Q_PROPERTY(bool isConnected READ isConnected WRITE setIsConnected NOTIFY isConnectedChanged) Q_PROPERTY(QString appID READ appID WRITE setAppID NOTIFY appIDChanged) + Q_PROPERTY(qint64 mainAppPID READ mainAppPID WRITE setMainAppPID NOTIFY mainAppPIDChanged FINAL) QString type() const { return m_type; } bool isConnected() const { return m_isConnected; } QString appID() const { return m_appID; } + qint64 mainAppPID() const; + void setMainAppPID(qint64 mainAppPID); + public slots: void sendMessage(const QJsonObject& obj); void connected(); @@ -91,6 +96,8 @@ signals: const QString type, const bool checkWallpaperVisible); + void mainAppPIDChanged(qint64 mainAppPID); + private: QLocalSocket m_socket; @@ -99,4 +106,6 @@ private: QString m_appID; QTimer m_pingAliveTimer; + qint64 m_mainAppPID { 0 }; + ScreenPlay::ProcessManager m_processManager; }; diff --git a/ScreenPlaySDK/src/screenplaysdk.cpp b/ScreenPlaySDK/src/screenplaysdk.cpp index 1847890e..4a03cc23 100644 --- a/ScreenPlaySDK/src/screenplaysdk.cpp +++ b/ScreenPlaySDK/src/screenplaysdk.cpp @@ -33,7 +33,7 @@ void ScreenPlaySDK::start() connect(&m_socket, &QLocalSocket::disconnected, this, &ScreenPlaySDK::disconnected); connect(&m_socket, &QLocalSocket::readyRead, this, &ScreenPlaySDK::readyRead); connect(&m_socket, &QLocalSocket::errorOccurred, this, [this]() { - emit disconnected(); + disconnected(); }); m_socket.connectToServer("ScreenPlay"); @@ -59,7 +59,7 @@ void ScreenPlaySDK::connected() if (m_appID.isEmpty() || m_type.isEmpty()) { qCritical() << "Unable to connect with empyt: " << m_appID << m_type; - emit disconnected(); + disconnected(); return; } @@ -169,6 +169,16 @@ void ScreenPlaySDK::pingAlive() qInfo() << "Cannot ping to main application. Closing!"; emit sdkDisconnected(); } + + // Check if a PID is set first + if (m_mainAppPID != 0) { + std::optional running = m_processManager.isRunning(m_mainAppPID); + if (running.has_value()) { + if (running.value()) + return; + } + emit sdkDisconnected(); + } } void ScreenPlaySDK::ScreenPlaySDK::redirectMessageOutputToMainWindow(QtMsgType type, const QMessageLogContext& context, const QString& msg) @@ -204,3 +214,16 @@ void ScreenPlaySDK::ScreenPlaySDK::redirectMessageOutputToMainWindow(QtMsgType t break; } } + +qint64 ScreenPlaySDK::mainAppPID() const +{ + return m_mainAppPID; +} + +void ScreenPlaySDK::setMainAppPID(qint64 mainAppPID) +{ + if (m_mainAppPID == mainAppPID) + return; + m_mainAppPID = mainAppPID; + emit mainAppPIDChanged(m_mainAppPID); +} diff --git a/ScreenPlayUtil/inc/public/ScreenPlayUtil/exitcodes.h b/ScreenPlayUtil/inc/public/ScreenPlayUtil/exitcodes.h index 572ec041..8fc1cb86 100644 --- a/ScreenPlayUtil/inc/public/ScreenPlayUtil/exitcodes.h +++ b/ScreenPlayUtil/inc/public/ScreenPlayUtil/exitcodes.h @@ -21,8 +21,31 @@ public: Invalid_AppID, Invalid_Setup_ProjectParsingError, Invalid_Setup_Error, + Invalid_PID, Invalid_Start_Windows_HandleError, }; Q_ENUM(Code) }; + +class WidgetExit : public QObject { + Q_OBJECT + QML_ELEMENT + Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") +public: + WidgetExit(QObject* parent = nullptr); + enum class Code { + Ok = 0, + Invalid_ArgumentSize, + Invalid_Path, + Invalid_InstalledType, + Invalid_POSX, + Invalid_POSY, + Invalid_DEBUG, + Invalid_AppID, + Invalid_Setup_ProjectParsingError, + Invalid_Setup_Error, + Invalid_PID, + }; + Q_ENUM(Code) +}; } diff --git a/ScreenPlayUtil/inc/public/ScreenPlayUtil/processmanager.h b/ScreenPlayUtil/inc/public/ScreenPlayUtil/processmanager.h index 2afaa81d..568ab130 100644 --- a/ScreenPlayUtil/inc/public/ScreenPlayUtil/processmanager.h +++ b/ScreenPlayUtil/inc/public/ScreenPlayUtil/processmanager.h @@ -15,7 +15,8 @@ namespace ScreenPlay { class ProcessManager { public: - std::optional isRunning(const qint64 pid); - bool terminateProcess(const qint64 pid); + std::optional isRunning(const qint64 pid) const; + bool terminateProcess(const qint64 pid) const; + const qint64 getCurrentPID() const; }; } diff --git a/ScreenPlayUtil/src/exitcodes.cpp b/ScreenPlayUtil/src/exitcodes.cpp index ec9c5ff5..1fbb7f11 100644 --- a/ScreenPlayUtil/src/exitcodes.cpp +++ b/ScreenPlayUtil/src/exitcodes.cpp @@ -6,4 +6,9 @@ WallpaperExit::WallpaperExit(QObject* parent) : QObject(parent) { } + +WidgetExit::WidgetExit(QObject* parent) +{ +} + } diff --git a/ScreenPlayUtil/src/processmanager.cpp b/ScreenPlayUtil/src/processmanager.cpp index 7e532514..f40e6fef 100644 --- a/ScreenPlayUtil/src/processmanager.cpp +++ b/ScreenPlayUtil/src/processmanager.cpp @@ -1,7 +1,7 @@ #include "processmanager.h" namespace ScreenPlay { -std::optional ProcessManager::isRunning(const qint64 pid) +std::optional ProcessManager::isRunning(const qint64 pid) const { if (pid <= 0) return std::nullopt; @@ -25,7 +25,7 @@ std::optional ProcessManager::isRunning(const qint64 pid) #endif return std::nullopt; } -bool ProcessManager::terminateProcess(const qint64 pid) +bool ProcessManager::terminateProcess(const qint64 pid) const { if (pid <= 0) return false; @@ -53,4 +53,12 @@ bool ProcessManager::terminateProcess(const qint64 pid) #endif } +const qint64 ProcessManager::getCurrentPID() const +{ +#if defined(Q_OS_WIN) + return static_cast(GetCurrentProcessId()); +#elif defined(Q_OS_LINUX) || defined(Q_OS_MAC) + return static_cast(getpid()); +#endif +} } diff --git a/ScreenPlayWallpaper/main.cpp b/ScreenPlayWallpaper/main.cpp index 52a644b4..8327ff4f 100644 --- a/ScreenPlayWallpaper/main.cpp +++ b/ScreenPlayWallpaper/main.cpp @@ -28,7 +28,6 @@ Q_IMPORT_QML_PLUGIN(ScreenPlayUtilPlugin) int main(int argc, char* argv[]) { using namespace ScreenPlay; - // Lets keep using it until: https://bugreports.qt.io/browse/QTBUG-109401 QtWebEngineQuick::initialize(); #if defined(Q_OS_WIN) @@ -83,7 +82,8 @@ int main(int argc, char* argv[]) "--volume", "1", "--fillmode", "Contain", "--type", "VideoWallpaper", - "--check", "0" }); + "--check", "0", + "--mainapppid", "1" }); } else { argumentList = app.arguments(); } @@ -100,6 +100,7 @@ int main(int argc, char* argv[]) QCommandLineOption fillmodeOption("fillmode", "Set fill mode.", "fillmode"); QCommandLineOption typeOption("type", "Set the type.", "type"); QCommandLineOption checkOption("check", "Set check value.", "check"); + QCommandLineOption mainAppPidOption("mainapppid", "pid of the main ScreenPlay app. User to check if we are still alive.", "mainapppid"); // Add the options to the parser parser.addOption(pathOption); @@ -109,6 +110,7 @@ int main(int argc, char* argv[]) parser.addOption(fillmodeOption); parser.addOption(typeOption); parser.addOption(checkOption); + parser.addOption(mainAppPidOption); // Process the actual command line arguments given by the user parser.process(argumentList); @@ -120,7 +122,8 @@ int main(int argc, char* argv[]) || !parser.isSet(volumeOption) || !parser.isSet(fillmodeOption) || !parser.isSet(typeOption) - || !parser.isSet(checkOption)) { + || !parser.isSet(checkOption) + || !parser.isSet(mainAppPidOption)) { qCritical() << "Missing required arguments. Please provide all arguments." << argumentList << "pathOption" << parser.value(pathOption) @@ -129,7 +132,8 @@ int main(int argc, char* argv[]) << "volumeOption" << parser.value(volumeOption) << "fillmodeOption" << parser.value(fillmodeOption) << "typeOption" << parser.value(typeOption) - << "checkOption" << parser.value(checkOption); + << "checkOption" << parser.value(checkOption) + << "mainAppPidOption" << parser.value(mainAppPidOption); return -1; } @@ -140,6 +144,7 @@ int main(int argc, char* argv[]) QString fillmode = parser.value(fillmodeOption); QString type = parser.value(typeOption); QString check = parser.value(checkOption); + QString pid = parser.value(mainAppPidOption); ScreenPlay::Util util; @@ -169,6 +174,13 @@ int main(int argc, char* argv[]) return static_cast(WallpaperExit::Code::Invalid_Volume); } + bool okPid = false; + const qint64 mainAppPidInt = pid.toInt(&okPid); + if (!okPid) { + qCritical("Could not parse mainAppPid"); + return static_cast(WallpaperExit::Code::Invalid_PID); + } + // Set the properties of the window object window->setActiveScreensList(activeScreensList.value()); window->setProjectPath(path); @@ -178,6 +190,7 @@ int main(int argc, char* argv[]) window->setType(installedType.value()); window->setCheckWallpaperVisible(checkWallpaperVisible); window->setDebugMode(false); + window->setMainAppPID(mainAppPidInt); const auto setupStatus = window->setup(); if (setupStatus != WallpaperExit::Code::Ok) { diff --git a/ScreenPlayWallpaper/src/basewindow.cpp b/ScreenPlayWallpaper/src/basewindow.cpp index 0560f377..50e22676 100644 --- a/ScreenPlayWallpaper/src/basewindow.cpp +++ b/ScreenPlayWallpaper/src/basewindow.cpp @@ -64,6 +64,7 @@ WallpaperExit::Code BaseWindow::setup() // directly without an running ScreenPlay if (!debugMode()) { m_sdk = std::make_unique(appID(), QVariant::fromValue(type()).toString()); + m_sdk->setMainAppPID(m_mainAppPID); connect(m_sdk.get(), &ScreenPlaySDK::incommingMessage, this, &BaseWindow::messageReceived); connect(m_sdk.get(), &ScreenPlaySDK::replaceWallpaper, this, &BaseWindow::replaceWallpaper); sdk()->start(); @@ -241,6 +242,19 @@ void BaseWindow::setVideoCodec(ScreenPlay::Video::VideoCodec newVideoCodec) m_videoCodec = newVideoCodec; emit videoCodecChanged(newVideoCodec); } + +qint64 BaseWindow::mainAppPID() const +{ + return m_mainAppPID; +} + +void BaseWindow::setMainAppPID(qint64 mainAppPID) +{ + if (m_mainAppPID == mainAppPID) + return; + m_mainAppPID = mainAppPID; + emit mainAppPIDChanged(m_mainAppPID); +} } #include "moc_basewindow.cpp" diff --git a/ScreenPlayWallpaper/src/basewindow.h b/ScreenPlayWallpaper/src/basewindow.h index 0db1c384..39c5d690 100644 --- a/ScreenPlayWallpaper/src/basewindow.h +++ b/ScreenPlayWallpaper/src/basewindow.h @@ -15,6 +15,7 @@ #include "ScreenPlaySDK/screenplaysdk.h" #include "ScreenPlayUtil/exitcodes.h" +#include "ScreenPlayUtil/processmanager.h" #include "ScreenPlayUtil/util.h" #include @@ -29,36 +30,29 @@ public: virtual WallpaperExit::Code setup() final; virtual WallpaperExit::Code start() = 0; - + Q_PROPERTY(qint64 mainAppPID READ mainAppPID WRITE setMainAppPID NOTIFY mainAppPIDChanged FINAL) Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged) Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged) Q_PROPERTY(QVector activeScreensList READ activeScreensList WRITE setActiveScreensList NOTIFY activeScreensListChanged) - Q_PROPERTY(QString appID READ appID WRITE setAppID NOTIFY appIDChanged) Q_PROPERTY(QString fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged) - Q_PROPERTY(QString projectPath READ projectPath WRITE setProjectPath NOTIFY projectPathChanged) Q_PROPERTY(QString projectSourceFile READ projectSourceFile WRITE setProjectSourceFile NOTIFY projectSourceFileChanged) Q_PROPERTY(QUrl projectSourceFileAbsolute READ projectSourceFileAbsolute WRITE setProjectSourceFileAbsolute NOTIFY projectSourceFileAbsoluteChanged) - Q_PROPERTY(bool loops READ loops WRITE setLoops NOTIFY loopsChanged) Q_PROPERTY(bool isPlaying READ isPlaying WRITE setIsPlaying NOTIFY isPlayingChanged) Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool canFade READ canFade WRITE setCanFade NOTIFY canFadeChanged) Q_PROPERTY(bool debugMode READ debugMode WRITE setDebugMode NOTIFY debugModeChanged) - // Save performance by checking if the wallpaper is visible (video wallpaper only for now) Q_PROPERTY(bool checkWallpaperVisible READ checkWallpaperVisible WRITE setCheckWallpaperVisible NOTIFY checkWallpaperVisibleChanged) Q_PROPERTY(bool visualsPaused READ visualsPaused WRITE setVisualsPaused NOTIFY visualsPausedChanged) - Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(float playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(float currentTime READ currentTime WRITE setCurrentTime NOTIFY currentTimeChanged) - Q_PROPERTY(ScreenPlay::ContentTypes::InstalledType type READ type WRITE setType NOTIFY typeChanged) Q_PROPERTY(ScreenPlay::Video::VideoCodec videoCodec READ videoCodec WRITE setVideoCodec NOTIFY videoCodecChanged) Q_PROPERTY(QString OSVersion READ OSVersion WRITE setOSVersion NOTIFY OSVersionChanged) - Q_PROPERTY(ScreenPlaySDK* sdk READ sdk WRITE setSdk NOTIFY sdkChanged) bool loops() const { return m_loops; } @@ -86,6 +80,9 @@ public: ScreenPlay::Video::VideoCodec videoCodec() const; void setVideoCodec(ScreenPlay::Video::VideoCodec newVideoCodec); + qint64 mainAppPID() const; + void setMainAppPID(qint64 mainAppPID); + signals: void qmlStart(); void qmlExit(); @@ -118,6 +115,8 @@ signals: void projectSourceFileAbsoluteChanged(const QUrl& rojectSourceFileAbsolute); void videoCodecChanged(ScreenPlay::Video::VideoCodec codec); + void mainAppPIDChanged(qint64 mainAppPID); + public slots: void requestFadeIn(); virtual void destroyThis() { } @@ -348,7 +347,9 @@ protected: int m_width { 0 }; int m_height { 0 }; + qint64 m_mainAppPID { 0 }; + ProcessManager m_processManager; ScreenPlay::ContentTypes::InstalledType m_type = ScreenPlay::ContentTypes::InstalledType::Unknown; QVector m_activeScreensList; QFileSystemWatcher m_fileSystemWatcher; @@ -358,4 +359,4 @@ protected: QUrl m_projectSourceFileAbsolute; ScreenPlay::Video::VideoCodec m_videoCodec = ScreenPlay::Video::VideoCodec::Unknown; }; -} \ No newline at end of file +} diff --git a/ScreenPlayWidget/main.cpp b/ScreenPlayWidget/main.cpp index 7c92f078..3ca48813 100644 --- a/ScreenPlayWidget/main.cpp +++ b/ScreenPlayWidget/main.cpp @@ -9,6 +9,7 @@ #include #include "ScreenPlayUtil/contenttypes.h" +#include "ScreenPlayUtil/exitcodes.h" #include "ScreenPlayUtil/logginghandler.h" #include "src/widgetwindow.h" @@ -25,6 +26,7 @@ Q_IMPORT_QML_PLUGIN(ScreenPlayUtilPlugin) int main(int argc, char* argv[]) { + using namespace ScreenPlay; // Lets keep using it until: https://bugreports.qt.io/browse/QTBUG-109401 QtWebEngineQuick::initialize(); @@ -73,7 +75,7 @@ int main(int argc, char* argv[]) "--type", type, "--posX", QString::number(center.x()), "--posY", QString::number(center.y()), - "--debug", "1" }); + "--mainapppid", "1" }); } else { argumentList = app.arguments(); } @@ -86,63 +88,69 @@ int main(int argc, char* argv[]) QCommandLineOption typeOption("type", "Content type", "type"); QCommandLineOption posXOption("posX", "X position", "positionX"); QCommandLineOption posYOption("posY", "Y position", "positionY"); - QCommandLineOption debugOption("debug", "debug enabled", "debug"); + QCommandLineOption mainAppPidOption("mainapppid", "pid of the main ScreenPlay app. User to check if we are still alive.", "mainapppid"); + // Add the options to the parser parser.addOption(pathOption); parser.addOption(appIDOption); parser.addOption(typeOption); parser.addOption(posXOption); parser.addOption(posYOption); - parser.addOption(debugOption); + parser.addOption(mainAppPidOption); + // Process the actual command line arguments given by the user parser.process(argumentList); // Check if all required options are provided - // debug option is optional if (!parser.isSet(pathOption) || !parser.isSet(appIDOption) || !parser.isSet(typeOption) || !parser.isSet(posXOption) - || !parser.isSet(posYOption)) { + || !parser.isSet(posYOption) + || !parser.isSet(mainAppPidOption)) { qCritical() << "Missing required arguments. Please provide all arguments." << argumentList << "pathOption" << parser.value(pathOption) << "appIDOption" << parser.value(appIDOption) << "typeOption" << parser.value(typeOption) << "posXOption" << parser.value(posXOption) - << "posYOption" << parser.value(posYOption); - return -1; + << "posYOption" << parser.value(posYOption) + << "mainAppPidOption" << parser.value(mainAppPidOption); + return static_cast(WidgetExit::Code::Invalid_ArgumentSize); } + QString pid = parser.value(mainAppPidOption); + QString appID = parser.value(appIDOption); + QString projectPath = parser.value(pathOption); + QString type = parser.value(typeOption); + bool okPosX = false, okPosY = false; const int positionX = parser.value(posXOption).toInt(&okPosX); if (!okPosX) { qWarning() << "Could not parse PositionX value to int: " << parser.value(posXOption); - return -1; + return static_cast(WidgetExit::Code::Invalid_POSX); } const int positionY = parser.value(posYOption).toInt(&okPosY); if (!okPosY) { qWarning() << "Could not parse PositionY value to int: " << parser.value(posYOption); - return -1; + return static_cast(WidgetExit::Code::Invalid_POSY); } - bool debugOk = false; - const int debug = parser.value(debugOption).toInt(&debugOk); - if (!debugOk) { - qWarning() << "Could not parse debugOk value to bool: " << parser.value(posYOption); + bool okPid = false; + const qint64 mainAppPidInt = pid.toInt(&okPid); + if (!okPid) { + qCritical("Could not parse mainAppPid"); + return static_cast(WidgetExit::Code::Invalid_PID); } - QString appID = parser.value(appIDOption); - QString projectPath = parser.value(pathOption); - QString type = parser.value(typeOption); - WidgetWindow spwmw( projectPath, appID, type, QPoint { positionX, positionY }, - debug); + mainAppPidInt, + false); #if defined(Q_OS_MACOS) MacUtils::showDockIcon(false); diff --git a/ScreenPlayWidget/src/widgetwindow.cpp b/ScreenPlayWidget/src/widgetwindow.cpp index 7a7d9bab..f53aed6e 100644 --- a/ScreenPlayWidget/src/widgetwindow.cpp +++ b/ScreenPlayWidget/src/widgetwindow.cpp @@ -6,8 +6,10 @@ #include #include "ScreenPlayUtil/contenttypes.h" +#include "ScreenPlayUtil/processmanager.h" #include "ScreenPlayUtil/util.h" +namespace ScreenPlay { /*! \module ScreenPlayWidget \title ScreenPlayWidget @@ -25,13 +27,14 @@ WidgetWindow::WidgetWindow( const QString& appID, const QString& type, const QPoint& position, + const qint64 mainAppPID, const bool debugMode) : QObject(nullptr) , m_appID { appID } , m_position { position } - , m_sdk { std::make_unique(appID, type) } , m_debugMode { debugMode } { + setMainAppPID(mainAppPID); Qt::WindowFlags flags = m_window.flags(); if (QSysInfo::productType() == "macos") { // Setting it as a SlashScreen causes the window to hide on focus lost @@ -80,6 +83,8 @@ WidgetWindow::WidgetWindow( // Debug mode means we directly start the ScreenPlayWallpaper for easy debugging. // This means we do not have a running ScreenPlay instance to connect to. if (!m_debugMode) { + m_sdk = std::make_unique(appID, type); + m_sdk->setMainAppPID(mainAppPID); QObject::connect(m_sdk.get(), &ScreenPlaySDK::sdkDisconnected, this, &WidgetWindow::qmlExit); QObject::connect(m_sdk.get(), &ScreenPlaySDK::incommingMessage, this, &WidgetWindow::messageReceived); sdk()->start(); @@ -217,5 +222,17 @@ void WidgetWindow::setupLiveReloading() m_fileSystemWatcher.addPath(projectFilesIter.next()); } } +qint64 WidgetWindow::mainAppPID() const +{ + return m_mainAppPID; +} +void WidgetWindow::setMainAppPID(qint64 mainAppPID) +{ + if (m_mainAppPID == mainAppPID) + return; + m_mainAppPID = mainAppPID; + emit mainAppPIDChanged(m_mainAppPID); +} +} #include "moc_widgetwindow.cpp" diff --git a/ScreenPlayWidget/src/widgetwindow.h b/ScreenPlayWidget/src/widgetwindow.h index d987fbe3..ad8bf038 100644 --- a/ScreenPlayWidget/src/widgetwindow.h +++ b/ScreenPlayWidget/src/widgetwindow.h @@ -27,6 +27,7 @@ #include "ScreenPlayUtil/util.h" #include +namespace ScreenPlay { class WidgetWindow : public QObject { Q_OBJECT @@ -36,8 +37,10 @@ public: const QString& appid, const QString& type, const QPoint& position, + const qint64 mainAppPID, const bool debugMode = false); + Q_PROPERTY(qint64 mainAppPID READ mainAppPID WRITE setMainAppPID NOTIFY mainAppPIDChanged FINAL) Q_PROPERTY(QString appID READ appID WRITE setAppID NOTIFY appIDChanged) Q_PROPERTY(QString projectPath READ projectPath WRITE setProjectPath NOTIFY projectPathChanged) Q_PROPERTY(QString projectSourceFile READ projectSourceFile WRITE setProjectSourceFile NOTIFY projectSourceFileChanged) @@ -56,6 +59,9 @@ public: ScreenPlaySDK* sdk() const { return m_sdk.get(); } bool debugMode() const { return m_debugMode; } + qint64 mainAppPID() const; + void setMainAppPID(qint64 mainAppPID); + signals: void qmlExit(); void reloadQML(const ScreenPlay::ContentTypes::InstalledType oldType); @@ -69,6 +75,8 @@ signals: void sdkChanged(ScreenPlaySDK* sdk); void debugModeChanged(bool debugMode); + void mainAppPIDChanged(qint64 mainAppPID); + public slots: void setSize(QSize size); void destroyThis(); @@ -155,6 +163,7 @@ private: void setupLiveReloading(); private: + qint64 m_mainAppPID { 0 }; QString m_appID; QString m_projectPath; QString m_projectSourceFile; @@ -174,3 +183,4 @@ private: #endif bool m_debugMode = false; }; +}