mirror of
https://gitlab.com/kelteseth/ScreenPlay.git
synced 2024-11-06 19:12:30 +01:00
Remove old KDE implementation
This commit is contained in:
parent
0596499e8e
commit
78caa35f89
@ -43,7 +43,7 @@
|
|||||||
- cd ..
|
- cd ..
|
||||||
- cd ..
|
- cd ..
|
||||||
image:
|
image:
|
||||||
name: ubuntu:23.10
|
name: ubuntu:22.04
|
||||||
tags:
|
tags:
|
||||||
- gitlab-org-docker
|
- gitlab-org-docker
|
||||||
artifacts:
|
artifacts:
|
||||||
|
@ -74,11 +74,11 @@ Here are some ways you can contribute:
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
| Feature | Windows | Linux | MacOS |
|
| Feature | Windows | Linux X11 and Wayland (layer shell) | MacOS |
|
||||||
|------------------------ |--------- |------- |------- |
|
|------------------------ |--------- |------- |------- |
|
||||||
| __ScreenPlay Main App__ | ✔ | ✔ | ✔ |
|
| __ScreenPlay Main App__ | ✔ | ✔ | ✔ |
|
||||||
| __Steam Binaries__ | ✔ | ❌ | ✔ |
|
| __Steam Binaries__ | ✔ | ❌ | ✔ |
|
||||||
| __Wallpaper__ | ✔ | ❓ Help Needed for Gnome/KDE/etc! | ✔ |
|
| __Wallpaper__ | ✔ | ✔ | ✔ |
|
||||||
| __Widgets__ | ✔ | ✔ | ✔ |
|
| __Widgets__ | ✔ | ✔ | ✔ |
|
||||||
| __Multilanguage (EN,DE,RU,FR,ES,KO,VI,CH_ZN,PT_BR🆕)__ | ✔ | ✔ | ✔ |
|
| __Multilanguage (EN,DE,RU,FR,ES,KO,VI,CH_ZN,PT_BR🆕)__ | ✔ | ✔ | ✔ |
|
||||||
|
|
||||||
|
@ -101,13 +101,6 @@ public slots:
|
|||||||
void setMainWindowEngine(QQmlApplicationEngine* mainWindowEngine);
|
void setMainWindowEngine(QQmlApplicationEngine* mainWindowEngine);
|
||||||
void setWizards(Wizards* wizards);
|
void setWizards(Wizards* wizards);
|
||||||
|
|
||||||
private:
|
|
||||||
bool setupKDE();
|
|
||||||
bool isKDEInstalled();
|
|
||||||
void installKDEWallpaper();
|
|
||||||
void upgradeKDEWallpaper();
|
|
||||||
void restartKDE();
|
|
||||||
std::optional<bool> isNewestKDEWallpaperInstalled();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QNetworkAccessManager m_networkAccessManager;
|
QNetworkAccessManager m_networkAccessManager;
|
||||||
@ -126,8 +119,5 @@ private:
|
|||||||
std::shared_ptr<MonitorListModel> m_monitorListModel;
|
std::shared_ptr<MonitorListModel> m_monitorListModel;
|
||||||
std::shared_ptr<ProfileListModel> m_profileListModel;
|
std::shared_ptr<ProfileListModel> m_profileListModel;
|
||||||
std::shared_ptr<InstalledListFilter> m_installedListFilter;
|
std::shared_ptr<InstalledListFilter> m_installedListFilter;
|
||||||
|
|
||||||
QString m_kdeWallpaperPath;
|
|
||||||
QString m_appKdeWallapperPath;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ class ScreenPlayManager : public QObject {
|
|||||||
|
|
||||||
Q_PROPERTY(int activeWallpaperCounter READ activeWallpaperCounter WRITE setActiveWallpaperCounter NOTIFY activeWallpaperCounterChanged)
|
Q_PROPERTY(int activeWallpaperCounter READ activeWallpaperCounter WRITE setActiveWallpaperCounter NOTIFY activeWallpaperCounterChanged)
|
||||||
Q_PROPERTY(int activeWidgetsCounter READ activeWidgetsCounter WRITE setActiveWidgetsCounter NOTIFY activeWidgetsCounterChanged)
|
Q_PROPERTY(int activeWidgetsCounter READ activeWidgetsCounter WRITE setActiveWidgetsCounter NOTIFY activeWidgetsCounterChanged)
|
||||||
Q_PROPERTY(bool isKDEConnected READ isKDEConnected WRITE setIsKDEConnected NOTIFY isKDEConnectedChanged)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ScreenPlayManager(QObject* parent = nullptr);
|
explicit ScreenPlayManager(QObject* parent = nullptr);
|
||||||
@ -41,8 +40,6 @@ public:
|
|||||||
int activeWidgetsCounter() const { return m_activeWidgetsCounter; }
|
int activeWidgetsCounter() const { return m_activeWidgetsCounter; }
|
||||||
bool isAnotherScreenPlayInstanceRunning() { return m_isAnotherScreenPlayInstanceRunning; }
|
bool isAnotherScreenPlayInstanceRunning() { return m_isAnotherScreenPlayInstanceRunning; }
|
||||||
|
|
||||||
bool isKDEConnected() const;
|
|
||||||
void setIsKDEConnected(bool isKDEConnected);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void activeWallpaperCounterChanged(int activeWallpaperCounter);
|
void activeWallpaperCounterChanged(int activeWallpaperCounter);
|
||||||
@ -55,8 +52,6 @@ signals:
|
|||||||
void profilesSaved();
|
void profilesSaved();
|
||||||
void displayErrorPopup(const QString& msg);
|
void displayErrorPopup(const QString& msg);
|
||||||
|
|
||||||
void isKDEConnectedChanged(bool isKDEConnected);
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
bool saveProfiles();
|
bool saveProfiles();
|
||||||
|
|
||||||
@ -168,7 +163,6 @@ private:
|
|||||||
QTimer m_saveLimiter;
|
QTimer m_saveLimiter;
|
||||||
|
|
||||||
const quint16 m_webSocketPort = 16395;
|
const quint16 m_webSocketPort = 16395;
|
||||||
bool m_isKDEConnected = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,6 @@ signals:
|
|||||||
void volumeChanged(float volume);
|
void volumeChanged(float volume);
|
||||||
void isLoopingChanged(bool isLooping);
|
void isLoopingChanged(bool isLooping);
|
||||||
void playbackRateChanged(float playbackRate);
|
void playbackRateChanged(float playbackRate);
|
||||||
void messageKDECloseWallpaper();
|
|
||||||
|
|
||||||
void requestSave();
|
void requestSave();
|
||||||
void requestClose(const QString& appID);
|
void requestClose(const QString& appID);
|
||||||
|
@ -72,6 +72,7 @@ public:
|
|||||||
Unknown,
|
Unknown,
|
||||||
OSX,
|
OSX,
|
||||||
Windows,
|
Windows,
|
||||||
|
Wayland,
|
||||||
Cinnamon,
|
Cinnamon,
|
||||||
Enlightenment,
|
Enlightenment,
|
||||||
Gnome,
|
Gnome,
|
||||||
|
@ -200,10 +200,6 @@ void App::init()
|
|||||||
m_mainWindowEngine->addImportPath(guiAppInst->applicationDirPath() + "/qml");
|
m_mainWindowEngine->addImportPath(guiAppInst->applicationDirPath() + "/qml");
|
||||||
guiAppInst->addLibraryPath(guiAppInst->applicationDirPath() + "/qml");
|
guiAppInst->addLibraryPath(guiAppInst->applicationDirPath() + "/qml");
|
||||||
|
|
||||||
if (m_settings->desktopEnvironment() == Settings::DesktopEnvironment::KDE) {
|
|
||||||
setupKDE();
|
|
||||||
}
|
|
||||||
|
|
||||||
QQuickStyle::setStyle("Material");
|
QQuickStyle::setStyle("Material");
|
||||||
m_mainWindowEngine->load(QUrl(QStringLiteral("qrc:/qml/ScreenPlayApp/main.qml")));
|
m_mainWindowEngine->load(QUrl(QStringLiteral("qrc:/qml/ScreenPlayApp/main.qml")));
|
||||||
|
|
||||||
@ -229,112 +225,6 @@ void App::exit()
|
|||||||
guiAppInst->quit();
|
guiAppInst->quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool App::isKDEInstalled()
|
|
||||||
{
|
|
||||||
QProcess plasmaShellVersionProcess;
|
|
||||||
plasmaShellVersionProcess.start("plasmashell", { "--version" });
|
|
||||||
plasmaShellVersionProcess.waitForFinished();
|
|
||||||
QString versionOut = plasmaShellVersionProcess.readAll();
|
|
||||||
if (!versionOut.contains("plasmashell ")) {
|
|
||||||
qWarning() << "Unable to read plasma shell version. ScreenPlay only works on KDE";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void App::installKDEWallpaper()
|
|
||||||
{
|
|
||||||
|
|
||||||
qInfo() << "Install ScreenPlay KDE Wallpaper";
|
|
||||||
QProcess process;
|
|
||||||
process.setWorkingDirectory(m_appKdeWallapperPath);
|
|
||||||
process.start("plasmapkg2", { "--install", "ScreenPlay" });
|
|
||||||
process.waitForFinished();
|
|
||||||
process.terminate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void App::upgradeKDEWallpaper()
|
|
||||||
{
|
|
||||||
|
|
||||||
qInfo() << "Upgrade ScreenPlay KDE Wallpaper";
|
|
||||||
QProcess process;
|
|
||||||
process.setWorkingDirectory(m_appKdeWallapperPath);
|
|
||||||
process.start("plasmapkg2", { "--upgrade", "ScreenPlay" });
|
|
||||||
process.waitForFinished();
|
|
||||||
process.terminate();
|
|
||||||
qInfo() << process.readAllStandardError() << process.readAllStandardOutput();
|
|
||||||
}
|
|
||||||
|
|
||||||
void App::restartKDE()
|
|
||||||
{
|
|
||||||
qInfo() << "Restart KDE ";
|
|
||||||
QProcess process;
|
|
||||||
process.start("kquitapp5", { "plasmashell" });
|
|
||||||
process.waitForFinished();
|
|
||||||
process.terminate();
|
|
||||||
qInfo() << process.readAllStandardError() << process.readAllStandardOutput();
|
|
||||||
process.startDetached("kstart5", { "plasmashell" });
|
|
||||||
qInfo() << process.readAllStandardError() << process.readAllStandardOutput();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<bool> App::isNewestKDEWallpaperInstalled()
|
|
||||||
{
|
|
||||||
|
|
||||||
QFileInfo installedWallpaperMetadata(m_kdeWallpaperPath + "/metadata.desktop");
|
|
||||||
QSettings installedWallpaperSettings(installedWallpaperMetadata.absoluteFilePath(), QSettings::Format::IniFormat);
|
|
||||||
installedWallpaperSettings.beginGroup("Desktop Entry");
|
|
||||||
const QString installedWallpaperVersion = installedWallpaperSettings.value("Version").toString();
|
|
||||||
installedWallpaperSettings.endGroup();
|
|
||||||
const QVersionNumber installedVersionNumber = QVersionNumber::fromString(installedWallpaperVersion);
|
|
||||||
|
|
||||||
QFileInfo currentWallpaperMetadata(m_appKdeWallapperPath + "/ScreenPlay/metadata.desktop");
|
|
||||||
QSettings currentWallpaperSettings(currentWallpaperMetadata.absoluteFilePath(), QSettings::Format::IniFormat);
|
|
||||||
currentWallpaperSettings.beginGroup("Desktop Entry");
|
|
||||||
const QString currentWallpaperVersion = currentWallpaperSettings.value("Version").toString();
|
|
||||||
currentWallpaperSettings.endGroup();
|
|
||||||
const QVersionNumber currentVersionNumber = QVersionNumber::fromString(currentWallpaperVersion);
|
|
||||||
|
|
||||||
qInfo() << "installedVersionNumber" << installedVersionNumber << "currentVersionNumber " << currentVersionNumber;
|
|
||||||
if (installedVersionNumber.isNull() || currentVersionNumber.isNull()) {
|
|
||||||
qInfo() << "Unable to parse version number from:" << currentWallpaperVersion << installedWallpaperVersion;
|
|
||||||
qInfo() << "Reinstall ScreenPlay Wallpaper";
|
|
||||||
return std::nullopt;
|
|
||||||
} else {
|
|
||||||
return { installedVersionNumber >= currentVersionNumber };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief
|
|
||||||
*/
|
|
||||||
bool App::setupKDE()
|
|
||||||
{
|
|
||||||
|
|
||||||
m_kdeWallpaperPath = QDir(QDir::homePath() + "/.local/share/plasma/wallpapers/ScreenPlay/").canonicalPath();
|
|
||||||
m_appKdeWallapperPath = QGuiApplication::instance()->applicationDirPath() + "/kde";
|
|
||||||
|
|
||||||
if (!isKDEInstalled())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
QFileInfo installedWallpaperMetadata(m_kdeWallpaperPath + "/metadata.desktop");
|
|
||||||
if (!installedWallpaperMetadata.exists()) {
|
|
||||||
installKDEWallpaper();
|
|
||||||
restartKDE();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (auto isNewer = isNewestKDEWallpaperInstalled()) {
|
|
||||||
if (!isNewer.value()) {
|
|
||||||
upgradeKDEWallpaper();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
qInfo() << "All up to date!" << isNewer.value();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void App::showDockIcon(const bool show)
|
void App::showDockIcon(const bool show)
|
||||||
{
|
{
|
||||||
#if defined(Q_OS_OSX)
|
#if defined(Q_OS_OSX)
|
||||||
|
@ -83,28 +83,6 @@ void ScreenPlayManager::init(
|
|||||||
m_monitorListModel = mlm;
|
m_monitorListModel = mlm;
|
||||||
m_settings = settings;
|
m_settings = settings;
|
||||||
|
|
||||||
if (m_settings->desktopEnvironment() == Settings::DesktopEnvironment::KDE) {
|
|
||||||
m_websocketServer = std::make_unique<QWebSocketServer>(QStringLiteral("ScreenPlayWebSocket"), QWebSocketServer::SslMode::NonSecureMode);
|
|
||||||
const bool success = m_websocketServer->listen(QHostAddress::Any, m_webSocketPort);
|
|
||||||
qInfo() << "Open Websocket:" << success << "port:" << m_webSocketPort;
|
|
||||||
QObject::connect(m_websocketServer.get(), &QWebSocketServer::newConnection, this, [this]() {
|
|
||||||
qInfo() << "New Websocket Connection";
|
|
||||||
auto* socket = m_websocketServer->nextPendingConnection();
|
|
||||||
QObject::connect(socket, &QWebSocket::textMessageReceived, this, [this](const QString& message) {
|
|
||||||
qInfo() << "Message:" << message;
|
|
||||||
});
|
|
||||||
QObject::connect(socket, &QWebSocket::disconnected, this, [this, socket]() {
|
|
||||||
m_connections.removeOne(socket);
|
|
||||||
setIsKDEConnected(false);
|
|
||||||
qInfo() << "Disconnected connection count: " << m_connections.count();
|
|
||||||
});
|
|
||||||
|
|
||||||
m_connections.push_back(socket);
|
|
||||||
setIsKDEConnected(true);
|
|
||||||
// socket->flush();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset to default settings if we are unable to load
|
// Reset to default settings if we are unable to load
|
||||||
// the existing one
|
// the existing one
|
||||||
if (!loadProfiles()) {
|
if (!loadProfiles()) {
|
||||||
@ -153,22 +131,6 @@ bool ScreenPlayManager::createWallpaper(
|
|||||||
const QString path = QUrl::fromUserInput(absoluteStoragePath).toLocalFile();
|
const QString path = QUrl::fromUserInput(absoluteStoragePath).toLocalFile();
|
||||||
const QString appID = ScreenPlayUtil::generateRandomString();
|
const QString appID = ScreenPlayUtil::generateRandomString();
|
||||||
|
|
||||||
if (m_settings->desktopEnvironment() == Settings::DesktopEnvironment::KDE) {
|
|
||||||
if (m_connections.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
QJsonObject msg;
|
|
||||||
msg.insert("command", "replace");
|
|
||||||
msg.insert("absolutePath", path);
|
|
||||||
msg.insert("type", static_cast<int>(type));
|
|
||||||
msg.insert("fillMode", static_cast<int>(fillMode));
|
|
||||||
msg.insert("volume", volume);
|
|
||||||
msg.insert("file", file);
|
|
||||||
|
|
||||||
m_connections.first()->sendTextMessage(QJsonDocument(msg).toJson());
|
|
||||||
m_connections.first()->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only support remove wallpaper that spans over 1 monitor
|
// Only support remove wallpaper that spans over 1 monitor
|
||||||
if (monitorIndex.length() == 1) {
|
if (monitorIndex.length() == 1) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -207,11 +169,7 @@ bool ScreenPlayManager::createWallpaper(
|
|||||||
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::requestSaveProfiles);
|
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::requestSaveProfiles);
|
||||||
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestClose, this, &ScreenPlayManager::removeWallpaper);
|
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestClose, this, &ScreenPlayManager::removeWallpaper);
|
||||||
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::error, this, &ScreenPlayManager::displayErrorPopup);
|
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::error, this, &ScreenPlayManager::displayErrorPopup);
|
||||||
if (m_settings->desktopEnvironment() != Settings::DesktopEnvironment::KDE) {
|
|
||||||
if (!wallpaper->start()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_screenPlayWallpapers.append(wallpaper);
|
m_screenPlayWallpapers.append(wallpaper);
|
||||||
m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
|
m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
|
||||||
increaseActiveWallpaperCounter();
|
increaseActiveWallpaperCounter();
|
||||||
@ -286,15 +244,6 @@ bool ScreenPlayManager::removeAllWallpapers()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_settings->desktopEnvironment() == Settings::DesktopEnvironment::KDE) {
|
|
||||||
for (auto& connection : m_connections) {
|
|
||||||
QJsonObject obj;
|
|
||||||
obj.insert("command", "quit");
|
|
||||||
connection->sendTextMessage(QJsonDocument(obj).toJson(QJsonDocument::Compact));
|
|
||||||
connection->flush();
|
|
||||||
connection->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
emit requestSaveProfiles();
|
emit requestSaveProfiles();
|
||||||
|
|
||||||
@ -486,9 +435,6 @@ bool ScreenPlayManager::removeWallpaper(const QString& appID)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_settings->desktopEnvironment() == Settings::DesktopEnvironment::Windows || m_settings->desktopEnvironment() == Settings::DesktopEnvironment::OSX)
|
|
||||||
wallpaper->messageKDECloseWallpaper();
|
|
||||||
|
|
||||||
qInfo() << "Remove wallpaper " << wallpaper->file() << "at monitor " << wallpaper->screenNumber();
|
qInfo() << "Remove wallpaper " << wallpaper->file() << "at monitor " << wallpaper->screenNumber();
|
||||||
|
|
||||||
// The MonitorListModel contains a shared_ptr of this object that needs to be removed
|
// The MonitorListModel contains a shared_ptr of this object that needs to be removed
|
||||||
@ -723,19 +669,6 @@ bool ScreenPlayManager::loadProfiles()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScreenPlayManager::isKDEConnected() const
|
|
||||||
{
|
|
||||||
return m_isKDEConnected;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScreenPlayManager::setIsKDEConnected(bool isKDEConnected)
|
|
||||||
{
|
|
||||||
if (m_isKDEConnected == isKDEConnected)
|
|
||||||
return;
|
|
||||||
m_isKDEConnected = isKDEConnected;
|
|
||||||
emit isKDEConnectedChanged(isKDEConnected);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_screenplaymanager.cpp"
|
#include "moc_screenplaymanager.cpp"
|
||||||
|
@ -59,8 +59,8 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
|
|||||||
setDesktopEnvironment(DesktopEnvironment::OSX);
|
setDesktopEnvironment(DesktopEnvironment::OSX);
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
// We only support KDE for now
|
// We only support Wayland wl_roots for now
|
||||||
setDesktopEnvironment(DesktopEnvironment::KDE);
|
setDesktopEnvironment(DesktopEnvironment::Wayland);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qRegisterMetaType<Settings::Language>("Settings::Language");
|
qRegisterMetaType<Settings::Language>("Settings::Language");
|
||||||
|
@ -92,9 +92,6 @@ if(UNIX AND NOT APPLE)
|
|||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
${PROJECT_NAME}
|
${PROJECT_NAME}
|
||||||
PRIVATE LayerShellQtInterface)
|
PRIVATE LayerShellQtInterface)
|
||||||
|
|
||||||
include(CopyRecursive)
|
|
||||||
copy_recursive(${CMAKE_CURRENT_SOURCE_DIR}/kde/ScreenPlay ${CMAKE_BINARY_DIR}/bin/kde/ScreenPlay "*")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
# ScreenPlay Wallpaper for KDE Plasma Desktop
|
|
||||||
|
|
||||||
One has to install it via the command below. Simply putting it into:
|
|
||||||
* ~/.local/share/plasma/wallpapers/
|
|
||||||
Will not work because KDE uses the kpluginindex.json (that is actually a bz2 file. Do not ask why...) to load all available wallpaper.
|
|
||||||
|
|
||||||
#### Installation
|
|
||||||
```
|
|
||||||
sudo apt install qml-module-qt-websockets qtwebengine5-*
|
|
||||||
|
|
||||||
plasmapkg2 --install ScreenPlay
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Application structure
|
|
||||||
Because Wallpaper and Widgets are already a different application we can extend the logic for KDE. For this we create a local websocket instance to communicate with our main ScreenPlay app.
|
|
||||||
|
|
||||||
### Development
|
|
||||||
1. Make changes
|
|
||||||
1. `plasmapkg2 --upgrade ScreenPlay`
|
|
||||||
1. Open Desktop Settings
|
|
||||||
- Select Wallpaper type Image
|
|
||||||
1. Close Desktop Settings Window
|
|
||||||
1. Open Desktop Settings
|
|
||||||
- Select Wallpaper type ScreenPlay
|
|
||||||
|
|
||||||
```
|
|
||||||
plasmapkg2 --upgrade ScreenPlay ; kquitapp5 plasmashell; kstart5 plasmashell
|
|
||||||
```
|
|
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
|
||||||
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
|
||||||
<kcfgfile name=""/>
|
|
||||||
|
|
||||||
<group name="General">
|
|
||||||
<entry name="MonitorIndex" type="int">
|
|
||||||
<label>Monitor Index aaa</label>
|
|
||||||
<default>0</default>
|
|
||||||
</entry>
|
|
||||||
</group>
|
|
||||||
|
|
||||||
</kcfg>
|
|
@ -1,72 +0,0 @@
|
|||||||
import QtQuick 2.15
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
color: "black"
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: toBeCreated
|
|
||||||
anchors.fill: parent
|
|
||||||
color: "black"
|
|
||||||
opacity: 0
|
|
||||||
|
|
||||||
Text {
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: qsTr("Please start ScreenPlay before launching the wallpaper")
|
|
||||||
color: "White"
|
|
||||||
font.pixelSize: 50
|
|
||||||
}
|
|
||||||
|
|
||||||
OpacityAnimator on opacity {
|
|
||||||
id: createAnimation
|
|
||||||
from: 0
|
|
||||||
to: 1
|
|
||||||
duration: 1000
|
|
||||||
onRunningChanged: {
|
|
||||||
if (!running) {
|
|
||||||
toBeDeleted.opacity = 1;
|
|
||||||
toBeCreated.opacity = 0;
|
|
||||||
destroyAnimation.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Component.onCompleted: {
|
|
||||||
createAnimation.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: toBeDeleted
|
|
||||||
opacity: 0
|
|
||||||
anchors.fill: parent
|
|
||||||
color: "black"
|
|
||||||
|
|
||||||
Text {
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: qsTr("Please start ScreenPlay before launching the wallpaper")
|
|
||||||
color: "White"
|
|
||||||
font.pixelSize: 50
|
|
||||||
}
|
|
||||||
|
|
||||||
OpacityAnimator on opacity {
|
|
||||||
id: destroyAnimation
|
|
||||||
from: 1
|
|
||||||
to: 0
|
|
||||||
duration: 1000
|
|
||||||
running: false
|
|
||||||
onRunningChanged: {
|
|
||||||
if (!running) {
|
|
||||||
toBeDeleted.opacity = 0;
|
|
||||||
toBeCreated.opacity = 0;
|
|
||||||
createAnimation.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
import QtQuick.Controls 2.12
|
|
||||||
import QtWebSockets 1.1
|
|
||||||
import QtWebEngine 1.8
|
|
||||||
import QtMultimedia 5.12
|
|
||||||
import Qt.labs.settings 1.1
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root
|
|
||||||
color: "black"
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
property string fullContentPath
|
|
||||||
property real volume: 1
|
|
||||||
property string fillMode: "Cover"
|
|
||||||
property string type
|
|
||||||
property string projectSourceFileAbsolute
|
|
||||||
property bool loops: true
|
|
||||||
|
|
||||||
function stop() {
|
|
||||||
player1.stop();
|
|
||||||
player2.stop();
|
|
||||||
videoOutput1.visible = false;
|
|
||||||
videoOutput2.visible = false;
|
|
||||||
root.enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function play() {
|
|
||||||
root.enabled = true;
|
|
||||||
videoOutput2.visible = false;
|
|
||||||
videoOutput1.visible = true;
|
|
||||||
|
|
||||||
//if(wallpaper.configuration.DualPlayback){
|
|
||||||
player2.source = root.projectSourceFileAbsolute;
|
|
||||||
player2.play();
|
|
||||||
player2.pause();
|
|
||||||
//}
|
|
||||||
player1.play();
|
|
||||||
}
|
|
||||||
|
|
||||||
MediaPlayer {
|
|
||||||
id: player1
|
|
||||||
volume: root.volume
|
|
||||||
source: root.projectSourceFileAbsolute
|
|
||||||
onStopped: {
|
|
||||||
if (!root.enabled)
|
|
||||||
return;
|
|
||||||
videoOutput1.visible = false;
|
|
||||||
videoOutput2.visible = true;
|
|
||||||
if (player2.source !== root.projectSourceFileAbsolute) {
|
|
||||||
player2.source = root.projectSourceFileAbsolute;
|
|
||||||
}
|
|
||||||
player1.play();
|
|
||||||
player1.pause();
|
|
||||||
player2.play();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MediaPlayer {
|
|
||||||
id: player2
|
|
||||||
volume: root.volume
|
|
||||||
onStopped: {
|
|
||||||
if (!root.enabled)
|
|
||||||
return;
|
|
||||||
videoOutput2.visible = false;
|
|
||||||
videoOutput1.visible = true;
|
|
||||||
player2.play();
|
|
||||||
player2.pause();
|
|
||||||
player1.play();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoOutput {
|
|
||||||
id: videoOutput1
|
|
||||||
fillMode: VideoOutput.PreserveAspectCrop
|
|
||||||
anchors.fill: parent
|
|
||||||
source: player1
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoOutput {
|
|
||||||
id: videoOutput2
|
|
||||||
fillMode: VideoOutput.PreserveAspectCrop
|
|
||||||
anchors.fill: parent
|
|
||||||
source: player2
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
import QtQuick.Controls 2.12
|
|
||||||
import QtWebSockets 1.1
|
|
||||||
import QtWebEngine 1.8
|
|
||||||
import QtMultimedia 5.12
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: container
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: wp
|
|
||||||
anchors.fill: parent
|
|
||||||
source: "Wallpaper.qml"
|
|
||||||
property bool connected: false
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: connectTimer
|
|
||||||
interval: 1000
|
|
||||||
running: true
|
|
||||||
repeat: true
|
|
||||||
onTriggered: {
|
|
||||||
if (!wp.connected) {
|
|
||||||
console.log("not connected");
|
|
||||||
wp.source = "";
|
|
||||||
wp.source = "Wallpaper.qml";
|
|
||||||
} else {
|
|
||||||
console.log("connected");
|
|
||||||
screensaver.visible = false;
|
|
||||||
connectTimer.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: screensaver
|
|
||||||
anchors.fill: parent
|
|
||||||
source: "WaitingForScreenplay.qml"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
import QtQuick 2.11
|
|
||||||
import QtQuick.Controls 2.4 as QQC
|
|
||||||
import QtQuick.Window 2.0
|
|
||||||
import QtGraphicalEffects 1.0
|
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
||||||
import org.kde.plasma.wallpapers.image 2.0 as Wallpaper
|
|
||||||
import org.kde.kcm 1.1 as KCM
|
|
||||||
import org.kde.kirigami 2.4 as Kirigami
|
|
||||||
import org.kde.newstuff 1.1 as NewStuff
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property alias cfg_MonitorIndex: monitorIndex.text
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
spacing: units.largeSpacing
|
|
||||||
|
|
||||||
Row {
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
spacing: units.largeSpacing
|
|
||||||
|
|
||||||
QQC.TextField {
|
|
||||||
id: monitorIndex
|
|
||||||
text: "0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<style type="text/css">
|
|
||||||
video {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: fill;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
body, html{
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
overflow: hidden;
|
|
||||||
background:black;
|
|
||||||
}
|
|
||||||
#errorMsg{
|
|
||||||
position: fixed;
|
|
||||||
top: 50%;
|
|
||||||
text-align: center;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100px;
|
|
||||||
z-index: 0;
|
|
||||||
color:white;
|
|
||||||
font-family: "Segoe UI, Roboto, Arial";
|
|
||||||
font-weight: lighter;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<video id="videoPlayer" oncontextmenu="return false;" width="100%" height="100%" loop autoplay>
|
|
||||||
<source id="videoSource" type="video/webm" oncontextmenu="return false;" width="100%" height="100%">
|
|
||||||
</video>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,114 +0,0 @@
|
|||||||
import QtQuick 2.0
|
|
||||||
import QtQuick.Controls 2.12
|
|
||||||
import QtWebSockets 1.1
|
|
||||||
import QtWebEngine 1.8
|
|
||||||
import QtMultimedia 5.12
|
|
||||||
import Qt.labs.settings 1.1
|
|
||||||
import org.kde.plasma.core 2.0 as PlasmaCore
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: root
|
|
||||||
color: "orange"
|
|
||||||
property bool connected: false
|
|
||||||
|
|
||||||
Settings {
|
|
||||||
id: settings
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
wallpaper.projectSourceFileAbsolute = settings.value("SP_projectSourceFileAbsolute", "NULL");
|
|
||||||
// if(root.projectSourceFileAbsolute === "NULL")
|
|
||||||
// return
|
|
||||||
wallpaper.type = settings.value("SP_type");
|
|
||||||
wallpaper.fillMode = settings.value("SP_fillMode");
|
|
||||||
//wallpaper.volume = settings.value("SP_volume")
|
|
||||||
wallpaper.play();
|
|
||||||
}
|
|
||||||
|
|
||||||
Wallpaper {
|
|
||||||
id: wallpaper
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
// visible: root.connected
|
|
||||||
onFullContentPathChanged: settings.setValue("SP_fullContentPath", fullContentPath)
|
|
||||||
onVolumeChanged: settings.setValue("SP_volume", volume)
|
|
||||||
onFillModeChanged: settings.setValue("SP_fillMode", fillMode)
|
|
||||||
onTypeChanged: settings.setValue("SP_type", type)
|
|
||||||
onProjectSourceFileAbsoluteChanged: settings.setValue("SP_projectSourceFileAbsolute", projectSourceFileAbsolute)
|
|
||||||
onLoopsChanged: settings.setValue("SP_loops", loops)
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: reconnectTimer
|
|
||||||
interval: 1000
|
|
||||||
running: true
|
|
||||||
repeat: true
|
|
||||||
onTriggered: {
|
|
||||||
if (socket.status === WebSocket.Open)
|
|
||||||
return;
|
|
||||||
socket.active = false;
|
|
||||||
socket.active = true;
|
|
||||||
reconnectTimer.retryCounter += 1;
|
|
||||||
}
|
|
||||||
property int retryCounter: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
WebSocket {
|
|
||||||
id: socket
|
|
||||||
url: "ws://127.0.0.1:16395"
|
|
||||||
onStatusChanged: {
|
|
||||||
if (socket.status === WebSocket.Open)
|
|
||||||
socket.sendTextMessage("Hello World from QML wallpaper");
|
|
||||||
}
|
|
||||||
|
|
||||||
onTextMessageReceived: message => {
|
|
||||||
var obj = JSON.parse(message);
|
|
||||||
root.connected = true;
|
|
||||||
txtCommand.text = obj.command;
|
|
||||||
if (obj.command === "replace") {
|
|
||||||
socket.sendTextMessage("replace");
|
|
||||||
wallpaper.type = obj.type;
|
|
||||||
wallpaper.fillMode = obj.fillMode;
|
|
||||||
wallpaper.volume = obj.volume;
|
|
||||||
wallpaper.projectSourceFileAbsolute = "file://" + obj.absolutePath + "/" + obj.file;
|
|
||||||
print("got: " + root.projectSourceFileAbsolute);
|
|
||||||
wallpaper.play();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (obj.command === "quit") {
|
|
||||||
wallpaper.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// WaitingForScreenplay {
|
|
||||||
// anchors.fill: parent
|
|
||||||
// visible: !root.connected
|
|
||||||
// }
|
|
||||||
Column {
|
|
||||||
anchors {
|
|
||||||
horizontalCenter: parent.horizontalCenter
|
|
||||||
bottom: parent.bottom
|
|
||||||
margins: 60
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
id: txtCommand
|
|
||||||
color: "white"
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
color: "white"
|
|
||||||
text: "wallpaper.type: " + wallpaper.type
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
color: "white"
|
|
||||||
text: "projectSourceFileAbsolute " + wallpaper.projectSourceFileAbsolute
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
color: "white"
|
|
||||||
text: "reconnectTimer.retryCounter : " + reconnectTimer.retryCounter
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
color: "white"
|
|
||||||
text: "MonitorIndex: " + wallpaper.configuration.MonitorIndex
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Name=ScreenPlay
|
|
||||||
Keywords=ScreenPlay
|
|
||||||
Icon=preferences-desktop-wallpaper
|
|
||||||
Version=0.15.0-RC5
|
|
||||||
|
|
||||||
Type=Service
|
|
||||||
|
|
||||||
X-KDE-ServiceTypes=Plasma/Wallpaper
|
|
||||||
X-KDE-ParentApp=
|
|
||||||
X-KDE-PluginInfo-Name=ScreenPlay
|
|
||||||
X-KDE-PluginInfo-EnabledByDefault=true
|
|
||||||
X-KDE-PluginInfo-Version=3
|
|
||||||
X-KDE-PluginInfo-Website=https://gitlab.com/kelteseth/screenplay
|
|
||||||
|
|
||||||
X-Plasma-MainScript=ui/main.qml
|
|
||||||
|
|
||||||
MimeType=image/gif;image/png;image/svg+xml;image/svg+xml-compressed;video/x-mng;
|
|
||||||
X-Plasma-DropMimeTypes=image/gif,image/png,image/svg+xml,image/svg+xml-compressed,video/x-mng
|
|
Loading…
Reference in New Issue
Block a user