[PATCH 04/10] When activating an explicit grab, update owning listener
Bryce Harrington
bryce at canonical.com
Thu Apr 19 09:49:53 PDT 2012
On Tue, Apr 17, 2012 at 04:33:23PM -0700, Chase Douglas wrote:
> Pointer passive grabs may be changed by the grabbing client. This allows
> for a selecting client to change an implicit grab to an active grab,
> which is the mechanism used for pop-up windows like application menus.
>
> We need to do the same thing with touches. If the grabbing client is the
> owner of a touch sequence, change the listener record to reflect the new
> grab. If the grabbing client is not the owner, nothing changes for the
> touch.
>
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
> ---
> dix/events.c | 33 +++++++++++++++++++++++++++++++++
> 1 files changed, 33 insertions(+), 0 deletions(-)
>
> diff --git a/dix/events.c b/dix/events.c
> index 52ce0b8..9496b6f 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -1409,6 +1409,38 @@ ReattachToOldMaster(DeviceIntPtr dev)
> }
>
> /**
> + * Update touch records when an explicit grab is activated. Any touches owned by
> + * the grabbing client are updated so the listener state reflects the new grab.
> + */
> +static void
> +UpdateTouchesForGrab(DeviceIntPtr mouse)
> +{
> + int i;
> +
> + if (!mouse->touch || mouse->deviceGrab.fromPassiveGrab)
> + return;
This routine also has an assumption that !mouse. Which I suppose is
pretty obvious, but the function will definitely segfault if mouse==NULL
here.
> + for (i = 0; i < mouse->touch->num_touches; i++) {
> + TouchPointInfoPtr ti = mouse->touch->touches + i;
> + GrabPtr grab = mouse->deviceGrab.grab;
> +
> + if (ti->active &&
> + CLIENT_BITS(ti->listeners[0].listener) == grab->resource) {
> + ti->listeners[0].listener = grab->resource;
Checking len(ti->listeners) prior to this spot would avoid out of
bounds, if that's a conceivable situation.
> + ti->listeners[0].level = grab->grabtype;
> + ti->listeners[0].state = LISTENER_IS_OWNER;
> + ti->listeners[0].window = grab->window;
> +
> + if (grab->grabtype == CORE || grab->grabtype == XI ||
> + !xi2mask_isset(grab->xi2mask, mouse, XI_TouchBegin))
> + ti->listeners[0].type = LISTENER_POINTER_GRAB;
> + else
> + ti->listeners[0].type = LISTENER_GRAB;
> + }
> + }
> +}
> +
> +/**
> * Activate a pointer grab on the given device. A pointer grab will cause all
> * core pointer events of this device to be delivered to the grabbing client only.
> * No other device will send core events to the grab client while the grab is
> @@ -1457,6 +1489,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
> grabinfo->fromPassiveGrab = isPassive;
> grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
> PostNewCursor(mouse);
> + UpdateTouchesForGrab(mouse);
> CheckGrabForSyncs(mouse, (Bool) grab->pointerMode,
> (Bool) grab->keyboardMode);
> }
> --
> 1.7.9.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list