Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,17 @@
"description": "The items which is docked when dock is started.",
"permissions": "readwrite",
"visibility": "private"
},
"windowIconWhitelist": {
"value": ["wechat"],
"serial": 0,
"flags": [],
"name": "windowIconWhitelist",
"name[zh_CN]": "窗口图标白名单",
"description": "List of app id that should prefer window icon when window split is disabled",
"permissions": "readwrite",
"visibility": "private"
}

}
}
22 changes: 18 additions & 4 deletions panels/dock/taskmanager/dockcombinemodel.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

Expand All @@ -7,7 +7,7 @@
#include "globals.h"
#include "rolecombinemodel.h"
#include "taskmanager.h"

#include "taskmanagersettings.h"
namespace dock
{
DockCombineModel::DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent)
Expand Down Expand Up @@ -55,10 +55,24 @@ QVariant DockCombineModel::data(const QModelIndex &index, int role) const
return res;
}
case TaskManager::IconNameRole: {
QString winTitle = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
auto winIcon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
bool useWinIcon = false;
if (!winIcon.isEmpty() && TaskManagerSettings::instance()->isWindowSplit()) {
auto desktopId = data(index, TaskManager::DesktopIdRole).toString();
auto whitelist = TaskManagerSettings::instance()->windowIconWhitelist();
for (const auto &id : whitelist) {
if (desktopId.contains(id)) {
useWinIcon = true;
break;
}
}
}
if (useWinIcon) {
return winIcon;
}
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
if (icon.isEmpty()) {
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
icon = winIcon;
}
return icon;
}
Expand Down
14 changes: 2 additions & 12 deletions panels/dock/taskmanager/dockitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,9 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model)
sourceModel()->disconnect(this);
}

auto currentCount = this->rowCount();
auto newCount = model->rowCount();
beginResetModel();
QAbstractProxyModel::setSourceModel(model);

if (newCount > currentCount) {
beginInsertRows(QModelIndex(), currentCount, newCount - 1);
endInsertRows();
} else if (newCount < currentCount) {
beginRemoveRows(QModelIndex(), newCount, currentCount);
endRemoveRows();
}
endResetModel();

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

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

Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cg
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";
constexpr auto TASKMANAGER_WINDOW_ICON_WHITELIST_KEY = "windowIconWhitelist";

// model roleNames
constexpr auto MODEL_WINID = "winId";
Expand Down
6 changes: 6 additions & 0 deletions panels/dock/taskmanager/taskmanagersettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
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();
m_windowIconWhitelist = m_taskManagerDconfig->value(TASKMANAGER_WINDOW_ICON_WHITELIST_KEY, {"wechat"}).toStringList();
migrateFromDockedItems();
}

Expand Down Expand Up @@ -104,7 +105,12 @@
return m_cgroupsBasedGroupingSkipCategories;
}

QStringList TaskManagerSettings::windowIconWhitelist() const

Check warning on line 108 in panels/dock/taskmanager/taskmanagersettings.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'windowIconWhitelist' is never used.
{
return m_windowIconWhitelist;
}

QStringList TaskManagerSettings::dockedElements() const

Check warning on line 113 in panels/dock/taskmanager/taskmanagersettings.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'dockedElements' is never used.
{
return m_dockedElements;
}
Expand Down
3 changes: 3 additions & 0 deletions panels/dock/taskmanager/taskmanagersettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class TaskManagerSettings : public QObject
QStringList cgroupsBasedGroupingSkipIds() const;
QStringList cgroupsBasedGroupingSkipCategories() const;

QStringList windowIconWhitelist() const;

void setDockedElements(const QStringList &elements);
void toggleDockedElement(const QString &element);
void appendDockedElement(const QString &element);
Expand Down Expand Up @@ -62,6 +64,7 @@ class TaskManagerSettings : public QObject
bool m_windowSplit;
bool m_cgroupsBasedGrouping;
QStringList m_dockedElements;
QStringList m_windowIconWhitelist;
QStringList m_cgroupsBasedGroupingSkipAppIds;
QStringList m_cgroupsBasedGroupingSkipCategories;
};
Expand Down
2 changes: 2 additions & 0 deletions panels/dock/taskmanager/x11windowmonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ void X11WindowMonitor::onWindowMapped(xcb_window_t xcb_window)
uint32_t value_list[] = { XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_VISIBILITY_CHANGE};
xcb_change_window_attributes(X11->getXcbConnection(), xcb_window, XCB_CW_EVENT_MASK, value_list);
trackWindow(window.get());

window->updateIcon();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question (bug_risk): Check for any ordering assumptions between updateIcon() and windowAdded.

Calling updateIcon() before emitting windowAdded changes the lifecycle: listeners now see a window whose icon may already be updated, and any signals from updateIcon() fire first. Please confirm that no existing windowAdded consumers assume they run before icon‑related updates; if they do, consider keeping updateIcon() after windowAdded or clearly documenting this new ordering.

Q_EMIT AbstractWindowMonitor::windowAdded(static_cast<QPointer<AbstractWindow>>(window.get()));
}

Expand Down
Loading