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-04 09:21:54.798362041 +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); } }