From ca24d2d908baa4d82f5ee226ba253b2bb0c8348f Mon Sep 17 00:00:00 2001 From: ComixHe Date: Fri, 1 Sep 2023 15:48:29 +0800 Subject: [PATCH] feat: add method SendToDesktop/RemoveFromDesktop, Property isOnDesktop Signed-off-by: ComixHe --- ...opspec.ApplicationManager1.Application.xml | 11 ++++ src/dbus/applicationservice.cpp | 66 +++++++++++++++++++ src/dbus/applicationservice.h | 5 ++ 3 files changed, 82 insertions(+) diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml index a8c9f2e..ec8a024 100644 --- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml +++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml @@ -92,5 +92,16 @@ `env` option will not take effect at all." /> + + + + + + + + + + + diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 076d59a..80ac0c6 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -186,6 +187,71 @@ QDBusObjectPath ApplicationService::Launch(const QString &action, const QStringL std::move(res)); } +bool ApplicationService::SendToDesktop() const noexcept +{ + if (isOnDesktop()) { + return true; + } + + auto dir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + if (dir.isEmpty()) { + qDebug() << "no desktop directory found."; + return false; + } + + auto desktopFile = QDir{dir}.filePath(m_desktopSource.desktopId() + ".desktop"); + auto success = m_desktopSource.sourceFileRef().link(desktopFile); + if (!success) { + qDebug() << "create link failed:" << m_desktopSource.sourceFileRef().errorString() << "path:" << desktopFile; + } + + return success; +} + +bool ApplicationService::RemoveFromDesktop() const noexcept +{ + if (!isOnDesktop()) { + return true; + } + + auto dir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + if (dir.isEmpty()) { + qDebug() << "no desktop directory found."; + return false; + } + + QFile desktopFile{QDir{dir}.filePath(m_desktopSource.desktopId() + ".desktop")}; + auto success = desktopFile.remove(); + + if (!success) { + qDebug() << "remove desktop file failed:" << desktopFile.errorString(); + } + + return success; +} + +bool ApplicationService::isOnDesktop() const noexcept +{ + auto dir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + + if (dir.isEmpty()) { + qDebug() << "no desktop directory found."; + return false; + } + + QFileInfo info{QDir{dir}.filePath(m_desktopSource.desktopId() + ".desktop")}; + + if (!info.exists()) { + return false; + } + + if (!info.isSymbolicLink()) { + return false; + } + + return info.symLinkTarget() == m_desktopSource.sourcePath(); +} + QStringList ApplicationService::actions() const noexcept { auto val = findEntryValue(DesktopFileEntryKey, "Actions", EntryValueType::String); diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index b4e991b..2694634 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -69,6 +69,9 @@ public: Q_PROPERTY(qulonglong installedTime READ installedTime) [[nodiscard]] qulonglong installedTime() const noexcept; + Q_PROPERTY(bool isOnDesktop READ isOnDesktop) + [[nodiscard]] bool isOnDesktop() const noexcept; + [[nodiscard]] QDBusObjectPath findInstance(const QString &instanceId) const; [[nodiscard]] const QString &getLauncher() const noexcept { return m_launcher; } @@ -89,6 +92,8 @@ public: public Q_SLOTS: QDBusObjectPath Launch(const QString &action, const QStringList &fields, const QVariantMap &options); [[nodiscard]] ObjectMap GetManagedObjects() const; + [[nodiscard]] bool SendToDesktop() const noexcept; + [[nodiscard]] bool RemoveFromDesktop() const noexcept; Q_SIGNALS: void InterfacesAdded(const QDBusObjectPath &object_path, const ObjectInterfaceMap &interfaces);