Merge branch 'wip/chergert/gdk-macos-fixes' into 'master'
macos: fix button release events outside of window during grabs See merge request GNOME/gtk!2692
This commit is contained in:
@@ -126,8 +126,6 @@
|
|||||||
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (gdk_surface));
|
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (gdk_surface));
|
||||||
double time = ((double)[event timestamp]) * 1000.0;
|
double time = ((double)[event timestamp]) * 1000.0;
|
||||||
|
|
||||||
_gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time);
|
|
||||||
|
|
||||||
inManualMove = NO;
|
inManualMove = NO;
|
||||||
inManualResize = NO;
|
inManualResize = NO;
|
||||||
inMove = NO;
|
inMove = NO;
|
||||||
@@ -140,6 +138,8 @@
|
|||||||
*/
|
*/
|
||||||
_gdk_macos_display_send_button_event ([self gdkDisplay], event);
|
_gdk_macos_display_send_button_event ([self gdkDisplay], event);
|
||||||
|
|
||||||
|
_gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -209,11 +209,6 @@ fill_button_event (GdkMacosDisplay *display,
|
|||||||
g_assert (GDK_IS_MACOS_DISPLAY (display));
|
g_assert (GDK_IS_MACOS_DISPLAY (display));
|
||||||
g_assert (GDK_IS_MACOS_SURFACE (surface));
|
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));
|
seat = gdk_display_get_default_seat (GDK_DISPLAY (display));
|
||||||
state = get_keyboard_modifiers_from_ns_event (nsevent) |
|
state = get_keyboard_modifiers_from_ns_event (nsevent) |
|
||||||
_gdk_macos_display_get_current_mouse_modifiers (display);
|
_gdk_macos_display_get_current_mouse_modifiers (display);
|
||||||
@@ -238,6 +233,14 @@ fill_button_event (GdkMacosDisplay *display,
|
|||||||
g_assert_not_reached ();
|
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,
|
return gdk_button_event_new (type,
|
||||||
GDK_SURFACE (surface),
|
GDK_SURFACE (surface),
|
||||||
gdk_seat_get_pointer (seat),
|
gdk_seat_get_pointer (seat),
|
||||||
@@ -1120,10 +1123,21 @@ _gdk_macos_display_translate (GdkMacosDisplay *self,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NSEventTypeMouseExited:
|
case NSEventTypeMouseExited:
|
||||||
[[NSCursor arrowCursor] set];
|
|
||||||
/* fallthrough */
|
|
||||||
case NSEventTypeMouseEntered:
|
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;
|
break;
|
||||||
|
|
||||||
case NSEventTypeKeyDown:
|
case NSEventTypeKeyDown:
|
||||||
|
|||||||
Reference in New Issue
Block a user