From 70e9fd78749ee6b577621cd5148ec69640dc62a0 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 30 Nov 2015 15:04:49 +1000 Subject: [PATCH] tablet: force the pressure/distance to 0 depending on contact state If we have pressure but not BTN_TOUCH, force the pressure to 0. Otherwise, force distance to 0. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-tablet.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c index 2442ecd6..71e66430 100644 --- a/src/evdev-tablet.c +++ b/src/evdev-tablet.c @@ -846,23 +846,35 @@ tablet_notify_buttons(struct tablet_dispatch *tablet, static void sanitize_tablet_axes(struct tablet_dispatch *tablet) { + bool tool_in_contact; const struct input_absinfo *distance, *pressure; distance = libevdev_get_abs_info(tablet->device->evdev, ABS_DISTANCE); pressure = libevdev_get_abs_info(tablet->device->evdev, ABS_PRESSURE); + tool_in_contact = (tablet_has_status(tablet, TABLET_TOOL_IN_CONTACT) || + tablet_has_status(tablet, + TABLET_TOOL_ENTERING_CONTACT)); + /* Keep distance and pressure mutually exclusive */ if (distance && (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_DISTANCE) || bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_PRESSURE)) && distance->value > distance->minimum && pressure->value > pressure->minimum) { - clear_bit(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_DISTANCE); - tablet->axes[LIBINPUT_TABLET_TOOL_AXIS_DISTANCE] = 0; + if (tool_in_contact) { + clear_bit(tablet->changed_axes, + LIBINPUT_TABLET_TOOL_AXIS_DISTANCE); + tablet->axes[LIBINPUT_TABLET_TOOL_AXIS_DISTANCE] = + 0; + } else { + clear_bit(tablet->changed_axes, + LIBINPUT_TABLET_TOOL_AXIS_PRESSURE); + tablet->axes[LIBINPUT_TABLET_TOOL_AXIS_PRESSURE] = 0; + } } else if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_PRESSURE) && - (!tablet_has_status(tablet, TABLET_TOOL_IN_CONTACT) && - !tablet_has_status(tablet, TABLET_TOOL_ENTERING_CONTACT))) { + !tool_in_contact) { /* Make sure that the last axis value sent to the caller is a 0 */ if (tablet->axes[LIBINPUT_TABLET_TOOL_AXIS_PRESSURE] == 0) clear_bit(tablet->changed_axes,