summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-09-25 17:29:40 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-09-28 10:59:43 +0200
commit10780c7b8cd632087fb93005eaf03b6adf94a2b8 (patch)
tree59a0e8eb99e964b40ae84d0dab024cccd5f499cb /src/plugins/platforms/cocoa
parent688369999435d6f4755577fe47ff80132254bb26 (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.mm90
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