summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/emuWheel.c11
-rw-r--r--src/evdev.c52
2 files changed, 37 insertions, 26 deletions
diff --git a/src/emuWheel.c b/src/emuWheel.c
index 81b777f..857f029 100644
--- a/src/emuWheel.c
+++ b/src/emuWheel.c
@@ -97,7 +97,6 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
WheelAxisPtr pAxis = NULL, pOtherAxis = NULL;
int value = pEv->value;
- int oldValue;
/* Has wheel emulation been configured to be enabled? */
if (!pEvdev->emulateWheel.enabled)
@@ -118,9 +117,13 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
/* We don't want to intercept real mouse wheel events */
if(pEv->type == EV_ABS) {
int axis = pEvdev->abs_axis_map[pEv->code];
- oldValue = valuator_mask_get(pEvdev->vals, axis);
- valuator_mask_set(pEvdev->vals, axis, value);
- value -= oldValue; /* make value into a differential measurement */
+ int oldValue;
+
+ if (axis > -1 && valuator_mask_fetch(pEvdev->old_vals, axis, &oldValue)) {
+ valuator_mask_set(pEvdev->vals, axis, value);
+ value -= oldValue; /* make value into a differential measurement */
+ } else
+ value = 0; /* avoid a jump on the first touch */
}
switch(pEv->code) {
diff --git a/src/evdev.c b/src/evdev.c
index af4aba3..16a0358 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -493,31 +493,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) {