diff --git a/tools/libinput-list-quirks.c b/tools/libinput-list-quirks.c index 92dcbc59..533c4f3a 100644 --- a/tools/libinput-list-quirks.c +++ b/tools/libinput-list-quirks.c @@ -120,15 +120,77 @@ list_device_quirks(struct quirks_context *ctx, struct udev_device *device) quirks = quirks_fetch_for_device(ctx, device); if (!quirks) { - printf("Device has no quirks defined\n"); + fprintf(stderr, "Device has no quirks defined\n"); return; } ARRAY_FOR_EACH(qlist, q) { + const char *name; + struct quirk_dimensions dim; + struct quirk_range r; + uint32_t v; + char *s; + if (!quirks_has_quirk(quirks, *q)) continue; - printf("%s\n", quirk_get_name(*q)); + name = quirk_get_name(*q); + + switch (*q) { + case QUIRK_MODEL_ALPS_TOUCHPAD: + case QUIRK_MODEL_APPLE_TOUCHPAD: + case QUIRK_MODEL_APPLE_MAGICMOUSE: + case QUIRK_MODEL_TABLET_NO_TILT: + case QUIRK_MODEL_APPLE_TOUCHPAD_ONEBUTTON: + case QUIRK_MODEL_TOUCHPAD_VISIBLE_MARKER: + case QUIRK_MODEL_CYBORG_RAT: + case QUIRK_MODEL_CHROMEBOOK: + case QUIRK_MODEL_HP6910_TOUCHPAD: + case QUIRK_MODEL_HP8510_TOUCHPAD: + case QUIRK_MODEL_HP_PAVILION_DM4_TOUCHPAD: + case QUIRK_MODEL_HP_STREAM11_TOUCHPAD: + case QUIRK_MODEL_HP_ZBOOK_STUDIO_G3: + case QUIRK_MODEL_TABLET_NO_PROXIMITY_OUT: + case QUIRK_MODEL_LENOVO_SCROLLPOINT: + case QUIRK_MODEL_LENOVO_X230: + case QUIRK_MODEL_LENOVO_T450_TOUCHPAD: + case QUIRK_MODEL_TABLET_MODE_NO_SUSPEND: + case QUIRK_MODEL_LENOVO_CARBON_X1_6TH: + case QUIRK_MODEL_TRACKBALL: + case QUIRK_MODEL_LOGITECH_MARBLE_MOUSE: + case QUIRK_MODEL_BOUNCING_KEYS: + case QUIRK_MODEL_SYNAPTICS_SERIAL_TOUCHPAD: + case QUIRK_MODEL_SYSTEM76_BONOBO: + case QUIRK_MODEL_CLEVO_W740SU: + case QUIRK_MODEL_SYSTEM76_GALAGO: + case QUIRK_MODEL_SYSTEM76_KUDU: + case QUIRK_MODEL_WACOM_TOUCHPAD: + printf("%s=1\n", name); + break; + case QUIRK_ATTR_SIZE_HINT: + case QUIRK_ATTR_RESOLUTION_HINT: + quirks_get_dimensions(quirks, *q, &dim); + printf("%s=%ldx%ld\n", name, dim.x, dim.y); + break; + case QUIRK_ATTR_TOUCH_SIZE_RANGE: + case QUIRK_ATTR_PRESSURE_RANGE: + quirks_get_range(quirks, *q, &r); + printf("%s=%d:%d\n", name, r.upper, r.lower); + break; + case QUIRK_ATTR_PALM_SIZE_THRESHOLD: + case QUIRK_ATTR_PALM_PRESSURE_THRESHOLD: + case QUIRK_ATTR_TRACKPOINT_RANGE: + case QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD: + quirks_get_uint32(quirks, *q, &v); + printf("%s=%u\n", name, v); + break; + case QUIRK_ATTR_LID_SWITCH_RELIABILITY: + case QUIRK_ATTR_KEYBOARD_INTEGRATION: + case QUIRK_ATTR_TPKBCOMBO_LAYOUT: + quirks_get_string(quirks, *q, &s); + printf("%s=%s\n", name, s); + break; + } } quirks_unref(quirks); diff --git a/tools/libinput-measure-touchpad-pressure b/tools/libinput-measure-touchpad-pressure index 25be07b5..765e7997 100755 --- a/tools/libinput-measure-touchpad-pressure +++ b/tools/libinput-measure-touchpad-pressure @@ -25,6 +25,7 @@ # import sys +import subprocess import argparse try: import evdev @@ -69,6 +70,8 @@ class TouchSequence(object): self.was_down = False self.is_palm = False self.was_palm = False + self.is_thumb = False + self.was_thumb = False self.prange = Range() @@ -87,6 +90,10 @@ class TouchSequence(object): if self.is_palm: self.was_palm = True + self.is_thumb = touch.pressure > self.device.thumb + if self.is_thumb: + self.was_thumb = True + def finalize(self): """Mark the TouchSequence as complete (finger is up)""" self.is_active = False @@ -121,17 +128,20 @@ class TouchSequence(object): s += " down" if self.was_palm: s += " palm" + if self.was_thumb: + s += " thumb" return s def _str_state(self): - s = "Touchpad pressure: {:3d} min: {:3d} max: {:3d} tags: {} {}" \ + s = "Touchpad pressure: {:3d} min: {:3d} max: {:3d} tags: {} {} {}" \ .format( self.points[-1].pressure, self.prange.min, self.prange.max, "down" if self.is_down else " ", - "palm" if self.is_palm else " " + "palm" if self.is_palm else " ", + "thumb" if self.is_thumb else " " ) return s @@ -169,8 +179,9 @@ class Device(object): self.down = int(p.min + 0.12 * prange) self.up = int(p.min + 0.10 * prange) self.palm = 130 # the libinput default + self.thumb = p.max - self._init_thresholds_from_udev() + self._init_thresholds_from_quirks() self.sequences = [] def find_touchpad_device(self): @@ -187,16 +198,26 @@ class Device(object): print("Unable to find a touchpad device.", file=sys.stderr) sys.exit(1) - def _init_thresholds_from_udev(self): - context = pyudev.Context() - ud = pyudev.Devices.from_device_file(context, self.path) - v = ud.get('LIBINPUT_ATTR_PRESSURE_RANGE') - if v: - self.down, self.up = colon_tuple(v) + def _init_thresholds_from_quirks(self): + # FIXME: this uses the system-installed version + # but we should really auto-detect when this is started + # from the builddir + command = ['libinput', 'list-quirks', self.path] + cmd = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if cmd.returncode != 0: + print("Error querying quirks: {}".format(cmd.stderr.decode('utf-8')), file=sys.stderr) + return - v = ud.get('LIBINPUT_ATTR_PALM_PRESSURE_THRESHOLD') - if v: - self.palm = int(v) + stdout = cmd.stdout.decode('utf-8') + quirks = [q.split('=') for q in stdout.split('\n')] + + for q in quirks: + if q[0] == 'AttrPalmPressureThreshold': + self.palm = int(q[1]) + elif q[0] == 'AttrPressureRange': + self.down, self.up = colon_tuple(q[1]) + elif q[0] == 'AttrThumbPressureThreshold': + self.thumb = int(q[1]) def start_new_sequence(self, tracking_id): self.sequences.append(TouchSequence(self, tracking_id)) @@ -242,6 +263,7 @@ def loop(device): print("Ready for recording data.") print("Pressure range used: {}:{}".format(device.down, device.up)) print("Palm pressure range used: {}".format(device.palm)) + print("Thumb pressure range used: {}".format(device.thumb)) print("Place a single finger on the touchpad to measure pressure values.\n" "Ctrl+C to exit\n")