A lot of devices (mainly MS input devices) have abs axes on top of the relative axes. Those axes are usually mute but with the current code we set up absolute axes for those devices. Relative events are then scaled by the server which makes the device appear slow.
As an immediate fix always prefer relative axes and only set up absolute axes if the device has a calibration matrix but no pointer acceleration. This may mess up other devices where the relative axes are dead, we'll deal with this when it comes. https://bugs.freedesktop.org/show_bug.cgi?id=90322 Signed-off-by: Peter Hutterer <[email protected]> --- Long term we need to look at splitting a second xorg device out if we get events from an interface that we didn't expect. Let's deal with that when we have to. src/libinput.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libinput.c b/src/libinput.c index 1b84e21..3cc4426 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -91,6 +91,8 @@ struct xf86libinput { double y_remainder; } scale; + BOOL has_abs; + ValuatorMask *valuators; ValuatorMask *valuators_unaccelerated; @@ -533,6 +535,8 @@ xf86libinput_init_pointer_absolute(InputInfoPtr pInfo) SetScrollValuator(dev, 2, SCROLL_TYPE_HORIZONTAL, driver_data->scroll.hdist, 0); SetScrollValuator(dev, 3, SCROLL_TYPE_VERTICAL, driver_data->scroll.vdist, 0); + driver_data->has_abs = TRUE; + return Success; } static void @@ -643,7 +647,8 @@ xf86libinput_init(DeviceIntPtr dev) if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) xf86libinput_init_keyboard(pInfo); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { - if (libinput_device_config_calibration_has_matrix(device)) + if (libinput_device_config_calibration_has_matrix(device) && + !libinput_device_config_accel_is_available(device)) xf86libinput_init_pointer_absolute(pInfo); else xf86libinput_init_pointer(pInfo); @@ -728,6 +733,13 @@ xf86libinput_handle_absmotion(InputInfoPtr pInfo, struct libinput_event_pointer ValuatorMask *mask = driver_data->valuators; double x, y; + if (!driver_data->has_abs) { + xf86IDrvMsg(pInfo, X_ERROR, + "Discarding absolute event from relative device. " + "Please file a bug\n"); + return; + } + x = libinput_event_pointer_get_absolute_x_transformed(event, TOUCH_AXIS_MAX); y = libinput_event_pointer_get_absolute_y_transformed(event, TOUCH_AXIS_MAX); -- 2.3.5 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
