mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-09 18:30:08 +00:00
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.
This commit is contained in:
parent
59db0ca328
commit
f81038e99a
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user