Don't update old_vals when not in EVDEV_RELATIVE_MODE

When not in EVDEV_RELATIVE_MODE, absolute position is stored in old_vals. This serves
no purpose except that old_vals is ready when the device is switched to
EVDEV_RELATIVE_MODE. It is however better to make the copy between old_vals
and abs_vals at the time of the switch rather than all the time.

Signed-off-by: Éric Brunet <Eric.Brunet@lps.ens.fr>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
master
Éric Brunet 12 years ago committed by Peter Hutterer
parent f59585b367
commit 3dcf6f123c
  1. 18
      src/evdev.c

@ -139,6 +139,7 @@ static int EvdevSwitchMode(ClientPtr client, DeviceIntPtr device, int mode)
{
InputInfoPtr pInfo;
EvdevPtr pEvdev;
int val;
pInfo = device->public.devicePrivate;
pEvdev = pInfo->private;
@ -154,10 +155,21 @@ static int EvdevSwitchMode(ClientPtr client, DeviceIntPtr device, int mode)
switch (mode) {
case Absolute:
pEvdev->flags &= ~EVDEV_RELATIVE_MODE;
if (valuator_mask_fetch(pEvdev->old_vals, 0, &val))
valuator_mask_set(pEvdev->abs_vals, 0, val);
if (valuator_mask_fetch(pEvdev->old_vals, 1, &val))
valuator_mask_set(pEvdev->abs_vals, 1, val);
valuator_mask_zero(pEvdev->old_vals);
break;
case Relative:
pEvdev->flags |= EVDEV_RELATIVE_MODE;
if (valuator_mask_fetch(pEvdev->abs_vals, 0, &val))
valuator_mask_set(pEvdev->old_vals, 0, val);
if (valuator_mask_fetch(pEvdev->abs_vals, 1, &val))
valuator_mask_set(pEvdev->old_vals, 1, val);
valuator_mask_unset(pEvdev->abs_vals, 0);
valuator_mask_unset(pEvdev->abs_vals, 1);
break;
default:
@ -459,12 +471,6 @@ EvdevProcessValuators(InputInfoPtr pInfo)
valuator_mask_zero(pEvdev->abs_vals);
pEvdev->abs_queued = 0;
pEvdev->rel_queued = 1;
} else {
int val;
if (valuator_mask_fetch(pEvdev->abs_vals, 0, &val))
valuator_mask_set(pEvdev->old_vals, 0, val);
if (valuator_mask_fetch(pEvdev->abs_vals, 1, &val))
valuator_mask_set(pEvdev->old_vals, 1, val);
}
}

Loading…
Cancel
Save