diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 1d8d6dfc957..ac2c79b9ab1 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -343,8 +343,15 @@ void QWindowPrivate::setVisible(bool visible) return; // We only need to create the window if it's being shown - if (visible) + if (visible) { + // FIXME: At this point we've already updated the visible state of + // the QWindow, so any platform pulling out the visible state during + // creation to set on the native window will create a visible window, + // which may result in resize and expose events before the show event + // sent below. This code assumes that the platform will set the window + // to be hidden, until receiving a setVisible call below. q->create(); + } } if (visible) { diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 9f98ad56de9..7a19303f5de 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -178,6 +178,11 @@ void QCocoaWindow::initialize() if (!m_view) { m_view = [[QNSView alloc] initWithCocoaWindow:this]; + + // NSViews are visible by default, as opposed to QWindows which are not, + // so make the view hidden until we receive an explicit setVisible. + m_view.hidden = YES; + // Enable high-dpi OpenGL for retina displays. Enabling has the side // effect that Cocoa will start calling glViewport(0, 0, width, height), // overriding any glViewport calls in application code. This is usually not a @@ -343,9 +348,11 @@ void QCocoaWindow::setVisible(bool visible) && !(nativeParentWindow.styleMask & NSFullScreenWindowMask)) nativeParentWindow.styleMask &= ~NSResizableWindowMask; } - } + // Make the NSView visible first, before showing the NSWindow (in case of top level windows) + m_view.hidden = NO; + if (isContentView()) { QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); @@ -395,11 +402,6 @@ void QCocoaWindow::setVisible(bool visible) } } } - // In some cases, e.g. QDockWidget, the content view is hidden before moving to its own - // Cocoa window, and then shown again. Therefore, we test for the view being hidden even - // if it's attached to an NSWindow. - if ([m_view isHidden]) - [m_view setHidden:NO]; } else { // qDebug() << "close" << this; #ifndef QT_NO_OPENGL @@ -435,7 +437,7 @@ void QCocoaWindow::setVisible(bool visible) [mainWindow makeKeyWindow]; } } else { - [m_view setHidden:YES]; + m_view.hidden = YES; } removeMonitor(); @@ -1235,7 +1237,6 @@ void QCocoaWindow::recreateWindowIfNeeded() rect.setSize(QSize(1, 1)); NSRect frame = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()); [m_view setFrame:frame]; - [m_view setHidden:!window()->isVisible()]; } const qreal opacity = qt_window_private(window())->opacity;