summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qcocoamenubar.mm
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-02-08 16:37:29 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2022-02-09 18:19:57 +0100
commit851143eff14dd732fea6be10b96c0bfc798cd629 (patch)
tree0e17933e536d5c4e6972b47bea5cf96f07843f73 /src/plugins/platforms/cocoa/qcocoamenubar.mm
parent15caa47e4ba3822dc329010c3a305bc3f5662cbe (diff)
macOS: Prevent recursion when modifying the edit menu
Amends d42cfeb84faf154b46f2811b2059946b396fcc12, which would result in infinite recursion when the Edit menu was populated and added to the menubar after the menubar has been shown. Add a macOS-only test case that reproduces the crash without the fix. Fixes: QTBUG-100441 Pick-to: 6.3 Change-Id: I018a7aa7f01558a3b9732b4d6d96a911dc7fbd19 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoamenubar.mm')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenubar.mm9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm
index 365346ac8c..aaea688b39 100644
--- a/src/plugins/platforms/cocoa/qcocoamenubar.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm
@@ -196,8 +196,15 @@ void QCocoaMenuBar::syncMenu_helper(QPlatformMenu *menu, bool menubarUpdate)
const QString captionNoAmpersand = QString::fromNSString(cocoaMenu->nsMenu().title)
.remove(QLatin1Char('&'));
- if (captionNoAmpersand == QCoreApplication::translate("QCocoaMenu", "Edit"))
+ if (captionNoAmpersand == QCoreApplication::translate("QCocoaMenu", "Edit")) {
+ // prevent recursion from QCocoaMenu::insertMenuItem - when the menu is visible
+ // it calls syncMenu again. QCocoaMenu::setVisible just sets the bool, which then
+ // gets evaluated in the code after this block.
+ const bool wasVisible = cocoaMenu->isVisible();
+ cocoaMenu->setVisible(false);
insertDefaultEditItems(cocoaMenu);
+ cocoaMenu->setVisible(wasVisible);
+ }
BOOL shouldHide = YES;
if (cocoaMenu->isVisible()) {