Xi: make UpdateDeviceState aware of touch events
Update the logical button state for pointer-emulating events. Button state must be kept separate from the ButtonClassRec to avoid clearing the button state on a touch end if there is a physical button still down. And obviously don't change the button state if we're currently replaying the event history for some client. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
593c3e2eb3
commit
dbfd7b37a0
|
@ -849,6 +849,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
KeyClassPtr k = NULL;
|
||||
ButtonClassPtr b = NULL;
|
||||
ValuatorClassPtr v = NULL;
|
||||
TouchClassPtr t = NULL;
|
||||
|
||||
/* This event is always the first we get, before the actual events with
|
||||
* the data. However, the way how the DDX is set up, "device" will
|
||||
|
@ -866,6 +867,9 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
case ET_KeyRelease:
|
||||
case ET_ProximityIn:
|
||||
case ET_ProximityOut:
|
||||
case ET_TouchBegin:
|
||||
case ET_TouchUpdate:
|
||||
case ET_TouchEnd:
|
||||
break;
|
||||
default:
|
||||
/* other events don't update the device */
|
||||
|
@ -875,6 +879,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
k = device->key;
|
||||
v = device->valuator;
|
||||
b = device->button;
|
||||
t = device->touch;
|
||||
|
||||
key = event->detail.key;
|
||||
|
||||
|
@ -976,6 +981,34 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
|
|||
device->proximity->in_proximity = TRUE;
|
||||
else if (event->type == ET_ProximityOut)
|
||||
device->proximity->in_proximity = FALSE;
|
||||
else if (event->type == ET_TouchBegin) {
|
||||
BUG_WARN(!b || !v);
|
||||
BUG_WARN(!t);
|
||||
|
||||
if (!b || !t || !b->map[key])
|
||||
return DONT_PROCESS;
|
||||
|
||||
if (!(event->flags & TOUCH_POINTER_EMULATED) ||
|
||||
(event->flags & TOUCH_REPLAYING))
|
||||
return DONT_PROCESS;
|
||||
|
||||
IncreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask, &t->state);
|
||||
UpdateDeviceMotionMask(device, t->state, DeviceButtonMotionMask);
|
||||
} else if (event->type == ET_TouchEnd) {
|
||||
BUG_WARN(!b || !v);
|
||||
BUG_WARN(!t);
|
||||
|
||||
if (!b || !t || t->buttonsDown <= 0 || !b->map[key])
|
||||
return DONT_PROCESS;
|
||||
|
||||
if (!(event->flags & TOUCH_POINTER_EMULATED))
|
||||
return DONT_PROCESS;
|
||||
if (!(event->flags & TOUCH_END))
|
||||
return DONT_PROCESS;
|
||||
|
||||
DecreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask, &t->state);
|
||||
UpdateDeviceMotionMask(device, t->state, DeviceButtonMotionMask);
|
||||
}
|
||||
|
||||
return DEFAULT;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue