From 949275bbedaa58a5399c6ce5276adc190ae6a16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Thu, 30 Apr 2020 22:12:21 +0200 Subject: [PATCH] Cocoa: Fix call to NSWindow from non-main threads glfwSwapBuffers may be called by any thread but NSWindow may not. Bug introduced by c3ca88055f7c2c8b02b38cb90fc1989990552977 and reported by @crujose. --- src/cocoa_platform.h | 1 + src/cocoa_window.m | 8 ++++++++ src/nsgl_context.m | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 90714341..b18b99cb 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -121,6 +121,7 @@ typedef struct _GLFWwindowNS id layer; GLFWbool maximized; + GLFWbool occluded; GLFWbool retina; // Cached window properties to filter out duplicate events diff --git a/src/cocoa_window.m b/src/cocoa_window.m index c50bf21a..45837dc1 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -322,6 +322,14 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; _glfwInputWindowFocus(window, GLFW_FALSE); } +- (void)windowDidChangeOcclusionState:(NSNotification* )notification +{ + if ([window->ns.object occlusionState] & NSWindowOcclusionStateVisible) + window->ns.occluded = GLFW_FALSE; + else + window->ns.occluded = GLFW_TRUE; +} + @end diff --git a/src/nsgl_context.m b/src/nsgl_context.m index e011fa5e..3f73f7a6 100644 --- a/src/nsgl_context.m +++ b/src/nsgl_context.m @@ -51,7 +51,7 @@ static void swapBuffersNSGL(_GLFWwindow* window) // HACK: Simulate vsync with usleep as NSGL swap interval does not apply to // windows with a non-visible occlusion state - if (!([window->ns.object occlusionState] & NSWindowOcclusionStateVisible)) + if (window->ns.occluded) { int interval = 0; [window->context.nsgl.object getValues:&interval