Merge branch 'amolenaar/macos-fix-nsapp-shortcuts' into 'main'

macos: fix in-app native shortcuts (regression)

See merge request GNOME/gtk!7178
This commit is contained in:
Matthias Clasen 2024-04-25 01:35:59 +00:00
commit 492940205e
4 changed files with 28 additions and 9 deletions

View File

@ -161,7 +161,8 @@ void _gdk_macos_display_send_event (GdkMacosDisp
void _gdk_macos_display_warp_pointer (GdkMacosDisplay *self, void _gdk_macos_display_warp_pointer (GdkMacosDisplay *self,
int x, int x,
int y); int y);
NSEvent *_gdk_macos_display_pop_nsevent (GdkEvent *event); NSEvent *_gdk_macos_display_get_matching_nsevent (GdkEvent *event);
NSEvent *_gdk_macos_display_get_exact_nsevent (GdkEvent *event);
NSEvent *_gdk_macos_display_get_last_nsevent (void); NSEvent *_gdk_macos_display_get_last_nsevent (void);
GdkDrag *_gdk_macos_display_find_drag (GdkMacosDisplay *self, GdkDrag *_gdk_macos_display_find_drag (GdkMacosDisplay *self,
NSInteger sequence_number); NSInteger sequence_number);

View File

@ -994,8 +994,11 @@ _gdk_macos_display_warp_pointer (GdkMacosDisplay *self,
CGWarpMouseCursorPosition ((CGPoint) { x, y }); CGWarpMouseCursorPosition ((CGPoint) { x, y });
} }
/* Find the matching `NSEvent` for an `GdkEvent`. This function
* return the `NSEvent`, also for rewritten `GdkEvent`'s.
*/
NSEvent * NSEvent *
_gdk_macos_display_pop_nsevent (GdkEvent *event) _gdk_macos_display_get_matching_nsevent (GdkEvent *event)
{ {
for (GList *iter = event_map.head; iter; iter = iter->next) for (GList *iter = event_map.head; iter; iter = iter->next)
{ {
@ -1005,11 +1008,26 @@ _gdk_macos_display_pop_nsevent (GdkEvent *event)
map->gdk_event->device == event->device && map->gdk_event->device == event->device &&
map->gdk_event->time == event->time) map->gdk_event->time == event->time)
{ {
NSEvent *nsevent = map->nsevent; return map->nsevent;
g_queue_unlink (&event_map, iter); }
gdk_event_unref (map->gdk_event); }
g_free (map);
return nsevent; return NULL;
}
/* Find the matching `NSEvent` for the original `GdkEvent`.
* If an event was rewritten, it returns `NULL`.
*/
NSEvent *
_gdk_macos_display_get_exact_nsevent (GdkEvent *event)
{
for (GList *iter = event_map.head; iter; iter = iter->next)
{
GdkToNSEventMap *map = iter->data;
if (map->gdk_event == event)
{
return map->nsevent;
} }
} }

View File

@ -738,7 +738,7 @@ gdk_macos_event_source_dispatch (GSource *source,
if (!handled) if (!handled)
{ {
NSEvent *nsevent = _gdk_macos_display_pop_nsevent (event); NSEvent *nsevent = _gdk_macos_display_get_exact_nsevent (event);
if (nsevent != NULL) if (nsevent != NULL)
[NSApp sendEvent: nsevent]; [NSApp sendEvent: nsevent];
} }

View File

@ -185,7 +185,7 @@ quartz_filter_keypress (GtkIMContext *context,
keyval = gdk_key_event_get_keyval (event); keyval = gdk_key_event_get_keyval (event);
keycode = gdk_key_event_get_keycode (event); keycode = gdk_key_event_get_keycode (event);
NSEvent *nsevent = _gdk_macos_display_pop_nsevent ((GdkEvent *)event); NSEvent *nsevent = _gdk_macos_display_get_matching_nsevent ((GdkEvent *)event);
if (!nsevent) if (!nsevent)
{ {