Skip to content

Commit

Permalink
tablet: use the AttrPressureRange quirk for tablets too
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
whot committed Mar 31, 2020
1 parent 4a9d3e8 commit 72af32c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 19 deletions.
7 changes: 7 additions & 0 deletions quirks/30-vendor-aiptek.quirks
Original file line number Diff line number Diff line change
Expand Up @@ -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
63 changes: 44 additions & 19 deletions src/evdev-tablet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down

0 comments on commit 72af32c

Please sign in to comment.