diff options
-rw-r--r-- | src/evdev.c | 17 |
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; } } |