Skip to content

Commit f68c4f6

Browse files
18202781743deepin-bot[bot]
authored andcommitted
fix: prevent dockHiddenSurfaceIds from being reset to empty
The commit refactors the save logic for tray sort order data to prevent `dockHiddenSurfaceIds` from being accidentally cleared. Previously, `onAvailableSurfacesChanged()` called `saveDataToDConfig()` which saved all configuration values, including `dockHiddenSurfaceIds`, at a point where other processes might be concurrently modifying this value, leading to a race condition where it could be overwritten with empty data. The fix splits the monolithic `saveDataToDConfig()` into targeted save methods: `saveSortOrderToDConfig()`, `saveHiddenIdsToDConfig()`, `saveDockHiddenIdsToDConfig()`, and `saveCollapsedToDConfig()`. In `onAvailableSurfacesChanged()`, only sort order and hidden IDs are saved, deliberately excluding `dockHiddenSurfaceIds` to avoid the race condition. The `dockHiddenSurfaceIds` is now only saved from `setDockVisible()` via the new `saveDockHiddenIdsToDConfig()` method, when the value is explicitly changed. Influence: 1. Test tray plugin visibility toggling and verify `dockHiddenSurfaceIds` persists correctly 2. Verify `hiddenSurfaceIds` and sort order still update properly on surface changes 3. Test scenarios where multiple processes might modify dock configuration simultaneously 4. Verify no data loss occurs when hiding/showing dock tray items 5. Test that collapsed state saves and loads correctly fix: 修复 dockHiddenSurfaceIds 被意外重置为空的问题 本次重构了托盘排序数据的保存逻辑,防止 `dockHiddenSurfaceIds` 被意外清 空。之前 `onAvailableSurfacesChanged()` 调用 `saveDataToDConfig()` 会保 存所有配置值,包括 `dockHiddenSurfaceIds`,而此时其他进程可能正在并发修 改该值,导致竞态条件,使其被空数据覆盖。 修复方案将单一的 `saveDataToDConfig()` 拆分为针对性的保存方 法:`saveSortOrderToDConfig()`、`saveHiddenIdsToDConfig()`、 `saveDockHiddenIdsToDConfig()` 和 `saveCollapsedToDConfig()`。 在 `onAvailableSurfacesChanged()` 中,只保存排序和隐藏 ID,刻意排 除 `dockHiddenSurfaceIds` 以避免竞态条件。`dockHiddenSurfaceIds` 现在仅在通过 `setDockVisible()` 显式修改时,通过新增的 `saveDockHiddenIdsToDConfig()` 方法保存。 Influence: 1. 测试托盘插件的可见性切换,验证 `dockHiddenSurfaceIds` 是否持久化保存 2. 验证在 surface 变化时 `hiddenSurfaceIds` 和排序是否正常更新 3. 测试多个进程同时修改 dock 配置的场景 4. 验证显示/隐藏 dock 托盘项时数据不会丢失 5. 测试折叠状态的保存和加载是否正常 PMS:BUG-363149
1 parent 889ea78 commit f68c4f6

2 files changed

Lines changed: 39 additions & 4 deletions

File tree

panels/dock/tray/traysortordermodel.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ TraySortOrderModel::TraySortOrderModel(QObject *parent)
5757
connect(this, &TraySortOrderModel::collapsedChanged, this, [this](){
5858
qDebug() << "collapsedChanged";
5959
updateVisualIndexes();
60-
saveDataToDConfig();
60+
saveCollapsedToDConfig();
6161
});
6262
connect(this, &TraySortOrderModel::actionsAlwaysVisibleChanged, this, [this](){
6363
qDebug() << "actionsAlwaysVisibleChanged";
@@ -223,6 +223,7 @@ void TraySortOrderModel::setSurfaceVisible(const QString &surfaceId, bool visibl
223223
}
224224
handlePluginVisibleChanged(surfaceId, visible);
225225
updateVisualIndexes();
226+
saveHiddenIdsToDConfig();
226227
}
227228

228229
bool TraySortOrderModel::isDisplayedSurface(const QString &surfaceId) const
@@ -242,7 +243,7 @@ void TraySortOrderModel::setDockVisible(const QString &surfaceId, bool visible)
242243
}
243244
}
244245
updateVisualIndexes();
245-
saveDataToDConfig();
246+
saveDockHiddenIdsToDConfig();
246247
}
247248

248249
bool TraySortOrderModel::isDockVisible(const QString &surfaceId) const
@@ -547,12 +548,37 @@ void TraySortOrderModel::loadDataFromDConfig()
547548
}
548549

549550
void TraySortOrderModel::saveDataToDConfig()
551+
{
552+
saveSortOrderToDConfig();
553+
saveHiddenDataToDConfig();
554+
saveCollapsedToDConfig();
555+
}
556+
557+
void TraySortOrderModel::saveSortOrderToDConfig()
550558
{
551559
m_dconfig->setValue("stashedSurfaceIds", m_stashedIds);
552560
m_dconfig->setValue("collapsableSurfaceIds", m_collapsableIds);
553561
m_dconfig->setValue("pinnedSurfaceIds", m_pinnedIds);
562+
}
563+
564+
void TraySortOrderModel::saveHiddenDataToDConfig()
565+
{
566+
saveHiddenIdsToDConfig();
567+
saveDockHiddenIdsToDConfig();
568+
}
569+
570+
void TraySortOrderModel::saveHiddenIdsToDConfig()
571+
{
554572
m_dconfig->setValue("hiddenSurfaceIds", m_hiddenIds);
573+
}
574+
575+
void TraySortOrderModel::saveDockHiddenIdsToDConfig()
576+
{
555577
m_dconfig->setValue("dockHiddenSurfaceIds", m_dockHiddenIds);
578+
}
579+
580+
void TraySortOrderModel::saveCollapsedToDConfig()
581+
{
556582
m_dconfig->setValue("isCollapsed", m_collapsed);
557583
}
558584

@@ -575,8 +601,12 @@ void TraySortOrderModel::onAvailableSurfacesChanged()
575601
}
576602
// finally, update visual index
577603
updateVisualIndexes();
578-
// and also save the current sort order
579-
saveDataToDConfig();
604+
// Save only the data that onAvailableSurfacesChanged may have modified:
605+
// - section lists (via registerSurfaceId → findSection → registerToSection)
606+
// - hiddenIds (via findSection's default-hide logic)
607+
// Do NOT save dockHiddenSurfaceIds here to avoid race conditions with other processes.
608+
saveSortOrderToDConfig();
609+
saveHiddenIdsToDConfig();
580610
}
581611

582612
void TraySortOrderModel::handlePluginVisibleChanged(const QString &surfaceId, bool visible)

panels/dock/tray/traysortordermodel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ class TraySortOrderModel : public QStandardItemModel
123123
QString registerSurfaceId(const QVariantMap &surfaceData);
124124
void loadDataFromDConfig();
125125
void saveDataToDConfig();
126+
void saveSortOrderToDConfig();
127+
void saveHiddenDataToDConfig();
128+
void saveHiddenIdsToDConfig();
129+
void saveDockHiddenIdsToDConfig();
130+
void saveCollapsedToDConfig();
126131
void handlePluginVisibleChanged(const QString &surfaceId, bool visible);
127132

128133
private slots:

0 commit comments

Comments
 (0)