summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qcocoamenuitem.mm
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2014-09-25 19:53:49 +0200
committerGabriel de Dietrich <gabriel.dedietrich@digia.com>2014-09-29 13:38:57 +0200
commit996054f5e65bc676aaea0743c2eacec51918e4aa (patch)
tree413274a193878db1f0fc6171232bb93b4d8858f1 /src/plugins/platforms/cocoa/qcocoamenuitem.mm
parent9dcc3a57282f60e2394a2a54fc0a735a4240c5c8 (diff)
QCocoaMenu: Keep a reference to the containing menu item
This allows the menu to tell its containing item the menu got deleted. This removes the need to reset the COCOA_MENU_ANCESTOR property value, which would crash since QCocoaMenuItem::m_menu would be a dangling pointer. Task-number: QTBUG-41587 Change-Id: Ia3408ef85cf823bfddbc2c41d6534e43bf14ed29 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoamenuitem.mm')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index 4b9a0146a9..f686c0a838 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -131,13 +131,19 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu)
{
if (menu == m_menu)
return;
- if (m_menu && COCOA_MENU_ANCESTOR(m_menu) == this)
- SET_COCOA_MENU_ANCESTOR(m_menu, 0);
+
+ if (m_menu) {
+ if (COCOA_MENU_ANCESTOR(m_menu) == this)
+ SET_COCOA_MENU_ANCESTOR(m_menu, 0);
+ if (m_menu->containingMenuItem() == this)
+ m_menu->setContainingMenuItem(0);
+ }
QCocoaAutoReleasePool pool;
m_menu = static_cast<QCocoaMenu *>(menu);
if (m_menu) {
SET_COCOA_MENU_ANCESTOR(m_menu, this);
+ m_menu->setContainingMenuItem(this);
} else {
// we previously had a menu, but no longer
// clear out our item so the nexy sync() call builds a new one
@@ -146,6 +152,12 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu)
}
}
+void QCocoaMenuItem::clearMenu(QCocoaMenu *menu)
+{
+ if (menu == m_menu)
+ m_menu = 0;
+}
+
void QCocoaMenuItem::setVisible(bool isVisible)
{
m_isVisible = isVisible;