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