diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2011-04-04 09:19:06 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2011-04-04 09:19:06 (GMT) |
commit | 7418c05b7534b1e3aa014b420081d2f94b1ac0d2 (patch) | |
tree | 2e58e8f9c3fa60061893052096f8dd9c1167c77c | |
parent | d1a21551dc31937db4b62b2406ea3820dd8a8c0a (diff) | |
parent | 3c2373d7ea9bc91bb537c0725984d19ad0fbab01 (diff) | |
download | Qt-7418c05b7534b1e3aa014b420081d2f94b1ac0d2.zip Qt-7418c05b7534b1e3aa014b420081d2f94b1ac0d2.tar.gz Qt-7418c05b7534b1e3aa014b420081d2f94b1ac0d2.tar.bz2 |
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/qt-water-staging into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/qt-water-staging:
Cocoa: p1 bugfix, add widget flag MacNoCocoaChildWindow
-rw-r--r-- | src/corelib/global/qnamespace.h | 1 | ||||
-rw-r--r-- | src/corelib/global/qnamespace.qdoc | 8 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_mac.mm | 23 |
3 files changed, 24 insertions, 8 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 4d70744..864d4a5 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -525,6 +525,7 @@ public: #endif WA_X11DoNotAcceptFocus = 132, + WA_MacNoCocoaChildWindow = 133, // Add new attributes before this line WA_AttributeCount diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 22ad83b..c495d6f 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -925,6 +925,14 @@ the brushed metal style as supported by the windowing system. This attribute is only applicable to Mac OS X. + \value WA_MacNoCocoaChildWindow Indicates the widget should not be added + as a Cocoa child window of it's parent window. This will free the window + from being moved around together with the parent. However, this + will also allow it to stack/hide behind it's parent (if they are on + the same window level, e.g both windows are dialogs). This can cause problems if + both windows are modal, as the child can then block input to the parent + while hiding behind it. This attribute is only applicable to Mac OS X. + \omitvalue WA_MacMetalStyle \value WA_Mapped Indicates that the widget is mapped on screen. diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 7e5173f..7105d23 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -2796,9 +2796,12 @@ void QWidgetPrivate::setSubWindowStacking(bool set) { // This will set/remove a visual relationship between parent and child on screen. // The reason for doing this is to ensure that a child always stacks infront of - // its parent. Unfortunatly is turns out that [NSWindow addChildWindow] has + // its parent (expecially if both windows are modal, and the child blocks input to + // the parent while at the same time hiding behind it). Unfortunatly is turns out + // that [NSWindow addChildWindow] has // several unwanted side-effects, one of them being the moving of a child when - // moving the parent, which we choose to accept. A way tougher side-effect is + // moving the parent, which we choose to accept (if this is unacceptable, consider + // using Qt::WA_MacNoCocoaChildWindow). A way tougher side-effect is // that Cocoa will hide the parent if you hide the child. And in the case of // a tool window, since it will normally hide when you deactivate the // application, Cocoa will hide the parent upon deactivate as well. The result often @@ -2821,12 +2824,14 @@ void QWidgetPrivate::setSubWindowStacking(bool set) if (QWidget *parent = q->parentWidget()) { if (NSWindow *pwin = [qt_mac_nativeview_for(parent) window]) { if (set) { - Qt::WindowType ptype = parent->window()->windowType(); - if ([pwin isVisible] && (ptype == Qt::Window || ptype == Qt::Dialog) && ![qwin parentWindow]) { - NSInteger level = [qwin level]; - [pwin addChildWindow:qwin ordered:NSWindowAbove]; - if ([qwin level] < level) - [qwin setLevel:level]; + if (!q->testAttribute(Qt::WA_MacNoCocoaChildWindow)) { + Qt::WindowType ptype = parent->window()->windowType(); + if ([pwin isVisible] && (ptype == Qt::Window || ptype == Qt::Dialog) && ![qwin parentWindow]) { + NSInteger level = [qwin level]; + [pwin addChildWindow:qwin ordered:NSWindowAbove]; + if ([qwin level] < level) + [qwin setLevel:level]; + } } } else { [pwin removeChildWindow:qwin]; @@ -2840,6 +2845,8 @@ void QWidgetPrivate::setSubWindowStacking(bool set) if (child && child->isWindow()) { if (NSWindow *cwin = [qt_mac_nativeview_for(child) window]) { if (set) { + if (child->testAttribute(Qt::WA_MacNoCocoaChildWindow)) + continue; Qt::WindowType ctype = child->window()->windowType(); if ([cwin isVisible] && (ctype == Qt::Window || ctype == Qt::Dialog) && ![cwin parentWindow]) { NSInteger level = [cwin level]; |