From 0dc6ac26c352def3227f77050e1d779c286b1cb7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Mar 2019 15:51:10 +0530 Subject: [PATCH] Cocoa: user performSelectorOnMainThread instead of postEvent for the tick callback performSelectorOnMainThread runs in more loop run modes which means that the tick callback will behave more like it does on other platforms, during window resizes and other modal event loops. --- glfw/cocoa_init.m | 9 ++++++++- glfw/cocoa_platform.h | 1 - glfw/cocoa_window.m | 4 ---- kitty/glfw.c | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/glfw/cocoa_init.m b/glfw/cocoa_init.m index 1c635841e..a82f7654a 100644 --- a/glfw/cocoa_init.m +++ b/glfw/cocoa_init.m @@ -295,6 +295,7 @@ static GLFWbool initializeTIS(void) @end // GLFWHelper @interface GLFWApplication : NSApplication +- (void)tick_callback; @end extern void dispatchCustomEvent(NSEvent *event); @@ -305,6 +306,11 @@ extern void dispatchCustomEvent(NSEvent *event); dispatchCustomEvent(event); } else [super sendEvent:event]; } + +- (void)tick_callback +{ + _glfwDispatchTickCallback(); +} @end ////////////////////////////////////////////////////////////////////////// @@ -462,6 +468,7 @@ static GLFWtickcallback tick_callback = NULL; static void* tick_callback_data = NULL; static bool tick_callback_requested = false; + void _glfwDispatchTickCallback() { if (tick_callback) { tick_callback_requested = false; @@ -472,7 +479,7 @@ void _glfwDispatchTickCallback() { void _glfwPlatformRequestTickCallback() { if (!tick_callback_requested) { tick_callback_requested = true; - _glfwCocoaPostEmptyEvent(TICK_CALLBACK_EVENT_TYPE, 0, false); + [NSApp performSelectorOnMainThread:@selector(tick_callback) withObject:nil waitUntilDone:NO]; } } diff --git a/glfw/cocoa_platform.h b/glfw/cocoa_platform.h index d5c9594e5..664ff3354 100644 --- a/glfw/cocoa_platform.h +++ b/glfw/cocoa_platform.h @@ -39,7 +39,6 @@ typedef void* CVDisplayLinkRef; typedef enum { EMPTY_EVENT_TYPE, RENDER_FRAME_REQUEST_EVENT_TYPE, - TICK_CALLBACK_EVENT_TYPE } EventTypes; diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 2110f9d26..7d48786e0 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1769,10 +1769,6 @@ dispatchCustomEvent(NSEvent *event) { case EMPTY_EVENT_TYPE: break; - case TICK_CALLBACK_EVENT_TYPE: - _glfwDispatchTickCallback(); - break; - default: break; } diff --git a/kitty/glfw.c b/kitty/glfw.c index 5e473d39c..e763ba769 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -939,8 +939,8 @@ void wakeup_main_loop() { request_tick_callback(); #ifndef __APPLE__ - // On Cocoa request_tick_callback() uses an event which wakes up the - // main loop anyway + // On Cocoa request_tick_callback() uses performSelectorOnMainLoop which + // wakes up the main loop anyway glfwPostEmptyEvent(); #endif }