mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-05-04 23:28:05 +02:00
Fix unset valuator handling for XI 1.x valuator events again
Set the valuator values for unset masked absolute valuators in the
internal device event. This ensures the values will always be correct in
getValuatorEvents even if the device has been removed.
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit b28a1af55c)
This commit is contained in:
parent
89142b356b
commit
7379f7a771
2 changed files with 9 additions and 9 deletions
|
|
@ -359,12 +359,12 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
|
|||
int i;
|
||||
int state = 0;
|
||||
int first_valuator, num_valuators;
|
||||
DeviceIntPtr dev = NULL;
|
||||
|
||||
|
||||
num_valuators = countValuators(ev, &first_valuator);
|
||||
if (num_valuators > 0)
|
||||
{
|
||||
DeviceIntPtr dev = NULL;
|
||||
dixLookupDevice(&dev, ev->deviceid, serverClient, DixUseAccess);
|
||||
/* State needs to be assembled BEFORE the device is updated. */
|
||||
state = (dev && dev->key) ? XkbStateFieldFromRec(&dev->key->xkbInfo->state) : 0;
|
||||
|
|
@ -381,14 +381,10 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
|
|||
xv->deviceid = ev->deviceid;
|
||||
xv->device_state = state;
|
||||
|
||||
for (j = 0; j < xv->num_valuators; j++) {
|
||||
if (BitIsOn(ev->valuators.mask, xv->first_valuator + j))
|
||||
valuators[j] = ev->valuators.data[xv->first_valuator + j];
|
||||
else if (dev->valuator->axes[xv->first_valuator + j].mode == Absolute)
|
||||
valuators[j] = dev->valuator->axisVal[xv->first_valuator + j];
|
||||
else
|
||||
valuators[j] = 0;
|
||||
}
|
||||
/* Unset valuators in masked valuator events have the proper data values
|
||||
* in the case of an absolute axis in between two set valuators. */
|
||||
for (j = 0; j < xv->num_valuators; j++)
|
||||
valuators[j] = ev->valuators.data[xv->first_valuator + j];
|
||||
|
||||
if (i + 6 < num_valuators)
|
||||
xv->deviceid |= MORE_EVENTS;
|
||||
|
|
|
|||
|
|
@ -205,6 +205,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask)
|
|||
{
|
||||
int i;
|
||||
|
||||
/* Set the data to the previous value for unset absolute axes. The values
|
||||
* may be used when sent as part of an XI 1.x valuator event. */
|
||||
for (i = 0; i < valuator_mask_size(mask); i++)
|
||||
{
|
||||
if (valuator_mask_isset(mask, i))
|
||||
|
|
@ -216,6 +218,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask)
|
|||
event->valuators.data_frac[i] =
|
||||
dev->last.remainder[i] * (1 << 16) * (1 << 16);
|
||||
}
|
||||
else if (valuator_get_mode(dev, i) == Absolute)
|
||||
event->valuators.data[i] = dev->valuator->axisVal[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue