[PATCH xf86-input-libinput] Only init abs axes if we don't have acceleration

Hans de Goede hdegoede at redhat.com
Thu May 21 02:23:00 PDT 2015


Hi,

On 20-05-15 23:58, Peter Hutterer wrote:
> 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 <peter.hutterer at who-t.net>

Not optimal, but I think this should work fine:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
> 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);
>
>


More information about the xorg-devel mailing list