diff --git a/applets/dde-apps/amappitem.cpp b/applets/dde-apps/amappitem.cpp index 6cf3261a9..550b3d98c 100644 --- a/applets/dde-apps/amappitem.cpp +++ b/applets/dde-apps/amappitem.cpp @@ -49,6 +49,7 @@ AMAppItem::AMAppItem(const QDBusObjectPath &path, const ObjectInterfaceMap &sour auto categories = appInfo.value(u8"Categories").toStringList(); AppItem::setDDECategories(AppItemModel::DDECategories(CategoryUtils::parseBestMatchedCategory(categories))); + AppItem::setCategories(categories); auto lastLaunchedTime = appInfo.value(u8"LastLaunchedTime").toULongLong(); AppItem::setLastLaunchedTime(lastLaunchedTime); diff --git a/applets/dde-apps/appitem.cpp b/applets/dde-apps/appitem.cpp index bb7577833..5e9843b3b 100644 --- a/applets/dde-apps/appitem.cpp +++ b/applets/dde-apps/appitem.cpp @@ -99,6 +99,16 @@ void AppItem::setDDECategories(const AppItemModel::DDECategories &categories) return setData(categories, AppItemModel::DDECategoryRole); } +QStringList AppItem::categories() const +{ + return data(AppItemModel::CategoriesRole).toStringList(); +} + +void AppItem::setCategories(const QStringList &categories) +{ + return setData(categories, AppItemModel::CategoriesRole); +} + QString AppItem::actions() const { return data(AppItemModel::ActionsRole).toString(); diff --git a/applets/dde-apps/appitem.h b/applets/dde-apps/appitem.h index f67926a61..0dad6edf1 100644 --- a/applets/dde-apps/appitem.h +++ b/applets/dde-apps/appitem.h @@ -39,6 +39,9 @@ class AppItem : public QStandardItem AppItemModel::DDECategories ddeCategories() const; void setDDECategories(const AppItemModel::DDECategories &categories); + QStringList categories() const; + void setCategories(const QStringList &categories); + QString actions() const; void setActions(const QString &actions); diff --git a/applets/dde-apps/appitemmodel.cpp b/applets/dde-apps/appitemmodel.cpp index aa4db5811..6f9ab9534 100644 --- a/applets/dde-apps/appitemmodel.cpp +++ b/applets/dde-apps/appitemmodel.cpp @@ -20,6 +20,7 @@ QHash AppItemModel::roleNames() const {AppItemModel::NoDisplayRole, QByteArrayLiteral("noDisplay")}, {AppItemModel::ActionsRole, QByteArrayLiteral("actions")}, {AppItemModel::DDECategoryRole, QByteArrayLiteral("ddeCategory")}, + {AppItemModel::CategoriesRole, QByteArrayLiteral("categories")}, {AppItemModel::InstalledTimeRole, QByteArrayLiteral("installedTime")}, {AppItemModel::LastLaunchedTimeRole, QByteArrayLiteral("lastLaunchedTime")}, {AppItemModel::LaunchedTimesRole, QByteArrayLiteral("launchedTimes")}, diff --git a/applets/dde-apps/appitemmodel.h b/applets/dde-apps/appitemmodel.h index 3626e55bf..4b75314c1 100644 --- a/applets/dde-apps/appitemmodel.h +++ b/applets/dde-apps/appitemmodel.h @@ -19,6 +19,7 @@ class AppItemModel : public QStandardItemModel NoDisplayRole, ActionsRole, DDECategoryRole, + CategoriesRole, InstalledTimeRole, LastLaunchedTimeRole, LaunchedTimesRole, 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 cf7141f78..f94670831 100644 --- a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json +++ b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json @@ -55,6 +55,17 @@ "permissions": "readwrite", "visibility": "private" }, + "cgroupsBasedGroupingSkipCategories": { + "value": ["TerminalEmulator"], + "serial": 0, + "flags": [], + "name": "CGroups-Based Grouping Skipped Categories", + "name[zh_CN]": "基于 cgroups 的任务图标分组所应跳过的应用类别列表", + "description": "List of desktop file categories that cgroups-based grouping should skip checking", + "description[zh_CN]": "一个表示基于 CGroups 的应用分组所应当跳过的应用类别列表", + "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 32c57697d..240f17969 100644 --- a/panels/dock/taskmanager/globals.h +++ b/panels/dock/taskmanager/globals.h @@ -22,6 +22,7 @@ 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_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = "cgroupsBasedGroupingSkipCategories"; 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 cc1b2d969..93148f380 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -63,10 +63,44 @@ static QString getDesktopIdByPid(const QStringList &identifies) qCDebug(taskManagerLog) << "appId is empty, AM failed to identify window with pid:" << windowPid; return {}; } - + return QString::fromUtf8(appId); } +// 检查应用的 Categories 是否在跳过列表中 +static bool shouldSkipCgroupsByCategories(const QString &desktopId, QAbstractItemModel *activeAppModel, const QHash &roleNames) +{ + auto skipCategories = Settings->cgroupsBasedGroupingSkipCategories(); + if (skipCategories.isEmpty() || desktopId.isEmpty()) { + return false; + } + + QStringList categories; + + // 从 dde-apps 的 AppItem 读取 categories + if (activeAppModel) { + auto existingItem = activeAppModel->match(activeAppModel->index(0, 0), roleNames.key("desktopId"), desktopId, 1, Qt::MatchFixedString | Qt::MatchWrap).value(0); + if (existingItem.isValid()) { + categories = activeAppModel->data(existingItem, roleNames.key("categories")).toStringList(); + } + } + + if (categories.isEmpty()) { + return false; + } + + // 检查是否有任何 category 在跳过列表中 + for (const QString &category : categories) { + if (skipCategories.contains(category)) { + qCDebug(taskManagerLog) << "Skipping cgroups grouping for" << desktopId + << "due to category:" << category; + return true; + } + } + + return false; +} + class BoolFilterModel : public QSortFilterProxyModel, public AbstractTaskManagerInterface { Q_OBJECT @@ -159,7 +193,9 @@ bool TaskManager::init() // 尝试通过AM(Application Manager)匹配应用程序 if (Settings->cgroupsBasedGrouping()) { auto desktopId = getDesktopIdByPid(identifies); - if (!desktopId.isEmpty() && !Settings->cgroupsBasedGroupingSkipIds().contains(desktopId)) { + if (!desktopId.isEmpty() && + !Settings->cgroupsBasedGroupingSkipIds().contains(desktopId) && + !shouldSkipCgroupsByCategories(desktopId, model, roleNames)) { 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; diff --git a/panels/dock/taskmanager/taskmanager.h b/panels/dock/taskmanager/taskmanager.h index d4cabf9c8..6c4a61ac8 100644 --- a/panels/dock/taskmanager/taskmanager.h +++ b/panels/dock/taskmanager/taskmanager.h @@ -51,6 +51,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage NoDisplayRole, ActionsRole, DDECategoryRole, + CategoriesRole, InstalledTimeRole, LastLaunchedTimeRole, LaunchedTimesRole, diff --git a/panels/dock/taskmanager/taskmanagersettings.cpp b/panels/dock/taskmanager/taskmanagersettings.cpp index 02e03f659..0bed074ba 100644 --- a/panels/dock/taskmanager/taskmanagersettings.cpp +++ b/panels/dock/taskmanager/taskmanagersettings.cpp @@ -54,6 +54,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) 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(); + m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList(); migrateFromDockedItems(); } @@ -89,6 +90,11 @@ QStringList TaskManagerSettings::cgroupsBasedGroupingSkipIds() const return m_cgroupsBasedGroupingSkipAppIds; } +QStringList TaskManagerSettings::cgroupsBasedGroupingSkipCategories() const +{ + return m_cgroupsBasedGroupingSkipCategories; +} + QStringList TaskManagerSettings::dockedElements() const { return m_dockedElements; diff --git a/panels/dock/taskmanager/taskmanagersettings.h b/panels/dock/taskmanager/taskmanagersettings.h index 03459b503..aeb369e22 100644 --- a/panels/dock/taskmanager/taskmanagersettings.h +++ b/panels/dock/taskmanager/taskmanagersettings.h @@ -31,6 +31,7 @@ class TaskManagerSettings : public QObject bool cgroupsBasedGrouping() const; QStringList cgroupsBasedGroupingSkipIds() const; + QStringList cgroupsBasedGroupingSkipCategories() const; void setDockedElements(const QStringList &elements); void toggleDockedElement(const QString &element); @@ -58,5 +59,6 @@ class TaskManagerSettings : public QObject bool m_cgroupsBasedGrouping; QStringList m_dockedElements; QStringList m_cgroupsBasedGroupingSkipAppIds; + QStringList m_cgroupsBasedGroupingSkipCategories; }; }