Skip to content

Commit bcde740

Browse files
committed
feat: add window icon whitelist for dock task manager
1. Add a new dconfig setting "windowIconWhitelist" with default value ["wechat"] 2. When window split mode is enabled, the dock now checks the whitelist to decide whether to use window icons instead of app icons for specific applications 3. Fix model reset in DockItemModel::setSourceModel to use beginResetModel/endResetModel instead of manual row insertion/removal for better model consistency 4. Update X11 window monitor to trigger icon update when a new window is mapped The window icon whitelist is needed for apps like WeChat that provide superior window icon quality compared to their app icons, enhancing the visual experience when window split is disabled. Log: Added window icon whitelist config for dock task manager Influence: 1. Verify WeChat and other whitelisted apps display correct icons when window split is disabled 2. Test default whitelist behavior with WeChat running 3. Check that non-whitelisted apps still use app icons when window split is disabled 4. Test the new dconfig setting can be modified and persists correctly 5. Ensure DockItemModel resets work correctly without data corruption 6. Verify X11 window monitor still functions properly with icon update call feat: 为任务栏任务管理器添加窗口图标白名单功能 1. 添加新的 dconfig 设置"windowIconWhitelist",默认值为["wechat"] 2. 当窗口拆分模式启用时,任务栏会检查白名单,决定是否对特定应用使用窗口 图标而非应用图标 3. 修复 DockItemModel::setSourceModel 中的模型重置,改用 beginResetModel/endResetModel 替代手动行插入/删除,以提高模型一致性 4. 更新 X11 窗口监视器,在新窗口映射时触发图标更新 对于微信等提供比应用图标更优质窗口图标的应用,窗口图标白名单是必要的,可 在窗口拆分禁用时提升视觉体验。 Log: 为任务栏添加窗口图标白名单配置 Influence: 1. 验证在白名单中的应用(如微信)在禁用窗口拆分时显示正确图标 2. 使用微信测试默认白名单行为 3. 检查非白名单应用在禁用窗口拆分时仍使用应用图标 4. 测试新的 dconfig 设置可以被修改并持久保存 5. 确保 DockItemModel 重置操作正常,无数据损坏 6. 验证 X11 窗口监视器在添加图标更新调用后仍正常工作 PMS: TASK-389031
1 parent c0cddd1 commit bcde740

6 files changed

Lines changed: 35 additions & 15 deletions

File tree

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,17 @@
9696
"description": "The items which is docked when dock is started.",
9797
"permissions": "readwrite",
9898
"visibility": "private"
99+
},
100+
"windowIconWhitelist": {
101+
"value": ["com.tencent.wechat"],
102+
"serial": 0,
103+
"flags": [],
104+
"name": "windowIconWhitelist",
105+
"name[zh_CN]": "窗口图标白名单",
106+
"description": "List of app id that should prefer window icon when window split is disabled",
107+
"permissions": "readwrite",
108+
"visibility": "private"
99109
}
110+
100111
}
101112
}

panels/dock/taskmanager/dockcombinemodel.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -7,7 +7,7 @@
77
#include "globals.h"
88
#include "rolecombinemodel.h"
99
#include "taskmanager.h"
10-
10+
#include "taskmanagersettings.h"
1111
namespace dock
1212
{
1313
DockCombineModel::DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent)
@@ -55,7 +55,16 @@ QVariant DockCombineModel::data(const QModelIndex &index, int role) const
5555
return res;
5656
}
5757
case TaskManager::IconNameRole: {
58-
QString winTitle = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
58+
if (TaskManagerSettings::instance()->isWindowSplit()) {
59+
auto desktopId = data(index, TaskManager::DesktopIdRole).toString();
60+
auto whitelist = TaskManagerSettings::instance()->windowIconWhitelist();
61+
if (whitelist.contains(desktopId)) {
62+
auto winIcon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
63+
if (!winIcon.isEmpty()) {
64+
return winIcon;
65+
}
66+
}
67+
}
5968
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
6069
if (icon.isEmpty()) {
6170
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();

panels/dock/taskmanager/dockitemmodel.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,9 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model)
4848
sourceModel()->disconnect(this);
4949
}
5050

51-
auto currentCount = this->rowCount();
52-
auto newCount = model->rowCount();
51+
beginResetModel();
5352
QAbstractProxyModel::setSourceModel(model);
54-
55-
if (newCount > currentCount) {
56-
beginInsertRows(QModelIndex(), currentCount, newCount - 1);
57-
endInsertRows();
58-
} else if (newCount < currentCount) {
59-
beginRemoveRows(QModelIndex(), newCount, currentCount);
60-
endRemoveRows();
61-
}
53+
endResetModel();
6254

6355
connect(sourceModel(), &QAbstractItemModel::rowsInserted, this, [this](const QModelIndex &parent, int first, int last) {
6456
if (parent.isValid() || m_isUpdating)
@@ -87,8 +79,6 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model)
8779
endMoveRows();
8880
});
8981

90-
auto bottomRight = this->index(std::min(currentCount, newCount), 0);
91-
Q_EMIT dataChanged(index(0, 0), bottomRight);
9282
m_isUpdating = false;
9383
}
9484

panels/dock/taskmanager/globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cg
2626
static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = "cgroupsBasedGroupingSkipCategories";
2727
static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items";
2828
constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements";
29+
constexpr auto TASKMANAGER_WINDOW_ICON_WHITELIST_KEY = "windowIconWhitelist";
2930

3031
// model roleNames
3132
constexpr auto MODEL_WINID = "winId";

panels/dock/taskmanager/taskmanagersettings.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
6868
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
6969
m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList();
7070
m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList();
71+
m_windowIconWhitelist = m_taskManagerDconfig->value(TASKMANAGER_WINDOW_ICON_WHITELIST_KEY, {"com.tencent.wechat"}).toStringList();
7172
migrateFromDockedItems();
7273
}
7374

@@ -113,6 +114,11 @@ QStringList TaskManagerSettings::cgroupsBasedGroupingSkipCategories() const
113114
return m_cgroupsBasedGroupingSkipCategories;
114115
}
115116

117+
QStringList TaskManagerSettings::windowIconWhitelist() const
118+
{
119+
return m_windowIconWhitelist;
120+
}
121+
116122
QStringList TaskManagerSettings::dockedElements() const
117123
{
118124
return m_dockedElements;

panels/dock/taskmanager/taskmanagersettings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class TaskManagerSettings : public QObject
3535
QStringList cgroupsBasedGroupingSkipIds() const;
3636
QStringList cgroupsBasedGroupingSkipCategories() const;
3737

38+
QStringList windowIconWhitelist() const;
39+
3840
void setDockedElements(const QStringList &elements);
3941
void toggleDockedElement(const QString &element);
4042
void appendDockedElement(const QString &element);
@@ -64,6 +66,7 @@ class TaskManagerSettings : public QObject
6466
bool m_windowSplit;
6567
bool m_cgroupsBasedGrouping;
6668
QStringList m_dockedElements;
69+
QStringList m_windowIconWhitelist;
6770
QStringList m_cgroupsBasedGroupingSkipAppIds;
6871
QStringList m_cgroupsBasedGroupingSkipCategories;
6972
};

0 commit comments

Comments
 (0)