From b1893f7c49707ac386a003e3e974f0c04a1d29ff Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 6 Jul 2012 16:26:52 +0200 Subject: Introducing NoDropShadowWindowHint window flag Added suppport on QCocoaWindow. Also we deprecate WA_MacNoShadow since it isn't used anywhere, and updated the 'windowflags' example app. Change-Id: Id0b453ba15a23b768b0615838597bca139f507ad Reviewed-by: J-P Nurmi --- examples/widgets/widgets/windowflags/controllerwindow.cpp | 10 +++++++--- examples/widgets/widgets/windowflags/controllerwindow.h | 1 + examples/widgets/widgets/windowflags/previewwindow.cpp | 2 ++ src/corelib/global/qnamespace.h | 3 ++- src/corelib/global/qnamespace.qdoc | 6 +++--- src/plugins/platforms/cocoa/qcocoawindow.h | 1 + src/plugins/platforms/cocoa/qcocoawindow.mm | 8 ++++++++ 7 files changed, 24 insertions(+), 7 deletions(-) diff --git a/examples/widgets/widgets/windowflags/controllerwindow.cpp b/examples/widgets/widgets/windowflags/controllerwindow.cpp index 15d5bcf23b..95236ec32a 100644 --- a/examples/widgets/widgets/windowflags/controllerwindow.cpp +++ b/examples/widgets/widgets/windowflags/controllerwindow.cpp @@ -99,6 +99,8 @@ void ControllerWindow::updatePreview() flags |= Qt::X11BypassWindowManagerHint; if (framelessWindowCheckBox->isChecked()) flags |= Qt::FramelessWindowHint; + if (windowNoShadowCheckBox->isChecked()) + flags |= Qt::NoDropShadowWindowHint; if (windowTitleCheckBox->isChecked()) flags |= Qt::WindowTitleHint; if (windowSystemMenuCheckBox->isChecked()) @@ -171,6 +173,7 @@ void ControllerWindow::createHintsGroupBox() x11BypassWindowManagerCheckBox = createCheckBox(tr("X11 bypass window manager")); framelessWindowCheckBox = createCheckBox(tr("Frameless window")); + windowNoShadowCheckBox = createCheckBox(tr("No drop shadow")); windowTitleCheckBox = createCheckBox(tr("Window title")); windowSystemMenuCheckBox = createCheckBox(tr("Window system menu")); windowMinimizeButtonCheckBox = createCheckBox(tr("Window minimize button")); @@ -187,8 +190,9 @@ void ControllerWindow::createHintsGroupBox() layout->addWidget(msWindowsFixedSizeDialogCheckBox, 0, 0); layout->addWidget(x11BypassWindowManagerCheckBox, 1, 0); layout->addWidget(framelessWindowCheckBox, 2, 0); - layout->addWidget(windowTitleCheckBox, 3, 0); - layout->addWidget(windowSystemMenuCheckBox, 4, 0); + layout->addWidget(windowNoShadowCheckBox, 3, 0); + layout->addWidget(windowTitleCheckBox, 4, 0); + layout->addWidget(windowSystemMenuCheckBox, 5, 0); layout->addWidget(windowMinimizeButtonCheckBox, 0, 1); layout->addWidget(windowMaximizeButtonCheckBox, 1, 1); layout->addWidget(windowCloseButtonCheckBox, 2, 1); @@ -196,7 +200,7 @@ void ControllerWindow::createHintsGroupBox() layout->addWidget(windowShadeButtonCheckBox, 4, 1); layout->addWidget(windowStaysOnTopCheckBox, 5, 1); layout->addWidget(windowStaysOnBottomCheckBox, 6, 1); - layout->addWidget(customizeWindowHintCheckBox, 5, 0); + layout->addWidget(customizeWindowHintCheckBox, 6, 0); hintsGroupBox->setLayout(layout); } //! [6] diff --git a/examples/widgets/widgets/windowflags/controllerwindow.h b/examples/widgets/widgets/windowflags/controllerwindow.h index 7479fe8bee..5be73b788e 100644 --- a/examples/widgets/widgets/windowflags/controllerwindow.h +++ b/examples/widgets/widgets/windowflags/controllerwindow.h @@ -88,6 +88,7 @@ private: QCheckBox *msWindowsFixedSizeDialogCheckBox; QCheckBox *x11BypassWindowManagerCheckBox; QCheckBox *framelessWindowCheckBox; + QCheckBox *windowNoShadowCheckBox; QCheckBox *windowTitleCheckBox; QCheckBox *windowSystemMenuCheckBox; QCheckBox *windowMinimizeButtonCheckBox; diff --git a/examples/widgets/widgets/windowflags/previewwindow.cpp b/examples/widgets/widgets/windowflags/previewwindow.cpp index f8c297a41e..65ff83d44b 100644 --- a/examples/widgets/widgets/windowflags/previewwindow.cpp +++ b/examples/widgets/widgets/windowflags/previewwindow.cpp @@ -94,6 +94,8 @@ void PreviewWindow::setWindowFlags(Qt::WindowFlags flags) text += "\n| Qt::X11BypassWindowManagerHint"; if (flags & Qt::FramelessWindowHint) text += "\n| Qt::FramelessWindowHint"; + if (flags & Qt::NoDropShadowWindowHint) + text += "\n| Qt::NoDropShadowWindowHint"; if (flags & Qt::WindowTitleHint) text += "\n| Qt::WindowTitleHint"; if (flags & Qt::WindowSystemMenuHint) diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 1940c1acff..e413dd2064 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -312,7 +312,8 @@ public: WindowOkButtonHint = 0x00080000, WindowCancelButtonHint = 0x00100000, WindowSoftkeysVisibleHint = 0x40000000, - WindowSoftkeysRespondHint = 0x80000000 + WindowSoftkeysRespondHint = 0x80000000, + NoDropShadowWindowHint = 0x40000000 }; Q_DECLARE_FLAGS(WindowFlags, WindowType) diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index f60805c835..03bf7627fb 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -1175,9 +1175,6 @@ to this top level window. This attribute has no effect on non-X11 platforms. - \value WA_MacNoShadow Since Qt 4.8, this attribute disables drop shadows - for this top level window. Only affects Cocoa builds of Qt for Mac OS X. - \omitvalue WA_SetLayoutDirection \omitvalue WA_InputMethodTransparent \omitvalue WA_WState_CompressKeys @@ -1208,6 +1205,7 @@ \omitvalue WA_SetWindowModality \omitvalue WA_WState_WindowOpacitySet \omitvalue WA_WState_AcceptedTouchBeginEvent + \omitvalue WA_MacNoShadow */ /*! \typedef Qt::HANDLE @@ -1968,6 +1966,8 @@ ability to understand Motif and/or NETWM hints. Most existing modern window managers can handle this. + \value NoDropShadowWindowHint Disables window drop shadow on supporting platforms. + The \c CustomizeWindowHint flag is used to enable customization of the window controls. This flag must be set to allow the \c WindowTitleHint, \c WindowSystemMenuHint, \c diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index ef80616221..defadb6c65 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -122,6 +122,7 @@ public: NSInteger windowLevel(Qt::WindowFlags flags); NSUInteger windowStyleMask(Qt::WindowFlags flags); + void setWindowShadow(Qt::WindowFlags flags); void setCurrentContext(QCocoaGLContext *context); QCocoaGLContext *currentContext() const; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index ae9fd6e314..72a5bc9e8b 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -370,6 +370,12 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags) return styleMask; } +void QCocoaWindow::setWindowShadow(Qt::WindowFlags flags) +{ + bool keepShadow = !(flags & Qt::NoDropShadowWindowHint); + [m_nsWindow setHasShadow:(keepShadow ? YES : NO)]; +} + Qt::WindowFlags QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) { if (m_nsWindow) { @@ -377,6 +383,7 @@ Qt::WindowFlags QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) NSInteger level = this->windowLevel(flags); [m_nsWindow setStyleMask:styleMask]; [m_nsWindow setLevel:level]; + setWindowShadow(flags); } m_windowFlags = flags; @@ -625,6 +632,7 @@ NSWindow * QCocoaWindow::createNSWindow() defer:NO]; // Deferring window creation breaks OpenGL (the GL context is set up // before the window is shown and needs a proper window.). window->m_cocoaPlatformWindow = this; + setWindowShadow(flags); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { -- cgit v1.2.3