From f81038e99a62df05cf6dc725c637acbf759ec5a6 Mon Sep 17 00:00:00 2001 From: Arjan Molenaar Date: Sat, 20 Apr 2024 16:40:02 +0200 Subject: [PATCH] macos: Avoid repeatedly sending events back to macOS in the old approach it was possible that one NSEvent was sent to the underlying NSApp multiple times. This resulted in those events being forwarded to our (glib) event queue again. The visual result was that no screen updates were done. Under the hood the application was very busy with passing events around. By popping the events off of our event queue, we make sure they're sent only once. --- gdk/macos/gdkmacosdisplay-private.h | 2 +- gdk/macos/gdkmacosdisplay.c | 14 ++++++++++---- gdk/macos/gdkmacoseventsource.c | 2 +- gtk/gtkimcontextquartz.c | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gdk/macos/gdkmacosdisplay-private.h b/gdk/macos/gdkmacosdisplay-private.h index 15508faee1..462d2cf66f 100644 --- a/gdk/macos/gdkmacosdisplay-private.h +++ b/gdk/macos/gdkmacosdisplay-private.h @@ -161,7 +161,7 @@ void _gdk_macos_display_send_event (GdkMacosDisp void _gdk_macos_display_warp_pointer (GdkMacosDisplay *self, int x, int y); -NSEvent *_gdk_macos_display_get_nsevent (GdkEvent *event); +NSEvent *_gdk_macos_display_pop_nsevent (GdkEvent *event); NSEvent *_gdk_macos_display_get_last_nsevent (void); GdkDrag *_gdk_macos_display_find_drag (GdkMacosDisplay *self, NSInteger sequence_number); diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c index c190ae88cd..9a603ffcdc 100644 --- a/gdk/macos/gdkmacosdisplay.c +++ b/gdk/macos/gdkmacosdisplay.c @@ -992,16 +992,22 @@ _gdk_macos_display_warp_pointer (GdkMacosDisplay *self, } NSEvent * -_gdk_macos_display_get_nsevent (GdkEvent *event) +_gdk_macos_display_pop_nsevent (GdkEvent *event) { - for (const GList *iter = event_map.head; iter; iter = iter->next) + for (GList *iter = event_map.head; iter; iter = iter->next) { - const GdkToNSEventMap *map = iter->data; + GdkToNSEventMap *map = iter->data; if (map->gdk_event->event_type == event->event_type && map->gdk_event->device == event->device && map->gdk_event->time == event->time) - return map->nsevent; + { + NSEvent *nsevent = map->nsevent; + g_queue_unlink (&event_map, iter); + gdk_event_unref (map->gdk_event); + g_free (map); + return nsevent; + } } return NULL; diff --git a/gdk/macos/gdkmacoseventsource.c b/gdk/macos/gdkmacoseventsource.c index 44083d9557..1724ad95be 100644 --- a/gdk/macos/gdkmacoseventsource.c +++ b/gdk/macos/gdkmacoseventsource.c @@ -738,7 +738,7 @@ gdk_macos_event_source_dispatch (GSource *source, if (!handled) { - NSEvent *nsevent = _gdk_macos_display_get_nsevent (event); + NSEvent *nsevent = _gdk_macos_display_pop_nsevent (event); if (nsevent != NULL) [NSApp sendEvent: nsevent]; } diff --git a/gtk/gtkimcontextquartz.c b/gtk/gtkimcontextquartz.c index ad0df397d0..afda65170d 100644 --- a/gtk/gtkimcontextquartz.c +++ b/gtk/gtkimcontextquartz.c @@ -185,7 +185,7 @@ quartz_filter_keypress (GtkIMContext *context, keyval = gdk_key_event_get_keyval (event); keycode = gdk_key_event_get_keycode (event); - NSEvent *nsevent = _gdk_macos_display_get_nsevent ((GdkEvent *)event); + NSEvent *nsevent = _gdk_macos_display_pop_nsevent ((GdkEvent *)event); if (!nsevent) {