From 3dcf6f123c54fd3104bcb79677cd347972abea4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Brunet?= Date: Tue, 30 Sep 2014 22:32:51 +0200 Subject: Don't update old_vals when not in EVDEV_RELATIVE_MODE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Peter Hutterer --- src/evdev.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 968c60b..f488f96 100644 --- a/src/evdev.c +++ b/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); } } -- cgit v1.2.3