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>
master
Peter Hutterer 13 years ago
parent d171b3d919
commit f6fcad8b10
  1. 11
      src/emuWheel.c
  2. 52
      src/evdev.c

@ -97,7 +97,6 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
EvdevPtr pEvdev = (EvdevPtr)pInfo->private; EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
WheelAxisPtr pAxis = NULL, pOtherAxis = NULL; WheelAxisPtr pAxis = NULL, pOtherAxis = NULL;
int value = pEv->value; int value = pEv->value;
int oldValue;
/* Has wheel emulation been configured to be enabled? */ /* Has wheel emulation been configured to be enabled? */
if (!pEvdev->emulateWheel.enabled) if (!pEvdev->emulateWheel.enabled)
@ -117,9 +116,13 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
if(pEv->type == EV_ABS) { if(pEv->type == EV_ABS) {
int axis = pEvdev->abs_axis_map[pEv->code]; int axis = pEvdev->abs_axis_map[pEv->code];
oldValue = valuator_mask_get(pEvdev->vals, axis); int oldValue;
valuator_mask_set(pEvdev->vals, axis, value);
value -= oldValue; /* make value into a differential measurement */ 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) { switch(pEv->code) {

@ -483,31 +483,39 @@ EvdevProcessValuators(InputInfoPtr pInfo)
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int *delta = pEvdev->delta; int *delta = pEvdev->delta;
/* convert to relative motion for touchpads */ if (pEvdev->abs_queued) {
if (pEvdev->abs_queued && (pEvdev->flags & EVDEV_RELATIVE_MODE)) { /* convert to relative motion for touchpads */
if (pEvdev->in_proximity) { if (pEvdev->flags & EVDEV_RELATIVE_MODE) {
if (valuator_mask_isset(pEvdev->vals, 0)) 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) - if (valuator_mask_isset(pEvdev->old_vals, 0))
valuator_mask_get(pEvdev->old_vals, 0); delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
valuator_mask_set(pEvdev->old_vals, 0, valuator_mask_get(pEvdev->old_vals, 0);
valuator_mask_get(pEvdev->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->vals, 1))
if (valuator_mask_isset(pEvdev->old_vals, 1)) {
delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) - if (valuator_mask_isset(pEvdev->old_vals, 1))
valuator_mask_get(pEvdev->old_vals, 1); delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
valuator_mask_set(pEvdev->old_vals, 1, valuator_mask_get(pEvdev->old_vals, 1);
valuator_mask_get(pEvdev->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 { } 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) { if (pEvdev->rel_queued) {

Loading…
Cancel
Save