summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-10-06 11:59:47 +0200
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-10-06 11:59:47 +0200
commitf49d5b578cfca311654e09a5161588401fc3815a (patch)
tree1d97f3e21bf13b4539dc4d9d934fcd3ea92516ec /src/plugins/platforms
parent848e95025297f8f56443ea7b22a1ddca1cc63cd8 (diff)
parent0edf68120bc72d35d5fe29c84467f5afeacb0585 (diff)
Merge remote-tracking branch 'origin/5.3' into 5.4
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.h5
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm17
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm16
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp2
5 files changed, 37 insertions, 4 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h
index adaeeabd9c..85913a67e1 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.h
+++ b/src/plugins/platforms/cocoa/qcocoamenu.h
@@ -86,6 +86,10 @@ public:
QList<QCocoaMenuItem *> merged() const;
void setMenuBar(QCocoaMenuBar *menuBar);
QCocoaMenuBar *menuBar() const;
+
+ void setContainingMenuItem(QCocoaMenuItem *menuItem);
+ QCocoaMenuItem *containingMenuItem() const;
+
private:
QCocoaMenuItem *itemOrNull(int index) const;
void insertNative(QCocoaMenuItem *item, QCocoaMenuItem *beforeItem);
@@ -98,6 +102,7 @@ private:
bool m_visible;
quintptr m_tag;
QCocoaMenuBar *m_menuBar;
+ QCocoaMenuItem *m_containingMenuItem;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index 84acf79517..736e02a3ca 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -222,7 +222,8 @@ QCocoaMenu::QCocoaMenu() :
m_enabled(true),
m_visible(true),
m_tag(0),
- m_menuBar(0)
+ m_menuBar(0),
+ m_containingMenuItem(0)
{
m_delegate = [[QCocoaMenuDelegate alloc] initWithMenu:this];
m_nativeItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
@@ -238,6 +239,10 @@ QCocoaMenu::~QCocoaMenu()
if (COCOA_MENU_ANCESTOR(item) == this)
SET_COCOA_MENU_ANCESTOR(item, 0);
}
+
+ if (m_containingMenuItem)
+ m_containingMenuItem->clearMenu(this);
+
QCocoaAutoReleasePool pool;
[m_nativeItem setSubmenu:nil];
[m_nativeMenu release];
@@ -568,4 +573,14 @@ QCocoaMenuBar *QCocoaMenu::menuBar() const
return m_menuBar;
}
+void QCocoaMenu::setContainingMenuItem(QCocoaMenuItem *menuItem)
+{
+ m_containingMenuItem = menuItem;
+}
+
+QCocoaMenuItem *QCocoaMenu::containingMenuItem() const
+{
+ return m_containingMenuItem;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.h b/src/plugins/platforms/cocoa/qcocoamenuitem.h
index 0ad8eada2b..4b94fa0020 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.h
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.h
@@ -94,6 +94,7 @@ public:
inline bool isSeparator() const { return m_isSeparator; }
QCocoaMenu *menu() const { return m_menu; }
+ void clearMenu(QCocoaMenu *menu);
MenuRole effectiveRole() const;
private:
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index d0d1e7e8b8..3d3b6bf598 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -132,13 +132,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
@@ -147,6 +153,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;
diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
index 69541b4c1a..d0eb8485fa 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
@@ -151,7 +151,7 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
// An event has to be associated with a window,
// so find the first parent that is a widget and that has a WId
QAccessibleInterface *iface = event->accessibleInterface();
- if (!iface) // ### This should not happen, maybe make it an assert.
+ if (!iface || !iface->isValid())
return;
QWindow *window = QWindowsAccessibility::windowHelper(iface);