Index: xserver-xorg-input-evdev-2.6.0/src/evdev.c =================================================================== --- xserver-xorg-input-evdev-2.6.0.orig/src/evdev.c 2011-11-04 05:05:00.000000000 -0400 +++ xserver-xorg-input-evdev-2.6.0/src/evdev.c 2011-11-04 05:17:02.000000000 -0400 @@ -448,21 +448,30 @@ * just works. */ else if (pEvdev->abs_queued && pEvdev->in_proximity) { - int unswapped_x = valuator_mask_get(pEvdev->vals, 0); - int unswapped_y = valuator_mask_get(pEvdev->vals, 1); int i; + int val; + int set=0; for (i = 0; i <= 1; i++) { - int val; + if (valuator_mask_isset(pEvdev->vals, i)) { + val = valuator_mask_get(pEvdev->vals, i); + valuator_mask_set(pEvdev->old_vals, i, val); + set=1; + } + } + if (!set) + return; + for (i = 0; i <= 1; i++) { int calib_min; int calib_max; + int src; + src = pEvdev->swap_axes ? 1-i : i; - if (!valuator_mask_isset(pEvdev->vals, i)) + if (!valuator_mask_isset(pEvdev->old_vals, src)) continue; + val = valuator_mask_get(pEvdev->old_vals, src); - val = valuator_mask_get(pEvdev->vals, i); - - if (i == 0) { + if (src == 0) { calib_min = pEvdev->calibration.min_x; calib_max = pEvdev->calibration.max_x; } else { @@ -471,11 +480,11 @@ } if (pEvdev->swap_axes) - val = xf86ScaleAxis((i == 0 ? unswapped_y : unswapped_x), + val = xf86ScaleAxis(val, pEvdev->absinfo[i].maximum, pEvdev->absinfo[i].minimum, - pEvdev->absinfo[1 - i].maximum, - pEvdev->absinfo[1 - i].minimum); + pEvdev->absinfo[src].maximum, + pEvdev->absinfo[src].minimum); if (pEvdev->flags & EVDEV_CALIBRATED) val = xf86ScaleAxis(val, pEvdev->absinfo[i].maximum,