Skip to content

Commit aaf18e4

Browse files
committed
fix: fix async access causing invalid properties in SNI tray
1. Fixed asynchronous access issue where properties like ID and menu path were accessed before being fully initialized 2. Delayed DBusMenuImporter creation until first actual use to avoid accessing uninitialized menu path 3. Added lazy initialization pattern for menu importer to handle async property updates 4. Moved initialization logic to separate init() method to ensure proper property setup 5. Stored service name and menu path separately for later use in menu importer creation Log: Fixed system tray icon properties becoming invalid due to asynchronous initialization Influence: 1. Test system tray icons appear correctly with proper IDs 2. Verify right-click context menus work for all tray icons 3. Test tray icon tooltips display correctly 4. Verify theme changes properly update tray icon menus 5. Test tray icon activation (left-click) and context menu (right-click) functionality 6. Ensure no crashes occur during tray icon initialization fix: 修复异步访问导致SNI托盘属性无效的问题 1. 修复异步访问问题,避免在属性完全初始化前访问ID和菜单路径 2. 延迟DBusMenuImporter的创建,直到首次实际使用时才创建,避免访问未初始 化的菜单路径 3. 为菜单导入器添加懒加载模式,以处理异步属性更新 4. 将初始化逻辑移至单独的init()方法,确保属性正确设置 5. 单独存储服务名称和菜单路径,供后续创建菜单导入器时使用 Log: 修复系统托盘图标属性因异步初始化而变为无效的问题 Influence: 1. 测试系统托盘图标是否正确显示并具有正确的ID 2. 验证所有托盘图标的右键上下文菜单是否正常工作 3. 测试托盘图标工具提示是否正确显示 4. 验证主题更改是否正常更新托盘图标菜单 5. 测试托盘图标激活(左键点击)和上下文菜单(右键点击)功能 6. 确保托盘图标初始化过程中不会发生崩溃 PMS: BUG-351643
1 parent e82424b commit aaf18e4

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

plugins/application-tray/sniprotocolhandler.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,16 @@ SniTrayProtocolHandler::SniTrayProtocolHandler(const QString &sniServicePath, QO
104104
: AbstractTrayProtocolHandler(parent)
105105
, m_tooltip (new QLabel())
106106
, m_ignoreFirstAttention(true)
107+
, m_dbusMenuImporter(nullptr)
107108
{
108109
auto pair = serviceAndPath(sniServicePath);
110+
m_service = pair.first;
109111
// will get a unique dbus name (number like x.xxxx) and dbus path
110112
m_dbusUniqueName = pair.first.mid(1);
111113
m_sniInter = new StatusNotifierItem(pair.first, pair.second, QDBusConnection::sessionBus(), this);
114+
init();
112115
m_sniInter->setSync(false);
113-
m_dbusMenuImporter = new DBusMenu(pair.first, m_sniInter->menu().path(), this);
114116
m_tooltip->setForegroundRole(QPalette::BrightText);
115-
generateId();
116117

117118
connect(m_sniInter, &StatusNotifierItem::NewIcon, this, &SniTrayProtocolHandler::iconChanged);
118119
connect(m_sniInter, &StatusNotifierItem::NewOverlayIcon, this, &SniTrayProtocolHandler::overlayIconChanged);
@@ -130,7 +131,7 @@ SniTrayProtocolHandler::SniTrayProtocolHandler(const QString &sniServicePath, QO
130131
connect(m_sniInter, &StatusNotifierItem::NewToolTip, this, &SniTrayProtocolHandler::tooltiChanged);
131132
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [this](DGuiApplicationHelper::ColorType themeType) {
132133
Q_UNUSED(themeType)
133-
m_dbusMenuImporter->updateMenu(true);
134+
menuImporter()->updateMenu(true);
134135
});
135136
}
136137

@@ -139,12 +140,27 @@ SniTrayProtocolHandler::~SniTrayProtocolHandler()
139140
UTIL->removeUniqueId(m_id);
140141
}
141142

143+
void SniTrayProtocolHandler::init()
144+
{
145+
generateId();
146+
m_menuPath = m_sniInter->menu().path();
147+
}
148+
142149
void SniTrayProtocolHandler::generateId()
143150
{
144151
auto id = sniPfrefix + m_sniInter->id();
145152
m_id = UTIL->generateUniqueId(id);
146153
}
147154

155+
DBusMenuImporter *SniTrayProtocolHandler::menuImporter() const
156+
{
157+
if (!m_dbusMenuImporter) {
158+
auto that = const_cast<SniTrayProtocolHandler *>(this);
159+
that->m_dbusMenuImporter = new DBusMenu(m_service, m_menuPath, that);
160+
}
161+
return m_dbusMenuImporter;
162+
}
163+
148164
uint32_t SniTrayProtocolHandler::windowId() const
149165
{
150166
return m_sniInter->windowId();
@@ -238,7 +254,7 @@ bool SniTrayProtocolHandler::eventFilter(QObject *watched, QEvent *event)
238254
if (mouseEvent->button() == Qt::LeftButton) {
239255
m_sniInter->Activate(0, 0);
240256
} else if (mouseEvent->button() == Qt::RightButton) {
241-
auto menu = m_dbusMenuImporter->menu();
257+
auto menu = menuImporter()->menu();
242258
Q_CHECK_PTR(menu);
243259
if (menu->isEmpty()) {
244260
m_sniInter->ContextMenu(0, 0);

plugins/application-tray/sniprotocolhandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,17 @@ class SniTrayProtocolHandler : public AbstractTrayProtocolHandler
7474

7575
private:
7676
void generateId();
77+
void init();
78+
DBusMenuImporter *menuImporter() const;
7779

7880
private:
7981
QString m_dbusUniqueName;
8082
QLabel *m_tooltip;
8183
StatusNotifierItem *m_sniInter;
8284
DBusMenuImporter *m_dbusMenuImporter;
8385
QString m_id;
86+
QString m_service;
87+
QString m_menuPath;
8488
bool m_ignoreFirstAttention;
8589
};
8690
}

0 commit comments

Comments
 (0)