[PATCH] Touch: Fix duplicate TouchBegin selection with virtual devices
Chase Douglas
chase.douglas at ubuntu.com
Fri Sep 7 12:01:26 PDT 2012
On Fri, Sep 7, 2012 at 10:30 AM, Daniel Stone <daniel at fooishbar.org> wrote:
>
> Given the following scenario:
> 1) client A selects for TouchBegin on window W for device D
> 2) client B selects for TouchBegin on window W for XIAllDevices
> 3) client C selects for TouchBegin on window W with device E
>
> Step 3 will fail with BadImplementation, because attempting to look up
> XIAllDevices or XIAllMasterDevices with dixLookupDevices doesn't work.
> This should succeed (or, if it was selecting for device D, fail with
> BadAccess as it would be a duplicate selection).
>
> Fix this by performing the appropriate lookup for virtual devices.
>
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> Cc: Peter Hutterer <peter.hutterer at who-t.net>
> Cc: Chase Douglas <chase.douglas at ubuntu.com>
> ---
> Xi/xiselectev.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
> index 0e45cb8..ab1b624 100644
> --- a/Xi/xiselectev.c
> +++ b/Xi/xiselectev.c
> @@ -180,8 +180,13 @@ ProcXISelectEvents(ClientPtr client)
> if (CLIENT_ID(iclient->resource) == client->index)
> continue;
>
> - dixLookupDevice(&tmp, evmask->deviceid, serverClient,
> - DixReadAccess);
> + if (evmask->deviceid == XIAllDevices)
> + tmp = inputInfo.all_devices;
> + else if (evmask->deviceid == XIAllMasterDevices)
> + tmp = inputInfo.all_master_devices;
> + else
> + dixLookupDevice(&tmp, evmask->deviceid, serverClient,
> + DixReadAccess);
> if (!tmp)
> return BadImplementation; /* this shouldn't happen */
>
Looks sensible to me.
Reviewed-by: Chase Douglas <chase.douglas at ubuntu.com>
This should have a regression test in Peter's new test repo. It would
be trivial to implement.
-- Chase
More information about the xorg-devel
mailing list