summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2012-09-07 18:30:23 +0100
committerPeter Hutterer <peter.hutterer@who-t.net>2012-10-04 13:24:44 +1000
commit314776eb369ca2e438907795ae030dd743c281fc (patch)
treeb49f20741df1117dd9dba53a045aace827a9e3ef
parent3e6358ee6c33979329b78fe2097a1fdf76fb69cd (diff)
Touch: Fix duplicate TouchBegin selection with virtual devices
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@fooishbar.org> Cc: Peter Hutterer <peter.hutterer@who-t.net> Cc: Chase Douglas <chase.douglas@ubuntu.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--Xi/xiselectev.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 0e45cb8cb..ab1b6245f 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 */