summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJames Turner <james.turner@kdab.com>2012-08-28 12:42:42 +0100
committerQt by Nokia <qt-info@nokia.com>2012-08-28 23:34:25 +0200
commitd2864ffcc0dc91a64bb3b5d3cb649852f8a6b271 (patch)
treef7fecef10bc0840e5441aac60422683eed017e62 /src
parent823da2d308c974761a9f23ba67b993c986f0a823 (diff)
Fix missing cleanup of native Cocoa menus.
QCocoaMenu was missing a destructor to release various native resources, and this causes issues with pop-up menus when the Qt peers are recycled on successive shows of the same menu. Task-number: QTBUG-27022 Change-Id: I3cdf979804358ce10fe8a87c9e2c90419c6e0b48 Reviewed-by: Christoph Schleifenbaum <christoph.schleifenbaum@kdab.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm10
2 files changed, 11 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h
index 479d4b53c2..c523b27076 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.h
+++ b/src/plugins/platforms/cocoa/qcocoamenu.h
@@ -59,6 +59,7 @@ class QCocoaMenu : public QPlatformMenu
{
public:
QCocoaMenu();
+ ~QCocoaMenu();
inline virtual void setTag(quintptr tag)
{ m_tag = tag; }
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index 951bbb90c3..a39263ecab 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -107,6 +107,14 @@ QCocoaMenu::QCocoaMenu() :
[m_nativeItem setSubmenu:m_nativeMenu];
}
+QCocoaMenu::~QCocoaMenu()
+{
+ [m_nativeItem setSubmenu:nil];
+ [m_nativeMenu release];
+ [m_delegate release];
+ [m_nativeItem release];
+}
+
void QCocoaMenu::setText(const QString &text)
{
QCocoaAutoReleasePool pool;
@@ -142,6 +150,7 @@ void QCocoaMenu::insertNative(QCocoaMenuItem *item, QCocoaMenuItem *beforeItem)
if (item->isMerged())
return;
+ Q_ASSERT([item->nsItem() menu] == NULL);
// if the item we're inserting before is merged, skip along until
// we find a non-merged real item to insert ahead of.
while (beforeItem && beforeItem->isMerged()) {
@@ -163,6 +172,7 @@ void QCocoaMenu::removeMenuItem(QPlatformMenuItem *menuItem)
Q_ASSERT(m_menuItems.contains(cocoaItem));
m_menuItems.removeOne(cocoaItem);
if (!cocoaItem->isMerged()) {
+ Q_ASSERT(m_nativeMenu == [cocoaItem->nsItem() menu]);
[m_nativeMenu removeItem: cocoaItem->nsItem()];
}
}