diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2019-09-25 17:29:40 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2019-09-28 10:59:43 +0200 |
commit | 10780c7b8cd632087fb93005eaf03b6adf94a2b8 (patch) | |
tree | 59a0e8eb99e964b40ae84d0dab024cccd5f499cb /src/plugins/platforms/cocoa | |
parent | 688369999435d6f4755577fe47ff80132254bb26 (diff) |
macOS: Gather QNSView draw callbacks together
Change-Id: I29881b379481287b4938e47fc06405c918aa39a3
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview_drawing.mm | 90 |
1 files changed, 51 insertions, 39 deletions
diff --git a/src/plugins/platforms/cocoa/qnsview_drawing.mm b/src/plugins/platforms/cocoa/qnsview_drawing.mm index e72142466b..6f9c72513d 100644 --- a/src/plugins/platforms/cocoa/qnsview_drawing.mm +++ b/src/plugins/platforms/cocoa/qnsview_drawing.mm @@ -71,24 +71,6 @@ return YES; } -- (void)drawRect:(NSRect)dirtyRect -{ - Q_UNUSED(dirtyRect); - - if (!m_platformWindow) - return; - - QRegion exposedRegion; - const NSRect *dirtyRects; - NSInteger numDirtyRects; - [self getRectsBeingDrawn:&dirtyRects count:&numDirtyRects]; - for (int i = 0; i < numDirtyRects; ++i) - exposedRegion += QRectF::fromCGRect(dirtyRects[i]).toRect(); - - qCDebug(lcQpaDrawing) << "[QNSView drawRect:]" << m_platformWindow->window() << exposedRegion; - m_platformWindow->handleExposeEvent(exposedRegion); -} - - (BOOL)layerEnabledByMacOS { // AppKit has its own logic for this, but if we rely on that, our layers are created @@ -173,8 +155,59 @@ } #endif +- (void)viewDidChangeBackingProperties +{ + qCDebug(lcQpaDrawing) << "Backing properties changed for" << self; + + if (self.layer) + self.layer.contentsScale = self.window.backingScaleFactor; + + // Ideally we would plumb this situation through QPA in a way that lets + // clients invalidate their own caches, recreate QBackingStore, etc. + // For now we trigger an expose, and let QCocoaBackingStore deal with + // buffer invalidation internally. + [self setNeedsDisplay:YES]; +} + +// ----------------------- Draw callbacks ----------------------- + +/* + This method is called by AppKit for the non-layer case, where we are + drawing into the NSWindow's surface. +*/ +- (void)drawRect:(NSRect)dirtyRect +{ + Q_UNUSED(dirtyRect); + + Q_ASSERT_X(!self.layer, "QNSView", + "The drawRect code path should not be hit when we are layer backed"); + + if (!m_platformWindow) + return; + + QRegion exposedRegion; + const NSRect *dirtyRects; + NSInteger numDirtyRects; + [self getRectsBeingDrawn:&dirtyRects count:&numDirtyRects]; + for (int i = 0; i < numDirtyRects; ++i) + exposedRegion += QRectF::fromCGRect(dirtyRects[i]).toRect(); + + qCDebug(lcQpaDrawing) << "[QNSView drawRect:]" << m_platformWindow->window() << exposedRegion; + m_platformWindow->handleExposeEvent(exposedRegion); +} + +/* + This method is called by AppKit when we are layer-backed, where + we are drawing into the layer. +*/ - (void)displayLayer:(CALayer *)layer { + Q_ASSERT_X(self.layer && layer == self.layer, "QNSView", + "The displayLayer code path should only be hit for our own layer"); + + if (!m_platformWindow) + return; + if (!NSThread.isMainThread) { // Qt is calling AppKit APIs such as -[NSOpenGLContext setView:] on secondary threads, // which we shouldn't do. This may result in AppKit (wrongly) triggering a display on @@ -184,29 +217,8 @@ return; } - Q_ASSERT(layer == self.layer); - - if (!m_platformWindow) - return; - qCDebug(lcQpaDrawing) << "[QNSView displayLayer]" << m_platformWindow->window(); - - // FIXME: Find out if there's a way to resolve the dirty rect like in drawRect: m_platformWindow->handleExposeEvent(QRectF::fromCGRect(self.bounds).toRect()); } -- (void)viewDidChangeBackingProperties -{ - qCDebug(lcQpaDrawing) << "Backing properties changed for" << self; - - if (self.layer) - self.layer.contentsScale = self.window.backingScaleFactor; - - // Ideally we would plumb this situation through QPA in a way that lets - // clients invalidate their own caches, recreate QBackingStore, etc. - // For now we trigger an expose, and let QCocoaBackingStore deal with - // buffer invalidation internally. - [self setNeedsDisplay:YES]; -} - @end |