From 8c460060c7bebd2ac4ee322983348922b26d84d3 Mon Sep 17 00:00:00 2001 From: Wang Zichong Date: Fri, 31 Oct 2025 16:54:40 +0800 Subject: [PATCH] feat: ability to fine-tune cgroups-based appid detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加选项以供对于 cgroup 的应用识别场景,跳过指定应用程序的检查. 由于用户从终端执行带图形界面的应用程序的概率较大(例如 gitk, deepin-dconfig-edtor 等),这些应用必然无法匹配到一个 desktop id, 导致在经过 AM 的应用识别时,会根据其 cgroup 匹配到父进程的应用 id 上. 若要保留基于 cgroup 的识别则此问题基本没有合理的解决方案. 此提交引入了一个新的 dconfig 配置项,允许指定一个列表,表示希望跳 过基于 cgroup 的应用识别与合并的 appid 列表. 当 fallback 到 cgroup 识别且 cgroup 在此列表中,则此应用不再根据 cgroup 提取到的 appid 进行分组. 这个列表的值是 appid, 即 desktop-id 去掉 .desktop 后缀后剩余的部分. 此列表一般应当是终端模拟器的应用 id, 也可以将专门用于启动其他程 序的第三方启动器/工具添加到此列表中.例如 uTools 或者文件管理器. 另外此提交也把原本允许彻底禁用基于 cgroups 识别与分组的选项的逻 辑添加了回来. 另注: 1. 对于希望在 deepin 环境尽可能保持"deepin原生"行为的组件,应当 接入 dde-application-manager 来通过它启动应用 2. 所有应用仍然应当尽可能被正确安装到系统中,以确保其存在对应的 desktop-id/appid. 上述新增的配置项也仅适用于被正确安装/有应 用id的应用程序 Log: --- .../dconfig/org.deepin.ds.dock.taskmanager.json | 13 ++++++++++++- panels/dock/taskmanager/globals.h | 1 + panels/dock/taskmanager/taskmanager.cpp | 16 +++++++++------- panels/dock/taskmanager/taskmanagersettings.cpp | 6 ++++++ panels/dock/taskmanager/taskmanagersettings.h | 2 ++ 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json index e41932c00..cf7141f78 100644 --- a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json +++ b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json @@ -37,13 +37,24 @@ "value": true, "serial": 0, "flags": [], - "name": "cgroupsBasedGrouping", + "name": "CGroups-based Grouping", "name[zh_CN]": "基于 cgroups 的任务图标分组", "description": "Enable cgroups-based task grouping", "description[zh_CN]": "启用基于 cgroups 的任务图标分组", "permissions": "readonly", "visibility": "private" }, + "cgroupsBasedGroupingSkipAppIds": { + "value": ["deepin-terminal"], + "serial": 0, + "flags": [], + "name": "CGroups-Based Grouping Skipped App IDs", + "name[zh_CN]": "基于 cgroups 的任务图标分组所应跳过的应用列表", + "description": "List of app id that cgroups-based grouping should skip checking", + "description[zh_CN]": "一个表示基于 CGroups 的应用分组所应当跳过的 App ID 列表", + "permissions": "readwrite", + "visibility": "private" + }, "Docked_Items": { "value": ["id: dde-file-manager,type: amAPP", "id: org.deepin.browser,type: amAPP", "id: deepin-app-store,type: amAPP", "id: org.deepin.dde.control-center, type: amAPP", "id: deepin-music,type: amAPP", "id: deepin-editor,type: amAPP", "id: deepin-mail,type: amAPP","id: deepin-terminal,type: amAPP","id: dde-calendar,type: amAPP", "id: deepin-calculator,type: amAPP"], "serial": 0, diff --git a/panels/dock/taskmanager/globals.h b/panels/dock/taskmanager/globals.h index fedf61844..d47f6d4f7 100644 --- a/panels/dock/taskmanager/globals.h +++ b/panels/dock/taskmanager/globals.h @@ -20,6 +20,7 @@ static inline const QString DOCK_ACTION_DOCK = "dock-action-dock"; static inline const QString TASKMANAGER_ALLOWFOCEQUIT_KEY = "Allow_Force_Quit"; static inline const QString TASKMANAGER_WINDOWSPLIT_KEY = "noTaskGrouping"; static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_KEY = "cgroupsBasedGrouping"; +static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cgroupsBasedGroupingSkipAppIds"; static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items"; constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements"; diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 431ce4132..8b2e07778 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -149,14 +149,16 @@ bool TaskManager::init() } } } - + // 尝试通过AM(Application Manager)匹配应用程序 - auto desktopId = getDesktopIdByPid(identifies); - if (!desktopId.isEmpty()) { - auto res = model->match(model->index(0, 0), roleNames.key(MODEL_DESKTOPID), desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0); - if (res.isValid()) { - qCDebug(taskManagerLog) << "matched by AM desktop ID:" << desktopId << res; - return res; + if (Settings->cgroupsBasedGrouping()) { + auto desktopId = getDesktopIdByPid(identifies); + if (!desktopId.isEmpty() && !Settings->cgroupsBasedGroupingSkipIds().contains(desktopId)) { + auto res = model->match(model->index(0, 0), roleNames.key(MODEL_DESKTOPID), desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0); + if (res.isValid()) { + qCDebug(taskManagerLog) << "matched by AM desktop ID:" << desktopId << res; + return res; + } } } diff --git a/panels/dock/taskmanager/taskmanagersettings.cpp b/panels/dock/taskmanager/taskmanagersettings.cpp index 68a67bbf1..02e03f659 100644 --- a/panels/dock/taskmanager/taskmanagersettings.cpp +++ b/panels/dock/taskmanager/taskmanagersettings.cpp @@ -53,6 +53,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool(); m_cgroupsBasedGrouping = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_KEY, true).toBool(); m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList(); + m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList(); migrateFromDockedItems(); } @@ -83,6 +84,11 @@ bool TaskManagerSettings::cgroupsBasedGrouping() const return m_cgroupsBasedGrouping; } +QStringList TaskManagerSettings::cgroupsBasedGroupingSkipIds() const +{ + return m_cgroupsBasedGroupingSkipAppIds; +} + QStringList TaskManagerSettings::dockedElements() const { return m_dockedElements; diff --git a/panels/dock/taskmanager/taskmanagersettings.h b/panels/dock/taskmanager/taskmanagersettings.h index 7cdbb166c..03459b503 100644 --- a/panels/dock/taskmanager/taskmanagersettings.h +++ b/panels/dock/taskmanager/taskmanagersettings.h @@ -30,6 +30,7 @@ class TaskManagerSettings : public QObject void setWindowSplit(bool split); bool cgroupsBasedGrouping() const; + QStringList cgroupsBasedGroupingSkipIds() const; void setDockedElements(const QStringList &elements); void toggleDockedElement(const QString &element); @@ -56,5 +57,6 @@ class TaskManagerSettings : public QObject bool m_windowSplit; bool m_cgroupsBasedGrouping; QStringList m_dockedElements; + QStringList m_cgroupsBasedGroupingSkipAppIds; }; }