+NSInteger QCocoaWindow::windowLevel(Qt::WindowFlags flags)
+{
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+
+ NSInteger windowLevel = NSNormalWindowLevel;
+
+ if (type == Qt::Tool)
+ windowLevel = NSFloatingWindowLevel;
+ else if ((type & Qt::Popup) == Qt::Popup)
+ windowLevel = NSPopUpMenuWindowLevel;
+
+ // StayOnTop window should appear above Tool windows.
+ if (flags & Qt::WindowStaysOnTopHint)
+ windowLevel = NSPopUpMenuWindowLevel;
+ // Tooltips should appear above StayOnTop windows.
+ if (type == Qt::ToolTip)
+ windowLevel = NSScreenSaverWindowLevel;
+
+ // A window should be in at least the same level as its parent.
+ const QWindow * const transientParent = window()->transientParent();
+ const QCocoaWindow * const transientParentWindow = transientParent ? static_cast<QCocoaWindow *>(transientParent->handle()) : 0;
+ if (transientParentWindow)
+ windowLevel = qMax([transientParentWindow->m_nsWindow level], windowLevel);
+
+ return windowLevel;
+}
+
+NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags)
+{
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+ NSInteger styleMask = NSBorderlessWindowMask;
+
+ if ((type & Qt::Popup) == Qt::Popup) {
+ if (!windowIsPopupType(type))
+ styleMask = (NSUtilityWindowMask | NSResizableWindowMask | NSClosableWindowMask |
+ NSMiniaturizableWindowMask | NSTitledWindowMask);
+ } else {
+ // Filter flags for supported properties
+ flags &= Qt::WindowType_Mask | Qt::FramelessWindowHint | Qt::WindowTitleHint |
+ Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint;
+ if (flags == Qt::Window) {
+ styleMask = (NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask);
+ } else if ((flags & Qt::Dialog) && (window()->modality() != Qt::NonModal)) {
+ styleMask = NSTitledWindowMask;
+ } else if (!(flags & Qt::FramelessWindowHint)) {
+ if (flags & Qt::WindowMaximizeButtonHint)
+ styleMask |= NSResizableWindowMask;
+ if (flags & Qt::WindowTitleHint)
+ styleMask |= NSTitledWindowMask;
+ if (flags & Qt::WindowCloseButtonHint)
+ styleMask |= NSClosableWindowMask;
+ if (flags & Qt::WindowMinimizeButtonHint)
+ styleMask |= NSMiniaturizableWindowMask;
+ }
+ }
+
+ return styleMask;
+}
+
+void QCocoaWindow::setWindowShadow(Qt::WindowFlags flags)
+{
+ bool keepShadow = !(flags & Qt::NoDropShadowWindowHint);
+ [m_nsWindow setHasShadow:(keepShadow ? YES : NO)];
+}
+
+void QCocoaWindow::setWindowFlags(Qt::WindowFlags flags)