任务栏(dock)的图标与对应窗口的映射发生错乱。点击某个应用图标时,激活的是另一个应用的窗口。例如:点击"终端"图标弹出的是 SecureCRT,点击"微信"图标弹出的是终端。
以下信息通过实际工具输出确认,非推测:
busctl --user tree org.deepin.ds.Dock
busctl --user introspect
dde-shell@DDE.service
systemctl --user restart dde-shell@DDE.service
阅读了 dde-shell 2.0.42 源码(克隆自 linuxdeepin/dde-shell):
linuxdeepin/dde-shell
数据模型链:
DockGlobalElementModel (QAbstractListModel, 维护 m_data) → DockItemModel (QAbstractProxyModel, 1:1 代理) → QML DelegateModel (visualModel, 维护 items-to-model 映射表) → 每个 delegate 使用 visualModel.modelIndex(index) 取模型索引
点击处理路径(TaskManager.qml 第 85-139 行):
TaskManager.qml
model: DelegateModel { id: visualModel model: taskmanager.Applet.dataModel // DockItemModel delegate: Item { required property int index property var modelIndex: visualModel.modelIndex(index) onClicked: { let index = root.modelIndex; TaskManager.requestActivate(index); } } }
注意到的代码特征:
DockGlobalElementModel(dockglobalelementmodel.cpp)中大量使用 Qt::QueuedConnection 处理模型变更信号:
DockGlobalElementModel
dockglobalelementmodel.cpp
Qt::QueuedConnection
m_appsModel
rowsRemoved
m_activeAppModel
rowsInserted
dataChanged
以下为基于代码分析的推测,未在运行中的进程内验证:
DBus 数据正确但视觉映射错误,说明断层在 DBus 暴露的 C++ 模型层之下、QML 渲染层之上。DelegateModel 的 modelIndex(index) 是唯一位于这个区间且维护独立映射表的组件。
modelIndex(index)
可能机制:Qt 的 DelegateModel 内部维护 items-to-model 映射表,通过监听模型的 rowsInserted/rowsRemoved 等信号增量更新。当 DockGlobalElementModel 通过 QueuedConnection 异步发出变更信号时,若短时间内有多个插入/删除/移动操作交叉,DelegateModel 收到的增量更新可能与实际模型状态产生偏差。长时间运行后偏差累积,映射表错乱。
需要开发者确认的点:
panels/dock/taskmanager/package/TaskManager.qml
panels/dock/taskmanager/dockglobalelementmodel.cpp
panels/dock/taskmanager/dockitemmodel.cpp
No replies yet
Featured Collection
Popular Ranking
Popular Events
dde-shell dock 图标映射错乱 bug
环境
现象
任务栏(dock)的图标与对应窗口的映射发生错乱。点击某个应用图标时,激活的是另一个应用的窗口。例如:点击"终端"图标弹出的是 SecureCRT,点击"微信"图标弹出的是终端。
已验证的事实
以下信息通过实际工具输出确认,非推测:
busctl --user tree org.deepin.ds.Dock和busctl --user introspect实际读取了每个 AppItem 的 id/name/icon 属性,数据与预期一致dde-shell@DDE.service(systemctl --user restart dde-shell@DDE.service)后问题消失 — 实际执行并验证架构分析(基于源码阅读,非运行时调试)
阅读了 dde-shell 2.0.42 源码(克隆自
linuxdeepin/dde-shell):数据模型链:
点击处理路径(
TaskManager.qml第 85-139 行):注意到的代码特征:
DockGlobalElementModel(dockglobalelementmodel.cpp)中大量使用Qt::QueuedConnection处理模型变更信号:m_appsModel的rowsRemovedm_activeAppModel的rowsInsertedm_activeAppModel的rowsRemovedm_activeAppModel的dataChanged推测(未通过运行时调试确认)
以下为基于代码分析的推测,未在运行中的进程内验证:
DBus 数据正确但视觉映射错误,说明断层在 DBus 暴露的 C++ 模型层之下、QML 渲染层之上。DelegateModel 的
modelIndex(index)是唯一位于这个区间且维护独立映射表的组件。可能机制:Qt 的 DelegateModel 内部维护 items-to-model 映射表,通过监听模型的 rowsInserted/rowsRemoved 等信号增量更新。当 DockGlobalElementModel 通过 QueuedConnection 异步发出变更信号时,若短时间内有多个插入/删除/移动操作交叉,DelegateModel 收到的增量更新可能与实际模型状态产生偏差。长时间运行后偏差累积,映射表错乱。
需要开发者确认的点:
建议
相关文件
panels/dock/taskmanager/package/TaskManager.qml— DelegateModel 使用处panels/dock/taskmanager/dockglobalelementmodel.cpp— 数据模型,QueuedConnection 信号处理panels/dock/taskmanager/dockitemmodel.cpp— QAbstractProxyModel 代理层