aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evdev.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 3176660..0fcb0bb 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -430,6 +430,14 @@ static void
EvdevProcessValuators(InputInfoPtr pInfo)
{
EvdevPtr pEvdev = pInfo->private;
+ int val;
+
+ if (pEvdev->abs_vals) {
+ 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);
+ }
/* Apply transformations on relative coordinates */
if (pEvdev->rel_queued) {
@@ -765,6 +773,12 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
if (ev->code > ABS_MAX)
return;
+ /* Always store the current abs valuator, we need it to update old_vals
+ * which is required by wheel emulation */
+ map = pEvdev->abs_axis_map[ev->code];
+ if (map < 2)
+ valuator_mask_set(pEvdev->abs_vals, map, value);
+
if (EvdevWheelEmuFilterMotion(pInfo, ev))
return;
@@ -781,10 +795,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
valuator_mask_set(pEvdev->rel_vals, map, value - oldval);
pEvdev->rel_queued = 1;
}
- valuator_mask_set(pEvdev->old_vals, map, value);
} else {
- /* the normal case: just store the number. */
- valuator_mask_set(pEvdev->abs_vals, map, value);
pEvdev->abs_queued = 1;
}
}