From cdb2c1698cca8256a578e616fe8e57914dd424f6 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 14 Oct 2020 14:08:23 -0700 Subject: [PATCH 1/3] macos: dont send crossing events during grab Fixes an issue where we can't drag scrollbars or text selections while outside of the application window. --- gdk/macos/gdkmacosdisplay-translate.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c index 50497320f7..41b738f99d 100644 --- a/gdk/macos/gdkmacosdisplay-translate.c +++ b/gdk/macos/gdkmacosdisplay-translate.c @@ -1120,10 +1120,21 @@ _gdk_macos_display_translate (GdkMacosDisplay *self, break; case NSEventTypeMouseExited: - [[NSCursor arrowCursor] set]; - /* fallthrough */ case NSEventTypeMouseEntered: - ret = synthesize_crossing_event (self, surface, nsevent, x, y); + { + GdkSeat *seat = gdk_display_get_default_seat (GDK_DISPLAY (self)); + GdkDevice *pointer = gdk_seat_get_pointer (seat); + GdkDeviceGrabInfo *grab = _gdk_display_get_last_device_grab (GDK_DISPLAY (self), pointer); + + if (grab == NULL) + { + if (event_type == NSEventTypeMouseExited) + [[NSCursor arrowCursor] set]; + + ret = synthesize_crossing_event (self, surface, nsevent, x, y); + } + } + break; case NSEventTypeKeyDown: From d700cfa2ef1e9a8ce6766335f9a3b6b7f4bad2fe Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 14 Oct 2020 15:31:29 -0700 Subject: [PATCH 2/3] macos: break grabs after sending release event --- gdk/macos/GdkMacosWindow.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gdk/macos/GdkMacosWindow.c b/gdk/macos/GdkMacosWindow.c index 3c4671aa46..c4a133afcc 100644 --- a/gdk/macos/GdkMacosWindow.c +++ b/gdk/macos/GdkMacosWindow.c @@ -126,8 +126,6 @@ GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (gdk_surface)); double time = ((double)[event timestamp]) * 1000.0; - _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time); - inManualMove = NO; inManualResize = NO; inMove = NO; @@ -140,6 +138,8 @@ */ _gdk_macos_display_send_button_event ([self gdkDisplay], event); + _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time); + break; } From b462bc35c0ebae01895e228d96396da03ceae441 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 14 Oct 2020 15:42:45 -0700 Subject: [PATCH 3/3] macos: allow pointer release event outside surface coords This helps with grab situations so that we can end it when releasing the pointer buttons outside of the window coordinates. --- gdk/macos/gdkmacosdisplay-translate.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c index 41b738f99d..5ed44d3592 100644 --- a/gdk/macos/gdkmacosdisplay-translate.c +++ b/gdk/macos/gdkmacosdisplay-translate.c @@ -209,11 +209,6 @@ fill_button_event (GdkMacosDisplay *display, g_assert (GDK_IS_MACOS_DISPLAY (display)); g_assert (GDK_IS_MACOS_SURFACE (surface)); - /* Ignore button events outside the window coords */ - if (x < 0 || x > GDK_SURFACE (surface)->width || - y < 0 || y > GDK_SURFACE (surface)->height) - return NULL; - seat = gdk_display_get_default_seat (GDK_DISPLAY (display)); state = get_keyboard_modifiers_from_ns_event (nsevent) | _gdk_macos_display_get_current_mouse_modifiers (display); @@ -238,6 +233,14 @@ fill_button_event (GdkMacosDisplay *display, g_assert_not_reached (); } + /* Ignore button press events outside the window coords but + * allow for button release which can happen during grabs. + */ + if (type == GDK_BUTTON_PRESS && + (x < 0 || x > GDK_SURFACE (surface)->width || + y < 0 || y > GDK_SURFACE (surface)->height)) + return NULL; + return gdk_button_event_new (type, GDK_SURFACE (surface), gdk_seat_get_pointer (seat),