From 8fcd3b1b1b97a127811533356b16eff32a422f4d Mon Sep 17 00:00:00 2001 From: Vladimir Belyavsky Date: Sun, 12 Nov 2023 20:06:19 +0300 Subject: [PATCH] QSystemTrayIcon: Allow resetting context menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix logic in QSystemTrayIconPrivate::updateMenu_sys() to allow resetting the tray icon menu. Now we correctly handle `nullptr` menu, and update the underlying QPlatformSystemTrayIcon instance accordingly. Also we bail out from QSystemTrayIcon::setContextMenu() early if the menu is the same. Fixes: QTBUG-119068 Pick-to: 6.5 Change-Id: I704b40dfb1a3046331aef65417655411bf3a41a0 Reviewed-by: Tor Arne Vestbø (cherry picked from commit c1d389a132d291fb404bef11de3c1b45dbfa2afc) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/util/qsystemtrayicon.cpp | 6 +++++- src/widgets/util/qsystemtrayicon_qpa.cpp | 10 +++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp index 7acbf273457..4794cde6ad1 100644 --- a/src/widgets/util/qsystemtrayicon.cpp +++ b/src/widgets/util/qsystemtrayicon.cpp @@ -162,9 +162,13 @@ void QSystemTrayIcon::setContextMenu(QMenu *menu) { Q_D(QSystemTrayIcon); QMenu *oldMenu = d->menu.data(); + if (oldMenu == menu) + return; + d->menu = menu; d->updateMenu_sys(); - if (oldMenu != menu && d->qpa_sys) { + + if (d->qpa_sys) { // Show the QMenu-based menu for QPA plugins that do not provide native menus if (oldMenu && !oldMenu->platformMenu()) QObject::disconnect(d->qpa_sys, &QPlatformSystemTrayIcon::contextMenuRequested, menu, nullptr); diff --git a/src/widgets/util/qsystemtrayicon_qpa.cpp b/src/widgets/util/qsystemtrayicon_qpa.cpp index e156cb1e572..63b24873db3 100644 --- a/src/widgets/util/qsystemtrayicon_qpa.cpp +++ b/src/widgets/util/qsystemtrayicon_qpa.cpp @@ -59,9 +59,13 @@ void QSystemTrayIconPrivate::updateIcon_sys() void QSystemTrayIconPrivate::updateMenu_sys() { #if QT_CONFIG(menu) - if (qpa_sys && menu) { - addPlatformMenu(menu); - qpa_sys->updateMenu(menu->platformMenu()); + if (qpa_sys) { + if (menu) { + addPlatformMenu(menu); + qpa_sys->updateMenu(menu->platformMenu()); + } else { + qpa_sys->updateMenu(nullptr); + } } #endif }