diff -ru src_orig/evdev.c src/evdev.c --- src_orig/evdev.c 2014-08-03 19:22:50.726954463 +0200 +++ src/evdev.c 2014-08-21 17:19:01.716878879 +0200 @@ -449,6 +449,15 @@ int *delta = pEvdev->delta; if (pEvdev->abs_queued) { + // If reporting anything, try to report all the valuators + int i; + for(i = 0; i < pEvdev->num_vals; i++) + if (!valuator_mask_isset(pEvdev->vals, i)) { + int val; + if (valuator_mask_fetch(pEvdev->old_vals, i, &val)) + valuator_mask_set(pEvdev->vals, i, val); + } + /* convert to relative motion for touchpads */ if (pEvdev->flags & EVDEV_RELATIVE_MODE) { if (pEvdev->in_proximity) { @@ -476,10 +485,9 @@ pEvdev->rel_queued = 1; } else { 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); + for(i = 0; i < pEvdev->num_vals; i++) + if (valuator_mask_fetch(pEvdev->vals, i, &val)) + valuator_mask_set(pEvdev->old_vals, i, val); } } @@ -944,7 +952,7 @@ pEvdev->queue[i].val)) break; - if (pEvdev->abs_queued && pEvdev->in_proximity) { + if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS) { xf86PostButtonEventP(pInfo->dev, Absolute, pEvdev->queue[i].detail.key, pEvdev->queue[i].val, first_v, num_v, v + first_v); @@ -978,6 +986,12 @@ int v[MAX_VALUATORS] = {}; EvdevPtr pEvdev = pInfo->private; + // report valuators with events + for (num_v = 0; num_v < pEvdev->num_vals; num_v ++) + if (!pEvdev->vals || !valuator_mask_fetch(pEvdev->vals, num_v , v+num_v)) + if (!pEvdev->old_vals || !valuator_mask_fetch(pEvdev->old_vals, num_v, v+num_v)) + break; + EvdevProcessProximityState(pInfo); EvdevProcessValuators(pInfo);