gdkseatdefault: Grab touch events where applicable
gdk_seat_default_grab() grabs POINTER_EVENTS if the capability is GDK_SEAT_CAPABILITY_ALL_POINTING. But that enumerator is a union that includes GDK_SEAT_CAPABILITY_TOUCH, but we never grabbed TOUCH_EVENTS, an unused macro that was presumably created with this purpose in mind. So, check which of the ALL_POINTING capabilities we have, and set the right mask of POINTER_EVENTS and/or TOUCH_EVENTS as required. As part of this, explicitly let TABLET_STYLUS take over pointer events, as this is the intended behaviour and was the effective result before. This should fix touch events being lost in migrating from Device.grab() to Seat.grab(GDK_SEAT_CAPABILITY_ALL_POINTING), as found by Inkscape. https://bugzilla.gnome.org/show_bug.cgi?id=781757
This commit is contained in:
@ -132,9 +132,22 @@ gdk_seat_default_grab (GdkSeat *seat,
|
||||
|
||||
if (capabilities & GDK_SEAT_CAPABILITY_ALL_POINTING)
|
||||
{
|
||||
/* ALL_POINTING spans 3 capabilities; get the mask for the ones we have */
|
||||
GdkEventMask pointer_evmask = 0;
|
||||
|
||||
/* We let tablet styli take over the pointer cursor */
|
||||
if (capabilities & (GDK_SEAT_CAPABILITY_POINTER |
|
||||
GDK_SEAT_CAPABILITY_TABLET_STYLUS))
|
||||
{
|
||||
pointer_evmask |= POINTER_EVENTS;
|
||||
}
|
||||
|
||||
if (capabilities & GDK_SEAT_CAPABILITY_TOUCH)
|
||||
pointer_evmask |= TOUCH_EVENTS;
|
||||
|
||||
status = gdk_device_grab (priv->master_pointer, window,
|
||||
GDK_OWNERSHIP_NONE, owner_events,
|
||||
POINTER_EVENTS, cursor,
|
||||
pointer_evmask, cursor,
|
||||
evtime);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user