summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2020-03-29 09:19:27 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2020-06-17 12:09:18 +1000
commit86d81a0ac7f2b68327f3ed49f609ccfde5a0ce43 (patch)
tree0e9a4c15b88a5057f4700f3c6e393cc0b6f2a77d
parent0e7a92b4c12e449fe969e7ff21a576b2f30ea58b (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.quirks7
-rw-r--r--src/evdev-tablet.c63
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);