@@ -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+
70128class 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);
0 commit comments