diff --git a/api/dbus/org.desktopspec.MimeManager1.xml b/api/dbus/org.desktopspec.MimeManager1.xml index 370b3f2f..3e04beb0 100644 --- a/api/dbus/org.desktopspec.MimeManager1.xml +++ b/api/dbus/org.desktopspec.MimeManager1.xml @@ -25,5 +25,11 @@ + + + diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index 3c19bb1e..13802517 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "applicationadaptor.h" @@ -274,6 +274,13 @@ void ApplicationManager1Service::scanMimeInfos() noexcept } } +void ApplicationManager1Service::reloadMimeInfos() noexcept +{ + m_mimeManager->reset(); + scanMimeInfos(); + emit m_mimeManager->MimeInfoReloaded(); +} + void ApplicationManager1Service::scanApplications() noexcept { const auto &desktopFileDirs = getDesktopFileDirs(); @@ -639,8 +646,7 @@ void ApplicationManager1Service::doReloadApplications() removeOneApplication(appId); } - m_mimeManager->reset(); - scanMimeInfos(); + reloadMimeInfos(); updateAutostartStatus(); } diff --git a/src/dbus/applicationmanager1service.h b/src/dbus/applicationmanager1service.h index ac232703..326a7091 100644 --- a/src/dbus/applicationmanager1service.h +++ b/src/dbus/applicationmanager1service.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -41,6 +41,7 @@ class ApplicationManager1Service final : public QObject, protected QDBusContext [[nodiscard]] QList list() const; void initService(QDBusConnection &connection) noexcept; + void reloadMimeInfos() noexcept; QSharedPointer addApplication(DesktopFile desktopFileSource) noexcept; void removeOneApplication(const QString &appId) noexcept; void removeAllApplication() noexcept; diff --git a/src/dbus/mimemanager1service.cpp b/src/dbus/mimemanager1service.cpp index 87dabf84..78358e6a 100644 --- a/src/dbus/mimemanager1service.cpp +++ b/src/dbus/mimemanager1service.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include @@ -15,6 +15,21 @@ MimeManager1Service::MimeManager1Service(ApplicationManager1Service *parent) if (adaptor == nullptr or !registerObjectToDBus(this, DDEApplicationManager1MimeManager1ObjectPath, MimeManager1Interface)) { std::terminate(); } + + // 监控用户配置目录下的 mimeapps.list 文件 + connect(&m_mimeAppsWatcher, &QFileSystemWatcher::fileChanged, this, &MimeManager1Service::onMimeAppsFileChanged); + + // 添加用户配置目录下的 mimeapps.list 文件到监控 + QString userMimeAppsFile = getXDGConfigHome() + "/mimeapps.list"; + if (QFileInfo::exists(userMimeAppsFile)) { + m_mimeAppsWatcher.addPath(userMimeAppsFile); + } else { + qWarning() << "User mimeapps.list file does not exist:" << userMimeAppsFile; + } + + m_mimeAppsDebounceTimer.setSingleShot(true); + m_mimeAppsDebounceTimer.setInterval(50); + connect(&m_mimeAppsDebounceTimer, &QTimer::timeout, this, &MimeManager1Service::handleMimeAppsFileDebounced); } MimeManager1Service::~MimeManager1Service() = default; @@ -106,12 +121,15 @@ void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) n return; } + m_internalWriteInProgress = true; for (auto it = defaultApps.constKeyValueBegin(); it != defaultApps.constKeyValueEnd(); ++it) { userConfig->setDefaultApplication(it->first, it->second); } if (!userConfig->writeToFile()) { safe_sendErrorReply(QDBusError::Failed, "set default app failed, these config will be reset after re-login."); + m_internalWriteInProgress = false; + return; } } @@ -126,12 +144,15 @@ void MimeManager1Service::unsetDefaultApplication(const QStringList &mimeTypes) return; } + m_internalWriteInProgress = true; for (const auto &mime : mimeTypes) { userConfig->unsetDefaultApplication(mime); } if (!userConfig->writeToFile()) { safe_sendErrorReply(QDBusError::Failed, "unset default app failed, these config will be reset after re-login."); + m_internalWriteInProgress = false; + return; } } @@ -156,3 +177,29 @@ void MimeManager1Service::updateMimeCache(QString dir) noexcept } } + +void MimeManager1Service::onMimeAppsFileChanged(const QString &path) +{ + if (!m_mimeAppsWatcher.files().contains(path) && QFileInfo::exists(path)) { + m_mimeAppsWatcher.addPath(path); + } + + // 如果是内部写入导致的文件变化,忽略 + if (m_internalWriteInProgress) { + m_internalWriteInProgress = false; + return; + } + + m_mimeAppsDebounceTimer.start(); +} + +void MimeManager1Service::handleMimeAppsFileDebounced() +{ + auto *parentService = qobject_cast(parent()); + if (!parentService) { + return; + } + + qInfo() << "Reloading MIME info due to external configuration change."; + parentService->reloadMimeInfos(); +} diff --git a/src/dbus/mimemanager1service.h b/src/dbus/mimemanager1service.h index 7849549c..8f942a3c 100644 --- a/src/dbus/mimemanager1service.h +++ b/src/dbus/mimemanager1service.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -8,6 +8,9 @@ #include #include #include +#include +#include + #include "global.h" #include "applicationmimeinfo.h" @@ -32,9 +35,20 @@ public Q_SLOTS: void setDefaultApplication(const QStringMap &defaultApps) noexcept; void unsetDefaultApplication(const QStringList &mimeTypes) noexcept; +Q_SIGNALS: + void MimeInfoReloaded(); + +private Q_SLOTS: + void onMimeAppsFileChanged(const QString &path); + void handleMimeAppsFileDebounced(); + private: QMimeDatabase m_database; std::vector m_infos; + QFileSystemWatcher m_mimeAppsWatcher; + // 内部写入标志,用于避免触发外部修改的处理 + bool m_internalWriteInProgress{false}; + QTimer m_mimeAppsDebounceTimer; }; #endif diff --git a/toolGenerate/qdbusxml2cpp/org.desktopspec.MimeManager1Adaptor.h b/toolGenerate/qdbusxml2cpp/org.desktopspec.MimeManager1Adaptor.h index 80f64f2d..3a620434 100644 --- a/toolGenerate/qdbusxml2cpp/org.desktopspec.MimeManager1Adaptor.h +++ b/toolGenerate/qdbusxml2cpp/org.desktopspec.MimeManager1Adaptor.h @@ -51,6 +51,9 @@ class MimeManager1Adaptor: public QDBusAbstractAdaptor " \n" " \n" " \n" +" \n" +" \n" +" \n" " \n" "") public: @@ -64,6 +67,7 @@ public Q_SLOTS: // METHODS void setDefaultApplication(const QStringMap &defaultApps); void unsetDefaultApplication(const QStringList &mimeTypes); Q_SIGNALS: // SIGNALS + void MimeInfoReloaded(); }; #endif