[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