Skip to content

Commit 62a5b07

Browse files
committed
feat: add category-based skip list for cgroups grouping
1. 新增 DConfig 配置项 cgroupsBasedGroupingSkipCategories 2. 默认跳过 TerminalEmulator 类别的应用,避免终端中启动的程序被错误识别 3. 在 dde-apps 的 AppItem 中添加 categories 属性 4. 在 AppItemModel 中添加 CategoriesRole 5. 在 AMAppItem 构造函数中保存从 AM 获取的 categories 6. 实现 shouldSkipCgroupsByCategories() 函数,从 dde-apps 缓存读取 categories 7. 提取 tryMatchByApplicationManager() 函数,优化代码结构 8. 使用 TaskManager::CategoriesRole 枚举常量替代运行时查找 9. 优化迭代逻辑,迭代 skipCategories 而非 categories,提升性能 10. 在窗口匹配流程中集成类别检查逻辑 Log: 新增基于应用类别的 cgroups 分组跳过列表,解决终端中启动的图形程序被错误归类的问题 Influence: 1. 测试在 Alacritty 等终端模拟器中启动图形应用 2. 验证新启动的应用在任务栏显示独立图标 3. 验证 categories 从 dde-apps 缓存读取,无额外 DBus 调用 4. 检查 DConfig 配置项可正常读取和修改 5. 确认不影响非终端类应用的正常分组行为 6. 验证深度终端等原有白名单应用仍正常工作 7. 确认代码结构优化不影响功能正确性 PMS: TASK-384865
1 parent 61a07ee commit 62a5b07

File tree

11 files changed

+99
-10
lines changed

11 files changed

+99
-10
lines changed

applets/dde-apps/amappitem.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ AMAppItem::AMAppItem(const QDBusObjectPath &path, const ObjectInterfaceMap &sour
4949

5050
auto categories = appInfo.value(u8"Categories").toStringList();
5151
AppItem::setDDECategories(AppItemModel::DDECategories(CategoryUtils::parseBestMatchedCategory(categories)));
52+
AppItem::setCategories(categories);
5253

5354
auto lastLaunchedTime = appInfo.value(u8"LastLaunchedTime").toULongLong();
5455
AppItem::setLastLaunchedTime(lastLaunchedTime);

applets/dde-apps/appitem.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,16 @@ void AppItem::setDDECategories(const AppItemModel::DDECategories &categories)
9999
return setData(categories, AppItemModel::DDECategoryRole);
100100
}
101101

102+
QStringList AppItem::categories() const
103+
{
104+
return data(AppItemModel::CategoriesRole).toStringList();
105+
}
106+
107+
void AppItem::setCategories(const QStringList &categories)
108+
{
109+
return setData(categories, AppItemModel::CategoriesRole);
110+
}
111+
102112
QString AppItem::actions() const
103113
{
104114
return data(AppItemModel::ActionsRole).toString();

applets/dde-apps/appitem.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class AppItem : public QStandardItem
3939
AppItemModel::DDECategories ddeCategories() const;
4040
void setDDECategories(const AppItemModel::DDECategories &categories);
4141

42+
QStringList categories() const;
43+
void setCategories(const QStringList &categories);
44+
4245
QString actions() const;
4346
void setActions(const QString &actions);
4447

applets/dde-apps/appitemmodel.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ QHash<int, QByteArray> AppItemModel::roleNames() const
2020
{AppItemModel::NoDisplayRole, QByteArrayLiteral("noDisplay")},
2121
{AppItemModel::ActionsRole, QByteArrayLiteral("actions")},
2222
{AppItemModel::DDECategoryRole, QByteArrayLiteral("ddeCategory")},
23+
{AppItemModel::CategoriesRole, QByteArrayLiteral("categories")},
2324
{AppItemModel::InstalledTimeRole, QByteArrayLiteral("installedTime")},
2425
{AppItemModel::LastLaunchedTimeRole, QByteArrayLiteral("lastLaunchedTime")},
2526
{AppItemModel::LaunchedTimesRole, QByteArrayLiteral("launchedTimes")},

applets/dde-apps/appitemmodel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class AppItemModel : public QStandardItemModel
1919
NoDisplayRole,
2020
ActionsRole,
2121
DDECategoryRole,
22+
CategoriesRole,
2223
InstalledTimeRole,
2324
LastLaunchedTimeRole,
2425
LaunchedTimesRole,

panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@
5555
"permissions": "readwrite",
5656
"visibility": "private"
5757
},
58+
"cgroupsBasedGroupingSkipCategories": {
59+
"value": ["TerminalEmulator"],
60+
"serial": 0,
61+
"flags": [],
62+
"name": "CGroups-Based Grouping Skipped Categories",
63+
"name[zh_CN]": "基于 cgroups 的任务图标分组所应跳过的应用类别列表",
64+
"description": "List of desktop file categories that cgroups-based grouping should skip checking",
65+
"description[zh_CN]": "一个表示基于 CGroups 的应用分组所应当跳过的应用类别列表",
66+
"permissions": "readwrite",
67+
"visibility": "private"
68+
},
5869
"Docked_Items": {
5970
"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"],
6071
"serial": 0,

panels/dock/taskmanager/globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ static inline const QString TASKMANAGER_ALLOWFOCEQUIT_KEY = "Allow_Force_Quit";
2222
static inline const QString TASKMANAGER_WINDOWSPLIT_KEY = "noTaskGrouping";
2323
static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_KEY = "cgroupsBasedGrouping";
2424
static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cgroupsBasedGroupingSkipAppIds";
25+
static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = "cgroupsBasedGroupingSkipCategories";
2526
static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items";
2627
constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements";
2728

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,68 @@ static QString getDesktopIdByPid(const QStringList &identifies)
6363
qCDebug(taskManagerLog) << "appId is empty, AM failed to identify window with pid:" << windowPid;
6464
return {};
6565
}
66-
66+
6767
return QString::fromUtf8(appId);
6868
}
6969

70+
// 检查应用的 Categories 是否在跳过列表中
71+
static bool shouldSkipCgroupsByCategories(const QString &desktopId, QAbstractItemModel *activeAppModel, const QHash<int, QByteArray> &roleNames)
72+
{
73+
auto skipCategories = Settings->cgroupsBasedGroupingSkipCategories();
74+
if (skipCategories.isEmpty() || desktopId.isEmpty()) {
75+
return false;
76+
}
77+
78+
QStringList categories;
79+
80+
// 从 dde-apps 的 AppItem 读取 categories
81+
if (activeAppModel) {
82+
auto existingItem = activeAppModel->match(activeAppModel->index(0, 0), roleNames.key("desktopId"), desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0);
83+
if (existingItem.isValid()) {
84+
categories = activeAppModel->data(existingItem, TaskManager::CategoriesRole).toStringList();
85+
}
86+
}
87+
88+
if (categories.isEmpty()) {
89+
return false;
90+
}
91+
92+
// 检查是否有任何 skipCategory 在应用的 categories 中
93+
for (const QString &skipCategory : skipCategories) {
94+
if (categories.contains(skipCategory)) {
95+
qCDebug(taskManagerLog) << "Skipping cgroups grouping for" << desktopId
96+
<< "due to category:" << skipCategory;
97+
return true;
98+
}
99+
}
100+
101+
return false;
102+
}
103+
104+
// 尝试通过 AM(Application Manager) 匹配应用程序
105+
static QModelIndex tryMatchByApplicationManager(const QStringList &identifies,
106+
QAbstractItemModel *model,
107+
const QHash<int, QByteArray> &roleNames)
108+
{
109+
if (!Settings->cgroupsBasedGrouping()) {
110+
return QModelIndex();
111+
}
112+
113+
auto desktopId = getDesktopIdByPid(identifies);
114+
if (desktopId.isEmpty() ||
115+
Settings->cgroupsBasedGroupingSkipIds().contains(desktopId) ||
116+
shouldSkipCgroupsByCategories(desktopId, model, roleNames)) {
117+
return QModelIndex();
118+
}
119+
120+
auto res = model->match(model->index(0, 0), roleNames.key(MODEL_DESKTOPID),
121+
desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0);
122+
if (res.isValid()) {
123+
qCDebug(taskManagerLog) << "matched by AM desktop ID:" << desktopId << res;
124+
}
125+
return res;
126+
}
127+
70128
class BoolFilterModel : public QSortFilterProxyModel, public AbstractTaskManagerInterface
71129
{
72130
Q_OBJECT
@@ -157,15 +215,9 @@ bool TaskManager::init()
157215
}
158216

159217
// 尝试通过AM(Application Manager)匹配应用程序
160-
if (Settings->cgroupsBasedGrouping()) {
161-
auto desktopId = getDesktopIdByPid(identifies);
162-
if (!desktopId.isEmpty() && !Settings->cgroupsBasedGroupingSkipIds().contains(desktopId)) {
163-
auto res = model->match(model->index(0, 0), roleNames.key(MODEL_DESKTOPID), desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0);
164-
if (res.isValid()) {
165-
qCDebug(taskManagerLog) << "matched by AM desktop ID:" << desktopId << res;
166-
return res;
167-
}
168-
}
218+
auto amMatchResult = tryMatchByApplicationManager(identifies, model, roleNames);
219+
if (amMatchResult.isValid()) {
220+
return amMatchResult;
169221
}
170222

171223
auto res = model->match(model->index(0, 0), roleNames.key(MODEL_DESKTOPID), identifies.value(0), 1, Qt::MatchEndsWith);

panels/dock/taskmanager/taskmanager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage
5151
NoDisplayRole,
5252
ActionsRole,
5353
DDECategoryRole,
54+
CategoriesRole,
5455
InstalledTimeRole,
5556
LastLaunchedTimeRole,
5657
LaunchedTimesRole,

panels/dock/taskmanager/taskmanagersettings.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
5454
m_cgroupsBasedGrouping = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_KEY, true).toBool();
5555
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
5656
m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList();
57+
m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList();
5758
migrateFromDockedItems();
5859
}
5960

@@ -89,6 +90,11 @@ QStringList TaskManagerSettings::cgroupsBasedGroupingSkipIds() const
8990
return m_cgroupsBasedGroupingSkipAppIds;
9091
}
9192

93+
QStringList TaskManagerSettings::cgroupsBasedGroupingSkipCategories() const
94+
{
95+
return m_cgroupsBasedGroupingSkipCategories;
96+
}
97+
9298
QStringList TaskManagerSettings::dockedElements() const
9399
{
94100
return m_dockedElements;

0 commit comments

Comments
 (0)