[PATCH 2/2] input: Record grab pointer in TouchListener
Peter Hutterer
peter.hutterer at who-t.net
Wed Nov 28 20:05:20 PST 2012
On Tue, Nov 27, 2012 at 11:21:17AM -0800, Keith Packard wrote:
> This places a pointer to the grab related to a TouchListener directly
> in the TouchListener structure rather than hoping to find the grab
> later on using the resource ID.
>
> Passive grabs have resource ID in the resource DB so they can be
> removed when a client exits, and those resource IDs get copied when
> activated, but implicit grabs are constructed on-the-fly and have no
> resource DB entry.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
works for me, nice one.
confirmed it fixes the bugs and does not introduce any new test-case
failures.
both Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>, merged into my
branch. thanks
Cheers,
Peter
> ---
> Xi/exevents.c | 27 ++++++---------------------
> dix/events.c | 1 +
> dix/touch.c | 21 ++++++++++++++-------
> include/input.h | 2 +-
> include/inputstr.h | 1 +
> 5 files changed, 23 insertions(+), 29 deletions(-)
>
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index 4248b9a..22cba81 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -1197,7 +1197,6 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
> TouchOwnershipEvent *ev)
> {
> Bool was_owner = (resource == ti->listeners[0].listener);
> - void *grab;
> int i;
>
> /* Send a TouchEnd event to the resource being removed, but only if they
> @@ -1212,11 +1211,7 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
>
> /* Remove the resource from the listener list, updating
> * ti->num_listeners, as well as ti->num_grabs if it was a grab. */
> - if (TouchRemoveListener(ti, resource)) {
> - if (dixLookupResourceByType(&grab, resource, RT_PASSIVEGRAB,
> - serverClient, DixGetAttrAccess) == Success)
> - ti->num_grabs--;
> - }
> + TouchRemoveListener(ti, resource);
>
> /* If the current owner was removed and there are further listeners, deliver
> * the TouchOwnership or TouchBegin event to the new owner. */
> @@ -1310,21 +1305,10 @@ 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 */
> - rc = dixLookupClient(client, listener->listener, serverClient,
> - DixSendAccess);
> - if (rc != Success)
> - return FALSE;
> -
> - *grab = dev->deviceGrab.grab;
> - if (!*grab)
> - return FALSE;
> - }
> +
> + *grab = listener->grab;
> +
> + BUG_RETURN_VAL(!*grab, FALSE);
>
> *client = rClient(*grab);
> *win = (*grab)->window;
> @@ -1477,6 +1461,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
> */
> l = &ti->listeners[ti->num_listeners - 1];
> l->listener = devgrab->resource;
> + l->grab = devgrab;
>
> if (devgrab->grabtype != XI2 || devgrab->type != XI_TouchBegin)
> l->type = LISTENER_POINTER_GRAB;
> diff --git a/dix/events.c b/dix/events.c
> index 3282ef8..1eff2f0 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -1435,6 +1435,7 @@ UpdateTouchesForGrab(DeviceIntPtr mouse)
> ti->listeners[0].type = LISTENER_POINTER_GRAB;
> else
> ti->listeners[0].type = LISTENER_GRAB;
> + ti->listeners[0].grab = grab;
> }
> }
> }
> diff --git a/dix/touch.c b/dix/touch.c
> index 5f77be5..2a1e201 100644
> --- a/dix/touch.c
> +++ b/dix/touch.c
> @@ -684,13 +684,17 @@ TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource)
> void
> TouchAddListener(TouchPointInfoPtr ti, XID resource, enum InputLevel level,
> enum TouchListenerType type, enum TouchListenerState state,
> - WindowPtr window)
> + WindowPtr window,
> + GrabPtr grab)
> {
> ti->listeners[ti->num_listeners].listener = resource;
> ti->listeners[ti->num_listeners].level = level;
> ti->listeners[ti->num_listeners].state = state;
> ti->listeners[ti->num_listeners].type = type;
> ti->listeners[ti->num_listeners].window = window;
> + ti->listeners[ti->num_listeners].grab = grab;
> + if (grab)
> + ti->num_grabs++;
> ti->num_listeners++;
> }
>
> @@ -714,6 +718,10 @@ TouchRemoveListener(TouchPointInfoPtr ti, XID resource)
> ti->num_listeners--;
> ti->listeners[ti->num_listeners].listener = 0;
> ti->listeners[ti->num_listeners].state = LISTENER_AWAITING_BEGIN;
> + if (ti->listeners[ti->num_listeners].grab) {
> + ti->listeners[ti->num_listeners].grab = NULL;
> + ti->num_grabs--;
> + }
> return TRUE;
> }
> }
> @@ -740,8 +748,7 @@ TouchAddGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
> }
>
> TouchAddListener(ti, grab->resource, grab->grabtype,
> - type, LISTENER_AWAITING_BEGIN, grab->window);
> - ti->num_grabs++;
> + type, LISTENER_AWAITING_BEGIN, grab->window, grab);
> }
>
> /**
> @@ -797,7 +804,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
> TouchEventHistoryAllocate(ti);
>
> TouchAddListener(ti, iclients->resource, XI2,
> - type, LISTENER_AWAITING_BEGIN, win);
> + type, LISTENER_AWAITING_BEGIN, win, NULL);
> return TRUE;
> }
> }
> @@ -813,7 +820,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
> TouchEventHistoryAllocate(ti);
> TouchAddListener(ti, iclients->resource, XI,
> LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN,
> - win);
> + win, NULL);
> return TRUE;
> }
> }
> @@ -828,7 +835,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
> TouchEventHistoryAllocate(ti);
> TouchAddListener(ti, win->drawable.id, CORE,
> LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN,
> - win);
> + win, NULL);
> return TRUE;
> }
>
> @@ -839,7 +846,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
>
> TouchEventHistoryAllocate(ti);
> TouchAddListener(ti, oclients->resource, CORE,
> - type, LISTENER_AWAITING_BEGIN, win);
> + type, LISTENER_AWAITING_BEGIN, win, NULL);
> return TRUE;
> }
> }
> diff --git a/include/input.h b/include/input.h
> index f8459b8..d83e426 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -562,7 +562,7 @@ extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev,
> 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);
> + enum TouchListenerState state, WindowPtr window, GrabPtr grab);
> 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 8d9dd71..e21484b 100644
> --- a/include/inputstr.h
> +++ b/include/inputstr.h
> @@ -305,6 +305,7 @@ typedef struct _TouchListener {
> enum TouchListenerState state;
> enum InputLevel level; /* matters only for emulating touches */
> WindowPtr window;
> + GrabPtr grab;
> } TouchListener;
>
> typedef struct _TouchPointInfo {
> --
> 1.7.10.4
>
More information about the xorg-devel
mailing list