From 7d94a8b71d7155852b3f6cfbd697e2e17e669316 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Fri, 15 Sep 2023 14:44:27 +0800 Subject: [PATCH] fix: relink to autostart when dekstopFile has been changed Signed-off-by: ComixHe --- src/dbus/applicationmanager1service.cpp | 7 ++++++- src/dbus/applicationservice.cpp | 4 ++-- src/dbus/applicationservice.h | 2 +- src/desktopentry.cpp | 22 ++++++++++++++++++++++ src/desktopentry.h | 7 +++++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index d9a00cc..f474fb7 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -386,9 +386,14 @@ void ApplicationManager1Service::updateApplication(const QSharedPointerm_entry != newEntry) { destApp->resetEntry(newEntry); - destApp->m_desktopSource = std::move(desktopFile); destApp->detachAllInstance(); } + + if (destApp->m_desktopSource != desktopFile and destApp->isAutoStart()) { + destApp->setAutoStart(false); + destApp->m_desktopSource = std::move(desktopFile); + destApp->setAutoStart(true); + } } void ApplicationManager1Service::ReloadApplications() diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp index 281aa29..6ff850d 100644 --- a/src/dbus/applicationservice.cpp +++ b/src/dbus/applicationservice.cpp @@ -421,12 +421,12 @@ qulonglong ApplicationService::lastLaunchedTime() const noexcept return m_lastLaunch; } -bool ApplicationService::autostartCheck(const QString &linkPath) noexcept +bool ApplicationService::autostartCheck(const QString &linkPath) const noexcept { QFileInfo info{linkPath}; if (info.exists()) { - if (info.isSymbolicLink()) { + if (info.isSymbolicLink() and info.symLinkTarget() == m_desktopSource.sourcePath()) { return true; } qWarning() << "same name desktop file exists:" << linkPath << "but this may not created by AM."; diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index 4953689..e13cc0b 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -146,7 +146,7 @@ private: const QLocale &locale = getUserLocale()) const noexcept; void updateAfterLaunch(bool isLaunch) noexcept; static bool shouldBeShown(const std::unique_ptr &entry) noexcept; - static bool autostartCheck(const QString &linkPath) noexcept; + [[nodiscard]] bool autostartCheck(const QString &linkPath) const noexcept; }; #endif diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp index b79405f..7874b1f 100644 --- a/src/desktopentry.cpp +++ b/src/desktopentry.cpp @@ -556,6 +556,28 @@ bool operator!=(const DesktopEntry &lhs, const DesktopEntry &rhs) return !(lhs == rhs); } +bool operator==(const DesktopFile &lhs, const DesktopFile &rhs) +{ + if (lhs.m_desktopId != rhs.m_desktopId) { + return false; + } + + if (lhs.sourcePath() != rhs.sourcePath()) { + return false; + } + + if (lhs.m_ctime != rhs.m_ctime or lhs.m_mtime != rhs.m_mtime) { + return false; + } + + return true; +} + +bool operator!=(const DesktopFile &lhs, const DesktopFile &rhs) +{ + return !(lhs == rhs); +} + QDebug operator<<(QDebug debug, const DesktopEntry::Value &v) { QDebugStateSaver saver{debug}; diff --git a/src/desktopentry.h b/src/desktopentry.h index be6d16c..0bf85f5 100644 --- a/src/desktopentry.h +++ b/src/desktopentry.h @@ -50,6 +50,9 @@ struct DesktopFile [[nodiscard]] bool modified(qint64 time) const noexcept; [[nodiscard]] qint64 createTime() const noexcept { return m_ctime; } + friend bool operator==(const DesktopFile &lhs, const DesktopFile &rhs); + friend bool operator!=(const DesktopFile &lhs, const DesktopFile &rhs); + static std::optional searchDesktopFileById(const QString &appId, DesktopErrorCode &err) noexcept; static std::optional searchDesktopFileByPath(const QString &desktopFilePath, DesktopErrorCode &err) noexcept; static std::optional createTemporaryDesktopFile(const QString &temporaryFile) noexcept; @@ -157,4 +160,8 @@ bool operator==(const DesktopEntry &lhs, const DesktopEntry &rhs); bool operator!=(const DesktopEntry &lhs, const DesktopEntry &rhs); +bool operator==(const DesktopFile &lhs, const DesktopFile &rhs); + +bool operator!=(const DesktopFile &lhs, const DesktopFile &rhs); + #endif