dix: undo transformation for missing valuators (#49347)
last.valuators contains the transformed valuators of the device. If the device submits events with x/y missing, we need to get that from last.valuators and undo the transformation to that axis. X.Org Bug 49347 <http://bugs.freedesktop.org/show_bug.cgi?id=49347> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
03318835a5
commit
749a593e49
|
@ -1166,16 +1166,33 @@ static void
|
||||||
transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
|
transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
|
||||||
{
|
{
|
||||||
double x, y, ox, oy;
|
double x, y, ox, oy;
|
||||||
|
int has_x, has_y;
|
||||||
|
|
||||||
|
has_x = valuator_mask_fetch_double(mask, 0, &ox);
|
||||||
|
has_y = valuator_mask_fetch_double(mask, 1, &oy);
|
||||||
|
|
||||||
|
if (!has_x && !has_y)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!has_x || !has_y) {
|
||||||
|
struct pixman_f_transform invert;
|
||||||
|
|
||||||
|
/* undo transformation from last event */
|
||||||
|
ox = dev->last.valuators[0];
|
||||||
|
oy = dev->last.valuators[1];
|
||||||
|
|
||||||
|
pixman_f_transform_invert(&invert, &dev->transform);
|
||||||
|
transform(&invert, &ox, &oy);
|
||||||
|
|
||||||
|
x = ox;
|
||||||
|
y = oy;
|
||||||
|
}
|
||||||
|
|
||||||
if (valuator_mask_isset(mask, 0))
|
if (valuator_mask_isset(mask, 0))
|
||||||
ox = x = valuator_mask_get_double(mask, 0);
|
ox = x = valuator_mask_get_double(mask, 0);
|
||||||
else
|
|
||||||
ox = x = dev->last.valuators[0];
|
|
||||||
|
|
||||||
if (valuator_mask_isset(mask, 1))
|
if (valuator_mask_isset(mask, 1))
|
||||||
oy = y = valuator_mask_get_double(mask, 1);
|
oy = y = valuator_mask_get_double(mask, 1);
|
||||||
else
|
|
||||||
oy = y = dev->last.valuators[1];
|
|
||||||
|
|
||||||
transform(&dev->transform, &x, &y);
|
transform(&dev->transform, &x, &y);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue