[PATCH xserver 11/12] input: deliver raw events unconditionally for XI 2.1 clients.

Jeremy Huddleston jeremyhu at apple.com
Fri Jun 3 20:40:02 PDT 2011


5-10, 12:
Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>

11: 

This looks odd.  You're only going to deliver to the first client:

+        for (; inputclients; inputclients = inputclients->next)
        {
+            ClientPtr c; /* unused */
+            Mask m;      /* unused */
+            InputClients ic = *inputclients;

+            /* Because we run through the list manually, terminate the list
+             * after our current client */
+            ic.next = NULL;
+            if (!FilterRawEvents(rClient(&ic), grab))
+                DeliverEventToInputClients(device, &ic, root, xi, 1,
+                                           filter, NULL, &c, &m);
+        }


On Jun 2, 2011, at 3:13 AM, Peter Hutterer wrote:

> Deliver raw events regardless whether there is a grab on or not for clients
> supporting 2.1 or later.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> dix/events.c |   87 ++++++++++++++++++++++++++++++++++++++++++++++++----------
> 1 files changed, 72 insertions(+), 15 deletions(-)
> 
> diff --git a/dix/events.c b/dix/events.c
> index ce4e59d..9225b7d 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -2243,35 +2243,92 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
>     return nondeliveries;
> }
> 
> +/**
> + * Filter out raw events for XI 2.0 and XI 2.1 clients.
> + *
> + * If there is a grab on the device, 2.0 clients only get raw events if they
> + * have the grab. 2.1+ clients get raw events in all cases.
> + *
> + * @return TRUE if the event should be discarded, FALSE otherwise.
> + */
> +static BOOL
> +FilterRawEvents(const ClientPtr client, const GrabPtr grab)
> +{
> +    XIClientPtr client_xi_version;
> +    int cmp;
> +
> +    /* device not grabbed -> don't filter */
> +    if (!grab)
> +        return FALSE;
> +
> +    client_xi_version = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
> +
> +    cmp = version_compare(client_xi_version->major_version,
> +                          client_xi_version->minor_version, 2, 0);
> +    /* XI 2.0: if device is grabbed, skip
> +       XI 2.1: if device is grabbed by us, skip, we've already delivered */
> +    return (cmp == 0) ? TRUE : SameClient(grab, client);
> +}
> +
> +/**
> + * Deliver a raw event to the grab owner (if any) and to all root windows.
> + *
> + * Raw event delivery differs between XI 2.0 and XI 2.1.
> + * XI 2.0: events delivered to the grabbing client (if any) OR to all root
> + * windows
> + * XI 2.1: events delivered to all root windows, regardless of grabbing
> + * state.
> + */
> void
> DeliverRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
> {
>     GrabPtr grab = device->deviceGrab.grab;
> +    xEvent *xi;
> +    int i;
> +    int filter;
> +
> +    i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
> +    if (i != Success)
> +    {
> +        ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
> +                __func__, device->name, i);
> +        return;
> +    }
> 
>     if (grab)
>         DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
> -    else { /* deliver to all root windows */
> -        xEvent *xi;
> -        int i;
> -        int filter;
> 
> -        i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
> -        if (i != Success)
> +    filter = GetEventFilter(device, xi);
> +
> +    for (i = 0; i < screenInfo.numScreens; i++)
> +    {
> +        WindowPtr root;
> +        InputClients *inputclients;
> +
> +        root = screenInfo.screens[i]->root;
> +        if (!GetClientsForDelivery(device, root, xi, filter, &inputclients))
> +            continue;
> +
> +        for (; inputclients; inputclients = inputclients->next)
>         {
> -            ErrorF("[Xi] %s: XI2 conversion failed in %s (%d)\n",
> -                    __func__, device->name, i);
> -            return;
> -        }
> +            ClientPtr c; /* unused */
> +            Mask m;      /* unused */
> +            InputClients ic = *inputclients;
> 
> -        filter = GetEventFilter(device, xi);
> +            /* Because we run through the list manually, terminate the list
> +             * after our current client */
> +            ic.next = NULL;
> 
> -        for (i = 0; i < screenInfo.numScreens; i++)
> -            DeliverEventsToWindow(device, screenInfo.screens[i]->root, xi, 1,
> -                                  filter, NullGrab);
> -        free(xi);
> +            if (!FilterRawEvents(rClient(&ic), grab))
> +                DeliverEventToInputClients(device, &ic, root, xi, 1,
> +                                           filter, NULL, &c, &m);
> +        }
>     }
> +
> +    free(xi);
> }
> 
> +
> /* If the event goes to dontClient, don't send it and return 0.  if
>    send works,  return 1 or if send didn't work, return 2.
>    Only works for core events.
> -- 
> 1.7.5.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