From d7e61a7074b802b49f57549530b289bbaa0a4855 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 10 Nov 2015 14:35:51 +1000 Subject: Only map x and y to axes 0 and 1 The Logitech G600 has one device with all axes north of ABS_MISC. The current code assigns ABS_MISC as first axis to map to axis 0, i.e. x. On button press, one node sends the BTN_LEFT but the other node sends an ABS_MISC with a 1 0 value. ABS_MISC is mapped to axis 0, this moves the pointer to (0, y) on every button click. Avoid this by simply mapping any axis other than x/y to at least axis 3, and make sure we only override the MT 0/1 axes when we actually have MT axes. https://bugs.freedesktop.org/show_bug.cgi?id=92856 Signed-off-by: Peter Hutterer Reviewed-by: Keith Packard --- src/evdev.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 17d9d61..3176660 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1377,7 +1377,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) } atoms = malloc((pEvdev->num_vals + num_mt_axes) * sizeof(Atom)); - i = 0; + i = 2; for (axis = ABS_X; i < MAX_VALUATORS && axis <= ABS_MAX; axis++) { int j; pEvdev->abs_axis_map[axis] = -1; @@ -1385,9 +1385,14 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) is_blacklisted_axis(axis)) continue; - mapping = i; + if (axis == ABS_X) + mapping = 0; + else if (axis == ABS_Y) + mapping = 1; + else + mapping = i; - for (j = 0; j < ArrayLength(mt_axis_mappings); j++) + for (j = 0; !pEvdev->fake_mt && j < ArrayLength(mt_axis_mappings); j++) { if (mt_axis_mappings[j].code == axis) mt_axis_mappings[j].mapping = mapping; -- cgit v1.2.3