Instead of guessing what resource type the listener is and what property to retrieve, store the resource type in the listener directly.
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=56557 Signed-off-by: Peter Hutterer <[email protected]> --- Xi/exevents.c | 25 ++++++++++++------------- dix/touch.c | 23 ++++++++++++----------- include/input.h | 5 +++-- include/inputstr.h | 1 + 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 4cbeb37..7625c1f 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1310,12 +1310,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, if (listener->type == LISTENER_GRAB || listener->type == LISTENER_POINTER_GRAB) { - rc = dixLookupResourceByType((pointer *) grab, listener->listener, - RT_PASSIVEGRAB, - serverClient, DixSendAccess); - if (rc != Success) { - /* the grab doesn't exist but we have a grabbing listener - this - * is an implicit/active grab */ + if (listener->resource_type == RT_ACTIVEGRAB) { rc = dixLookupClient(client, listener->listener, serverClient, DixSendAccess); if (rc != Success) @@ -1325,19 +1320,22 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, if (!*grab) return FALSE; } + else { + rc = dixLookupResourceByType((pointer *) grab, listener->listener, + listener->resource_type, + serverClient, DixSendAccess); + if (rc != Success) + return FALSE; + } *client = rClient(*grab); *win = (*grab)->window; *mask = (*grab)->xi2mask; } else { - if (listener->level == CORE) - rc = dixLookupWindow(win, listener->listener, - serverClient, DixSendAccess); - else - rc = dixLookupResourceByType((pointer *) win, listener->listener, - RT_INPUTCLIENT, - serverClient, DixSendAccess); + rc = dixLookupResourceByType((pointer *) win, listener->listener, + listener->resource_type, + serverClient, DixSendAccess); if (rc != Success) return FALSE; @@ -1477,6 +1475,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, */ l = &ti->listeners[ti->num_listeners - 1]; l->listener = devgrab->resource; + l->resource_type = RT_PASSIVEGRAB; if (devgrab->grabtype != XI2 || devgrab->type != XI_TouchBegin) l->type = LISTENER_POINTER_GRAB; diff --git a/dix/touch.c b/dix/touch.c index 5f77be5..8152598 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -682,11 +682,12 @@ TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource) * Add the resource to this touch's listeners. */ void -TouchAddListener(TouchPointInfoPtr ti, XID resource, enum InputLevel level, - enum TouchListenerType type, enum TouchListenerState state, - WindowPtr window) +TouchAddListener(TouchPointInfoPtr ti, XID resource, int resource_type, + enum InputLevel level, enum TouchListenerType type, + enum TouchListenerState state, WindowPtr window) { ti->listeners[ti->num_listeners].listener = resource; + ti->listeners[ti->num_listeners].resource_type = resource_type; ti->listeners[ti->num_listeners].level = level; ti->listeners[ti->num_listeners].state = state; ti->listeners[ti->num_listeners].type = type; @@ -722,7 +723,7 @@ TouchRemoveListener(TouchPointInfoPtr ti, XID resource) static void TouchAddGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - InternalEvent *ev, GrabPtr grab) + InternalEvent *ev, GrabPtr grab, int resource_type) { enum TouchListenerType type = LISTENER_GRAB; @@ -739,7 +740,7 @@ TouchAddGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, type = LISTENER_POINTER_GRAB; } - TouchAddListener(ti, grab->resource, grab->grabtype, + TouchAddListener(ti, grab->resource, resource_type, grab->grabtype, type, LISTENER_AWAITING_BEGIN, grab->window); ti->num_grabs++; } @@ -759,7 +760,7 @@ TouchAddPassiveGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, if (!grab) return; - TouchAddGrabListener(dev, ti, ev, grab); + TouchAddGrabListener(dev, ti, ev, grab, RT_PASSIVEGRAB); } static Bool @@ -796,7 +797,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, if (!xi2mask_isset(iclients->xi2mask, dev, XI_TouchOwnership)) TouchEventHistoryAllocate(ti); - TouchAddListener(ti, iclients->resource, XI2, + TouchAddListener(ti, iclients->resource, RT_INPUTCLIENT, XI2, type, LISTENER_AWAITING_BEGIN, win); return TRUE; } @@ -811,7 +812,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, continue; TouchEventHistoryAllocate(ti); - TouchAddListener(ti, iclients->resource, XI, + TouchAddListener(ti, iclients->resource, RT_INPUTCLIENT, XI, LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, win); return TRUE; @@ -826,7 +827,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, /* window owner */ if (IsMaster(dev) && (win->eventMask & core_filter)) { TouchEventHistoryAllocate(ti); - TouchAddListener(ti, win->drawable.id, CORE, + TouchAddListener(ti, win->drawable.id, RT_WINDOW, CORE, LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, win); return TRUE; @@ -838,7 +839,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, continue; TouchEventHistoryAllocate(ti); - TouchAddListener(ti, oclients->resource, CORE, + TouchAddListener(ti, oclients->resource, RT_OTHERCLIENT, CORE, type, LISTENER_AWAITING_BEGIN, win); return TRUE; } @@ -861,7 +862,7 @@ TouchAddActiveGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, grab->type != XI_TouchUpdate)) return; - TouchAddGrabListener(dev, ti, ev, grab); + TouchAddGrabListener(dev, ti, ev, grab, RT_ACTIVEGRAB); } void diff --git a/include/input.h b/include/input.h index f8459b8..8636b71 100644 --- a/include/input.h +++ b/include/input.h @@ -561,8 +561,9 @@ extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource); extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource); extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, - enum InputLevel level, enum TouchListenerType type, - enum TouchListenerState state, WindowPtr window); + int resource_type, enum InputLevel level, + enum TouchListenerType type, enum TouchListenerState state, + WindowPtr window); extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev); diff --git a/include/inputstr.h b/include/inputstr.h index 5a38924..91c76b2 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -309,6 +309,7 @@ typedef struct _TouchPointInfo { struct _TouchListener { XID listener; /* grabs/event selection IDs receiving * events for this touch */ + int resource_type; /* listener's resource type */ enum TouchListenerType type; enum TouchListenerState state; enum InputLevel level; /* matters only for emulating touches */ -- 1.7.11.7 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
