diff options
author | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-10-06 11:59:47 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-10-06 11:59:47 +0200 |
commit | f49d5b578cfca311654e09a5161588401fc3815a (patch) | |
tree | 1d97f3e21bf13b4539dc4d9d934fcd3ea92516ec /src/plugins/platforms | |
parent | 848e95025297f8f56443ea7b22a1ddca1cc63cd8 (diff) | |
parent | 0edf68120bc72d35d5fe29c84467f5afeacb0585 (diff) |
Merge remote-tracking branch 'origin/5.3' into 5.4
Change-Id: I132bb6cce68e9f8413200f7ee75586bd1cada38c
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenu.h | 5 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenu.mm | 17 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenuitem.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenuitem.mm | 16 | ||||
-rw-r--r-- | src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp | 2 |
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); |