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