macOS: Fix the initial window background not being black since macOS 10.14.2 or so, when OpenGL is used (bug #4810). Also fixes "CGContext: invalid context 0x0" errors when an OpenGL window is created (bug #4470).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index a141e86..c7760cb 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -1266,23 +1266,32 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
_sdlWindow = window;
}
-/* this is used on older macOS revisions. 10.8 and later use updateLayer. */
+/* this is used on older macOS revisions, and newer ones which emulate old
+ NSOpenGLContext behaviour while still using a layer under the hood. 10.8 and
+ later use updateLayer, up until 10.14.2 or so, which uses drawRect without
+ a GraphicsContext and with a layer active instead (for OpenGL contexts). */
- (void)drawRect:(NSRect)dirtyRect
{
/* Force the graphics context to clear to black so we don't get a flash of
white until the app is ready to draw. In practice on modern macOS, this
only gets called for window creation and other extraordinary events. */
- [[NSColor blackColor] setFill];
- NSRectFill(dirtyRect);
+ if ([NSGraphicsContext currentContext]) {
+ [[NSColor blackColor] setFill];
+ NSRectFill(dirtyRect);
+ } else if (self.layer) {
+ self.layer.backgroundColor = CGColorGetConstantColor(kCGColorBlack);
+ }
+
SDL_SendWindowEvent(_sdlWindow, SDL_WINDOWEVENT_EXPOSED, 0, 0);
}
--(BOOL) wantsUpdateLayer
+- (BOOL)wantsUpdateLayer
{
return YES;
}
--(void) updateLayer
+/* This is also called when a Metal layer is active. */
+- (void)updateLayer
{
/* Force the graphics context to clear to black so we don't get a flash of
white until the app is ready to draw. In practice on modern macOS, this