aboutsummaryrefslogtreecommitdiff
path: root/src/evdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-08-26 14:56:07 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-10-22 13:59:46 +1000
commitf6fcad8b107e834e26fb3da2c89e05294ff0a74c (patch)
tree642187758dfb9d3c18364c67420b4b7c4dd615e6 /src/evdev.c
parentExport smooth scroll settings as an XInput property. (diff)
downloadxf86-input-evdev-f6fcad8b107e834e26fb3da2c89e05294ff0a74c.tar.gz
xf86-input-evdev-f6fcad8b107e834e26fb3da2c89e05294ff0a74c.tar.bz2
xf86-input-evdev-f6fcad8b107e834e26fb3da2c89e05294ff0a74c.zip
Fix wheel emulation for absolute device (#68415)
wheel emulation, for some reasons beyond time, got the value from pEvdev->vals, then set the value back into pEvdev->vals. Alas, that value is always 0, hence oldValue is zero and the delta is nil. If we're not in relative (touchpad) mode, store the current value in old_vals, so they're retrievable for the next event. X.Org Bug 68415 <http://bugs.freedesktop.org/show_bug.cgi?id=68415> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src/evdev.c')
-rw-r--r--src/evdev.c52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/evdev.c b/src/evdev.c
index c2ce29d..d1ed9ee 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -483,31 +483,39 @@ EvdevProcessValuators(InputInfoPtr pInfo)
EvdevPtr pEvdev = pInfo->private;
int *delta = pEvdev->delta;
- /* convert to relative motion for touchpads */
- if (pEvdev->abs_queued && (pEvdev->flags & EVDEV_RELATIVE_MODE)) {
- if (pEvdev->in_proximity) {
- if (valuator_mask_isset(pEvdev->vals, 0))
- {
- if (valuator_mask_isset(pEvdev->old_vals, 0))
- delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
- valuator_mask_get(pEvdev->old_vals, 0);
- valuator_mask_set(pEvdev->old_vals, 0,
- valuator_mask_get(pEvdev->vals, 0));
- }
- if (valuator_mask_isset(pEvdev->vals, 1))
- {
- if (valuator_mask_isset(pEvdev->old_vals, 1))
- delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
- valuator_mask_get(pEvdev->old_vals, 1);
- valuator_mask_set(pEvdev->old_vals, 1,
- valuator_mask_get(pEvdev->vals, 1));
+ if (pEvdev->abs_queued) {
+ /* convert to relative motion for touchpads */
+ if (pEvdev->flags & EVDEV_RELATIVE_MODE) {
+ if (pEvdev->in_proximity) {
+ if (valuator_mask_isset(pEvdev->vals, 0))
+ {
+ if (valuator_mask_isset(pEvdev->old_vals, 0))
+ delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
+ valuator_mask_get(pEvdev->old_vals, 0);
+ valuator_mask_set(pEvdev->old_vals, 0,
+ valuator_mask_get(pEvdev->vals, 0));
+ }
+ if (valuator_mask_isset(pEvdev->vals, 1))
+ {
+ if (valuator_mask_isset(pEvdev->old_vals, 1))
+ delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
+ valuator_mask_get(pEvdev->old_vals, 1);
+ valuator_mask_set(pEvdev->old_vals, 1,
+ valuator_mask_get(pEvdev->vals, 1));
+ }
+ } else {
+ valuator_mask_zero(pEvdev->old_vals);
}
+ valuator_mask_zero(pEvdev->vals);
+ pEvdev->abs_queued = 0;
+ pEvdev->rel_queued = 1;
} else {
- valuator_mask_zero(pEvdev->old_vals);
+ int val;
+ if (valuator_mask_fetch(pEvdev->vals, 0, &val))
+ valuator_mask_set(pEvdev->old_vals, 0, val);
+ if (valuator_mask_fetch(pEvdev->vals, 1, &val))
+ valuator_mask_set(pEvdev->old_vals, 1, val);
}
- valuator_mask_zero(pEvdev->vals);
- pEvdev->abs_queued = 0;
- pEvdev->rel_queued = 1;
}
if (pEvdev->rel_queued) {