diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2020-03-29 09:19:27 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2020-06-17 12:09:18 +1000 |
commit | 86d81a0ac7f2b68327f3ed49f609ccfde5a0ce43 (patch) | |
tree | 0e9a4c15b88a5057f4700f3c6e393cc0b6f2a77d | |
parent | 0e7a92b4c12e449fe969e7ff21a576b2f30ea58b (diff) |
tablet: use the AttrPressureRange quirk for tablets too
The Aiptek 8000U has a pressure offset above our default (%5) but no
meaningful way of detecting that. It doesn't provide distance or BTN_TOOL_PEN
either, so our heuristics can't hook onto anything. BTN_TOUCH is set by this
tablet but not at consistent pressure thresholds.
Work around this by shipping a quirk that ups it to 70. Aiptek
re-uses USB IDs because of course they do, so this applies to more than one
device. Let's see what breaks.
Fixes #462
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 72af32c89e1dd03301c1b28d35afb4c513b4ed82)
-rw-r--r-- | quirks/30-vendor-aiptek.quirks | 7 | ||||
-rw-r--r-- | src/evdev-tablet.c | 63 |
2 files changed, 51 insertions, 19 deletions
diff --git a/quirks/30-vendor-aiptek.quirks b/quirks/30-vendor-aiptek.quirks index 23194e0f..3efddb63 100644 --- a/quirks/30-vendor-aiptek.quirks +++ b/quirks/30-vendor-aiptek.quirks @@ -5,3 +5,10 @@ MatchUdevType=tablet MatchBus=usb MatchVendor=0x08CA AttrEventCodeDisable=ABS_TILT_X;ABS_TILT_Y; + +[Aiptek 8000U pressure threshold] +MatchUdevType=tablet +MatchBus=usb +MatchVendor=0x08CA +MatchProduct=0x0010 +AttrPressureRange=70:50 diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c index cd07ae0a..dc7eebfb 100644 --- a/src/evdev-tablet.c +++ b/src/evdev-tablet.c @@ -1066,6 +1066,49 @@ axis_range_percentage(const struct input_absinfo *a, double percent) return (a->maximum - a->minimum) * percent/100.0 + a->minimum; } +static inline void +tool_set_pressure_thresholds(struct tablet_dispatch *tablet, + struct libinput_tablet_tool *tool) +{ + struct evdev_device *device = tablet->device; + const struct input_absinfo *pressure; + struct quirks_context *quirks = NULL; + struct quirks *q = NULL; + struct quirk_range r; + int lo = 0, hi = 1; + + tool->pressure_offset = 0; + tool->has_pressure_offset = false; + + pressure = libevdev_get_abs_info(device->evdev, ABS_PRESSURE); + if (!pressure) + goto out; + + quirks = evdev_libinput_context(device)->quirks; + q = quirks_fetch_for_device(quirks, device->udev_device); + + tool->pressure_offset = pressure->minimum; + + /* 5 and 1% of the pressure range */ + hi = axis_range_percentage(pressure, 5); + lo = axis_range_percentage(pressure, 1); + + if (q && quirks_get_range(q, QUIRK_ATTR_PRESSURE_RANGE, &r)) { + if (r.lower >= r.upper) { + evdev_log_info(device, + "Invalid pressure range, using defaults\n"); + } else { + hi = r.upper; + lo = r.lower; + } + } +out: + tool->pressure_threshold.upper = hi; + tool->pressure_threshold.lower = lo; + + quirks_unref(q); +} + static struct libinput_tablet_tool * tablet_get_tool(struct tablet_dispatch *tablet, enum libinput_tablet_tool_type type, @@ -1116,8 +1159,6 @@ tablet_get_tool(struct tablet_dispatch *tablet, /* If we didn't already have the new_tool in our list of tools, * add it */ if (!tool) { - const struct input_absinfo *pressure; - tool = zalloc(sizeof *tool); *tool = (struct libinput_tablet_tool) { @@ -1127,23 +1168,7 @@ tablet_get_tool(struct tablet_dispatch *tablet, .refcount = 1, }; - tool->pressure_offset = 0; - tool->has_pressure_offset = false; - tool->pressure_threshold.lower = 0; - tool->pressure_threshold.upper = 1; - - pressure = libevdev_get_abs_info(tablet->device->evdev, - ABS_PRESSURE); - if (pressure) { - tool->pressure_offset = pressure->minimum; - - /* 5 and 1% of the pressure range */ - tool->pressure_threshold.upper = - axis_range_percentage(pressure, 5); - tool->pressure_threshold.lower = - axis_range_percentage(pressure, 1); - } - + tool_set_pressure_thresholds(tablet, tool); tool_set_bits(tablet, tool); list_insert(tool_list, &tool->link); |