Merge branch 'wip/measure-thumb-pressure'

This commit is contained in:
Peter Hutterer 2018-06-21 11:34:11 +10:00
commit 84ef08dd7f
2 changed files with 98 additions and 14 deletions

View file

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

View file

@ -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")