mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-03-21 11:00:39 +01:00
Merge branch 'wip/measure-thumb-pressure'
This commit is contained in:
commit
84ef08dd7f
2 changed files with 98 additions and 14 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue