Commit 72af32c8 authored by Peter Hutterer's avatar Peter Hutterer

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 #462Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent 4a9d3e87
......@@ -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
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment