summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-08-08 15:27:53 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-08-11 13:08:24 +0000
commit096b56f336e5bb994d46f073d55496d36d38e6b1 (patch)
tree020f9d3aa3db11c369c57a03152346dd17c34ded
parent255abc1e5a3397bf14e9854388881cd80f0bd2e3 (diff)
macOS: Create NSView as initially hidden, to match QWindow behavior
Change-Id: I25af6635ea9b6aa3fcc642fa2da0553341aabda8 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
-rw-r--r--src/gui/kernel/qwindow.cpp9
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm17
2 files changed, 17 insertions, 9 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 1d8d6dfc95..ac2c79b9ab 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 9f98ad56de..7a19303f5d 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;