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; } diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c index 50497320f7..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), @@ -1120,10 +1123,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: