dix: pre-scale relative events from abs devices to desktop ratio (#31636)
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 11 Jan 2013 04:22:07 +0000 (14:22 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 8 Feb 2013 04:00:57 +0000 (14:00 +1000)
commit61a99aff9d33728a0b67920254d2d4d79f80cf39
treeab2e53b9b5135a6ff5e224e4808f34ef2416a18e
parenta6ba2b79ae8ad0fdee3f208d5e030b012df48785
dix: pre-scale relative events from abs devices to desktop ratio (#31636)

Absolute devices may send relative events depending on the mode (synaptics
by default, wacom per option). The relative events are added to the previous
position, converted into device coordinates and then scaled into desktop
coordinates for pointer movement.

Because the device range must be mapped into the desktop coordinate range,
this results in uneven scaling depending dimensions, e.g. on a setup with
width == 2 * height, a relative movement of 10/10 in device coordinates
results in a cursor movement of 20/10 (+ acceleration)

Other commonly user-visible results:
* the touchpad changing acceleration once an external monitor as added.
* drawing a circle on a wacom tablet in relative mode gives an ellipsis in
  the same ratio as the desktop dimensions.

Solution: pre-scale the incoming relative x/y coordinates by width/height
ratio of the total desktop size. Then add them to the previous
coordinates and scale back with the previous mapping, which will undo the
pre-scaling and give us the right movement.

X.Org Bug 31636 <http://bugs.freedesktop.org/show_bug.cgi?id=31636>

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
dix/getevents.c