macOS: Remove screen-update disable during resize

It was needed as a workaround for the window border and window content
becoming out of sync when we were drawing and flushing to the layer
from another thread using OpenGL. Since we've disabled ThreadedOpenGL
we can remove this workaround for now.

The workaround also had other problems, as windowWillResize: did not
turn out to be a reliable signal to know when a window was about to
resize. Since we override windowWillUseStandardFrame:, we would not
get the callback when zooming windows. Conversely, if we removed the
windowWillUseStandardFrame: override, we would get a single callback
for windowWillResize:, and then multiple callbacks that the window
had resized. In addition, windowWillResize: is not only used as a
callback, but also as a way to let the window delegate restrict the
size, so it's called when e.g. AppKit determines the standard frame
of the window -- an operation that doesn't involve an actual resize
operation.

If we re-introduce a workaround using screen-update disabling we need
a better hook than windowWillResize:, and we need to track when we
disable screen updates so that we can pair them up with corresponding
screen update enables, otherwise we'll get log messages in the console
about "SLSReenableUpdate: unbalanced enable/disable update".

Change-Id: Ifca8892083c8666976391a4ada8f8d1471493943
Fixes: QTBUG-73726
Task-number: QTBUG-69321
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Tor Arne Vestbø 2019-02-10 17:39:06 +01:00
parent 0ad651579f
commit 77389ad8ff

View File

@ -102,40 +102,6 @@ static QCocoaWindow *toPlatformWindow(NSWindow *window)
return QCocoaScreen::mapToNative(maximizedFrame);
}
#pragma clang diagnostic push
// NSDisableScreenUpdates and NSEnableScreenUpdates are deprecated, but the
// NSAnimationContext API that replaces them doesn't handle the use-case of
// cross-thread screen update synchronization.
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)frameSize
{
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "will resize to" << QSizeF::fromCGSize(frameSize)
<< "- disabling screen updates temporarily";
// There may be separate threads rendering to CA layers in this window,
// and if any of them do a swap while the resize is still in progress,
// the visual bounds of that layer will be updated before the visual
// bounds of the window frame, resulting in flickering while resizing.
// To prevent this we disable screen updates for the whole process until
// the resize is complete, which makes the whole thing visually atomic.
NSDisableScreenUpdates();
return frameSize;
}
- (void)windowDidResize:(NSNotification *)notification
{
NSWindow *window = notification.object;
Q_ASSERT(toPlatformWindow(window));
qCDebug(lcQpaWindow) << window << "was resized - re-enabling screen updates";
NSEnableScreenUpdates();
}
#pragma clang diagnostic pop
- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu
{
Q_UNUSED(menu);