From 038a209985d7714e79ac2f74e8ab8de5cffbc357 Mon Sep 17 00:00:00 2001 From: Vladimir Belyavsky Date: Fri, 10 Nov 2023 18:54:40 +0300 Subject: [PATCH] QCocoaSystemTrayIcon: fix updateMenu() logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Amends da754d5b6589c9877f0325edb3da5cbc64d966c7 We should avoid registering an observer multiple times for the same NSMenu object, because it results in multiple consecutive emitActivated() calls. So, - bail out early if menu is the same, i.e. we have nothing to do - unregister an observer we added previously for the old menu Fixes: QTBUG-119053 Pick-to: 6.5 Change-Id: I14fce693dba351b1d12f2140fa8e672227cc7a9e Reviewed-by: Volker Hilsheimer Reviewed-by: Tor Arne Vestbø (cherry picked from commit 5b451efe817a0bef8ed1463fdc5ca483f34a53fd) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm index ec366f5483a..cec8301cf64 100644 --- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm +++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm @@ -184,7 +184,18 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) void QCocoaSystemTrayIcon::updateMenu(QPlatformMenu *menu) { - m_statusItem.menu = menu ? static_cast(menu)->nsMenu() : nil; + auto *nsMenu = menu ? static_cast(menu)->nsMenu() : nil; + if (m_statusItem.menu == nsMenu) + return; + + if (m_statusItem.menu) { + [NSNotificationCenter.defaultCenter removeObserver:m_delegate + name:NSMenuDidBeginTrackingNotification + object:m_statusItem.menu + ]; + } + + m_statusItem.menu = nsMenu; if (m_statusItem.menu) { // When a menu is assigned, NSStatusBarButtonCell will intercept the mouse