diff --git a/glfw/cocoa_init.m b/glfw/cocoa_init.m index a82f7654a..173f4ac95 100644 --- a/glfw/cocoa_init.m +++ b/glfw/cocoa_init.m @@ -296,21 +296,20 @@ static GLFWbool initializeTIS(void) @interface GLFWApplication : NSApplication - (void)tick_callback; +- (void)render_frame_received:(id)displayIDAsID; @end -extern void dispatchCustomEvent(NSEvent *event); - @implementation GLFWApplication -- (void)sendEvent:(NSEvent *)event { - if (event.type == NSEventTypeApplicationDefined) { - dispatchCustomEvent(event); - } else [super sendEvent:event]; -} - - (void)tick_callback { _glfwDispatchTickCallback(); } + +- (void)render_frame_received:(id)displayIDAsID +{ + CGDirectDisplayID displayID = [(NSNumber*)displayIDAsID unsignedIntValue]; + _glfwDispatchRenderFrame(displayID); +} @end ////////////////////////////////////////////////////////////////////////// diff --git a/glfw/cocoa_monitor.m b/glfw/cocoa_monitor.m index 217d53e29..21ec8785f 100644 --- a/glfw/cocoa_monitor.m +++ b/glfw/cocoa_monitor.m @@ -277,7 +277,9 @@ static CVReturn displayLinkCallback( } [_glfw.ns.displayLinks.lock unlock]; if (notify) { - _glfwCocoaPostEmptyEvent(RENDER_FRAME_REQUEST_EVENT_TYPE, displayID, true); + NSNumber *arg = [NSNumber numberWithUnsignedInt:displayID]; + [NSApp performSelectorOnMainThread:@selector(render_frame_received:) withObject:arg waitUntilDone:NO]; + [arg release]; } return kCVReturnSuccess; } diff --git a/glfw/cocoa_platform.h b/glfw/cocoa_platform.h index 664ff3354..aa76486e8 100644 --- a/glfw/cocoa_platform.h +++ b/glfw/cocoa_platform.h @@ -36,12 +36,6 @@ typedef void* id; typedef void* CVDisplayLinkRef; #endif -typedef enum { - EMPTY_EVENT_TYPE, - RENDER_FRAME_REQUEST_EVENT_TYPE, -} EventTypes; - - typedef VkFlags VkMacOSSurfaceCreateFlagsMVK; typedef int (* GLFWcocoatextinputfilterfun)(int,int,unsigned int, unsigned long); typedef int (* GLFWapplicationshouldhandlereopenfun)(int); @@ -205,3 +199,4 @@ float _glfwTransformYNS(float y); void _glfwClearDisplayLinks(); void _glfwCocoaPostEmptyEvent(short subtype, long data1, bool at_start); void _glfwDispatchTickCallback(); +void _glfwDispatchRenderFrame(CGDirectDisplayID); diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 7d48786e0..51846494f 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1741,7 +1741,7 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) [window->ns.object setAlphaValue:opacity]; } -static inline CGDirectDisplayID displayIDForWindow(_GLFWwindow *w) { +CGDirectDisplayID displayIDForWindow(_GLFWwindow *w) { NSWindow *nw = w->ns.object; NSDictionary *dict = [nw.screen deviceDescription]; NSNumber *displayIDns = [dict objectForKey:@"NSScreenNumber"]; @@ -1750,27 +1750,14 @@ static inline CGDirectDisplayID displayIDForWindow(_GLFWwindow *w) { } void -dispatchCustomEvent(NSEvent *event) { - switch(event.subtype) { - case RENDER_FRAME_REQUEST_EVENT_TYPE: - { - CGDirectDisplayID displayID = (CGDirectDisplayID)event.data1; - _GLFWwindow *w = _glfw.windowListHead; - while (w) { - if (w->ns.renderFrameRequested && displayID == displayIDForWindow(w)) { - w->ns.renderFrameRequested = GLFW_FALSE; - w->ns.renderFrameCallback((GLFWwindow*)w); - } - w = w->next; - } - } - break; - - case EMPTY_EVENT_TYPE: - break; - - default: - break; +_glfwDispatchRenderFrame(CGDirectDisplayID displayID) { + _GLFWwindow *w = _glfw.windowListHead; + while (w) { + if (w->ns.renderFrameRequested && displayID == displayIDForWindow(w)) { + w->ns.renderFrameRequested = GLFW_FALSE; + w->ns.renderFrameCallback((GLFWwindow*)w); + } + w = w->next; } }