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,
/* 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) {
.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);