Skip to content

Commit

Permalink
Only init abs axes if we don't have acceleration
Browse files Browse the repository at this point in the history
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@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
  • Loading branch information
whot committed May 21, 2015
1 parent 158e326 commit 3d6afca
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/libinput.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ struct xf86libinput {
double y_remainder;
} scale;

BOOL has_abs;

ValuatorMask *valuators;

struct options {
Expand Down Expand Up @@ -526,6 +528,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
Expand Down Expand Up @@ -636,7 +640,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);
Expand Down Expand Up @@ -709,6 +714,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);

Expand Down

0 comments on commit 3d6afca

Please sign in to comment.