Respect grab event mask for crossing events
In the case of a non-owner_events grab, use grab->event_mask rather than the window even mask to decide whether to deliver the event or not.
This commit is contained in:
@ -9234,21 +9234,27 @@ send_crossing_event (GdkDisplay *display,
|
|||||||
gulong serial)
|
gulong serial)
|
||||||
{
|
{
|
||||||
GdkEvent *event;
|
GdkEvent *event;
|
||||||
guint32 event_mask;
|
guint32 window_event_mask, type_event_mask;
|
||||||
GdkPointerGrabInfo *grab;
|
GdkPointerGrabInfo *grab;
|
||||||
GdkWindowImplIface *impl_iface;
|
GdkWindowImplIface *impl_iface;
|
||||||
|
|
||||||
grab = _gdk_display_has_pointer_grab (display, serial);
|
grab = _gdk_display_has_pointer_grab (display, serial);
|
||||||
|
|
||||||
if (grab != NULL &&
|
if (grab != NULL &&
|
||||||
!grab->owner_events &&
|
!grab->owner_events)
|
||||||
(GdkWindow *)window != grab->window)
|
{
|
||||||
return;
|
/* !owner_event => only report events wrt grab window, ignore rest */
|
||||||
|
if ((GdkWindow *)window != grab->window)
|
||||||
|
return;
|
||||||
|
window_event_mask = grab->event_mask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
window_event_mask = window->event_mask;
|
||||||
|
|
||||||
if (type == GDK_LEAVE_NOTIFY)
|
if (type == GDK_LEAVE_NOTIFY)
|
||||||
event_mask = GDK_LEAVE_NOTIFY_MASK;
|
type_event_mask = GDK_LEAVE_NOTIFY_MASK;
|
||||||
else
|
else
|
||||||
event_mask = GDK_ENTER_NOTIFY_MASK;
|
type_event_mask = GDK_ENTER_NOTIFY_MASK;
|
||||||
|
|
||||||
if (window->extension_events != 0)
|
if (window->extension_events != 0)
|
||||||
{
|
{
|
||||||
@ -9257,7 +9263,7 @@ send_crossing_event (GdkDisplay *display,
|
|||||||
type == GDK_ENTER_NOTIFY);
|
type == GDK_ENTER_NOTIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->event_mask & event_mask)
|
if (window_event_mask & type_event_mask)
|
||||||
{
|
{
|
||||||
event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, TRUE);
|
event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, TRUE);
|
||||||
event->crossing.time = time_;
|
event->crossing.time = time_;
|
||||||
|
Reference in New Issue
Block a user