dix: check the xi2mask, not the grab type for touch listeners

grab->type is only non-zero for passive grabs. We're checking an active grab
here, so we need to check if the touch mask is set on the grab.

Test case: grab the device, then start two simultaneous touches. The
grabbing client won't see the second touchpoints because grab->type is 0
and the second touch is not an emulating pointer.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2013-07-24 11:50:00 +10:00
parent 21ea7ebb6a
commit 4fb686d6a6
2 changed files with 2 additions and 3 deletions

View File

@ -895,8 +895,7 @@ TouchAddActiveGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
if (!ti->emulate_pointer && if (!ti->emulate_pointer &&
grab->grabtype == XI2 && grab->grabtype == XI2 &&
(grab->type != XI_TouchBegin && grab->type != XI_TouchEnd && !xi2mask_isset(grab->xi2mask, dev, XI_TouchBegin))
grab->type != XI_TouchUpdate))
return; return;
TouchAddGrabListener(dev, ti, ev, grab); TouchAddGrabListener(dev, ti, ev, grab);

View File

@ -195,7 +195,7 @@ typedef struct _GrabRec {
unsigned keyboardMode:1; unsigned keyboardMode:1;
unsigned pointerMode:1; unsigned pointerMode:1;
enum InputLevel grabtype; enum InputLevel grabtype;
CARD8 type; /* event type */ CARD8 type; /* event type for passive grabs, 0 for active grabs */
DetailRec modifiersDetail; DetailRec modifiersDetail;
DeviceIntPtr modifierDevice; DeviceIntPtr modifierDevice;
DetailRec detail; /* key or button */ DetailRec detail; /* key or button */