Compare commits

...

29 commits
main ... 1.3.3

Author SHA1 Message Date
Peter Hutterer
ef03affa2a configure.ac: libinput 1.3.3
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-24 15:02:41 +10:00
Peter Hutterer
a6c2274ab5 touchpad: re-enable hysteresis by default for all devices
The removal of the hysteresis even on precise touchpads has led to
difficulties controlling the cursor in a few instances. Since 27078b2667
we only have the hysteresis on Apple touchpads and the Lenovo *40 series and
later. Even on those do we see some positioning difficulties (bug 94379).

So restore the hysteresis by default again for all touchpads. In the future a
knob could be exposed for precision vs reactivity or something, but for now
the drawback of imprecise positioning does not outweigh the benefits we get
on those few devices.

https://bugs.freedesktop.org/show_bug.cgi?id=94379

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 48473994c8)
2016-06-24 14:13:05 +10:00
Peter Hutterer
762e752899 Revert "touchpad: reset the motion history on significant negative pressure changes"
We will reinstate the hysteresis for all devices making the negative
pressure check unncessary.

This reverts commit ef48c07a96.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 89747d7143)
2016-06-24 14:08:20 +10:00
Peter Hutterer
7e3cfc261e Revert "touchpad: only use negative pressure change check on Lenovo *50 and *60 series"
We will reinstate the hysteresis for all devices making the negative pressure
check unncessary and thus this commit as well.

This reverts commit 2f5231cc88.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 8d73275166)
2016-06-24 14:08:17 +10:00
Peter Hutterer
18380006ee Revert "test: add a test for the T450 dropped motion events"
This reverts commit b5527fa4c7.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit dd73c5391e)
2016-06-24 14:08:15 +10:00
Peter Hutterer
1d1d608d38 pad: change button map ordering
BTN_A and above sort after BTN_BASE

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit a914e253fc)
2016-06-24 14:03:45 +10:00
Peter Hutterer
7cf5e5a4a9 touchpad: restore the hysteresis by default
A large part of the bugs seen right now are related to touchpads jittering too
much. Fixing them one by one is entertaining, but time consuming. Right now
the number of touchpads that require a hysteresis seem to outnumber those that
don't, so switch the approach around: leave the hysteresis in place but
disable it for those touchpads that don't need it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 27078b2667)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-24 14:03:28 +10:00
Peter Hutterer
54591d47ff tools: show tablet-pad capabilities in libinput-list-devices
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 4f8088066c)
2016-06-24 14:00:46 +10:00
Peter Hutterer
b03fc49a83 tools: add missing space after listing touch/tablet capabilities
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 34eff6564d)
2016-06-24 14:00:39 +10:00
Peter Hutterer
5a599654d8 Drop the ALPS_RUSHMORE tag
Was only used for the touchpad hysteresis, we can re-use the wobbly touchpad
tag for this.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit e1915b53b5)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-24 13:59:00 +10:00
Peter Hutterer
762ea1563c test: when creating an abs test device, force the abs->value to the mimimum
Otherwise the abs->value could lie outside the [min, max] range of the axis.
This isn't much of an issue for actual axes but in the case of ABS_MT_SLOT
(value 47) it causes errors when libevdev sanitises the event into the allowed
slot range.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 5f55d71774)
2016-06-20 11:29:17 +10:00
Peter Hutterer
8be6d697ac configure.ac: libinput 1.3.2
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-16 15:14:55 +10:00
Peter Hutterer
2908beb272 touchpad: don't warn about kernel jumps on semi-mt devices
These devices are all over the place anyway, no need to spam the log, just
silently discard the jumps.

https://bugs.freedesktop.org/show_bug.cgi?id=96275

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 92b21247f4)
2016-06-16 14:42:39 +10:00
Peter Hutterer
d9c8da9da6 evdev: check model flags for actual booleans
The hwdb doesn't allow unsetting a property so once we start nesting model
flags it'll become important to be able to be able to unset one as well (by
assigning it to 0).

So rather than checking for existence, check whether the property is actually
set to something resembling a boolean.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Tested-by: Vasily Khoruzhick <anarsoul@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit c781ef2eb3)
2016-06-16 14:42:29 +10:00
Peter Hutterer
f9207606aa touchpad: warn if we have invalid touchpad ranges
Quite a few bugs are caused by touchpad ranges being out of whack. If we get
input events significantly outside the expected range (5% width/height as
error margin) print a warning to the log.

And add a new doc page to explain what is happening and how to fix it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit faf7a6107f)
2016-06-16 14:41:53 +10:00
Peter Hutterer
41f03cb767 touchpad: fix link in error message - add missing '.html'
https://bugs.freedesktop.org/show_bug.cgi?id=96191

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 83b0f3c4f3)
2016-06-16 14:41:53 +10:00
Peter Hutterer
6bff32a750 tools: add missing space in libinput-list-devices output
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit f929aff6c6)
2016-06-16 14:40:32 +10:00
Peter Hutterer
568be0867f configure.ac: libinput 1.3.1
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-30 08:52:57 +10:00
Peter Hutterer
0d5d367a82 doc: add the missing svg files to the Makefile.am
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 8d80aae784)
2016-05-30 08:52:57 +10:00
Peter Hutterer
0694e46ccf doc: sort the svg files alphabetically
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 7f9c1f1c6c)
2016-05-30 08:52:57 +10:00
Peter Hutterer
97ff0002e9 pad: ignore EV_MSC events
The Wacom Express Key Remote sends the serial number via EV_MSC. At some later
point we'll need the serial to match the LEDs correctly but for now we can
ignore them.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 0933650f66)
2016-05-30 08:31:59 +10:00
Peter Hutterer
23bacd16c3 doc: update ref/unref behavior for the tablet tool
Brings it in line with the rest of libinput.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 40e3fe2384)
2016-05-30 08:31:53 +10:00
Peter Hutterer
5acd9a373b doc: update doc to explicitly state that the seat isn't referenced
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit c2dfe504ed)
2016-05-30 08:31:52 +10:00
Peter Hutterer
e2c54e1db2 udev: mark ALPS touchpads fw version 300 as wobbly touchpads
Includes the Dell Lattitude E5420 but since all alps touchpads with the same
fw version are the same (as far as we know) hooking this off the firmware
version should cover this generation.

https://bugzilla.redhat.com/show_bug.cgi?id=1336084

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit cebbe0c2da)
2016-05-30 08:31:43 +10:00
Peter Hutterer
dca3360866 udev: add the Yoga 2 to the wobbly touchpads
https://bugs.freedesktop.org/show_bug.cgi?id=95290

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 595b5f6ae7)
2016-05-30 08:31:42 +10:00
Peter Hutterer
c69a5bb785 doc: fix a few typos
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 5f4f211d6d)
2016-05-30 08:31:37 +10:00
Peter Hutterer
58f6eed9db touchpad: only use negative pressure change check on Lenovo *50 and *60 series
This was introduced for bug 94379 - an X1 Carbon 3rd. Other touchpads have
different pressure change ranges, causing this condition to trigger
randomly and resulting in a jerky pointer motion.

For now, reduce the check to the *50 and *60 series touchpads until we have
data for more touchpads that we can add one-by-one.

https://bugs.freedesktop.org/show_bug.cgi?id=95393

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 2f5231cc88)
2016-05-30 08:31:24 +10:00
Peter Hutterer
544d4b6b74 evdev: the range between dpad and trigger-happy are keys, not buttons
Affected keys:
	KEY_ALS_TOGGLE
	KEY_BUTTONCONFIG
	KEY_TASKMANAGER
	KEY_JOURNAL
	KEY_CONTROLPANEL
	KEY_APPSELECT
	KEY_SCREENSAVER
	KEY_VOICECOMMAND
	KEY_BRIGHTNESS_MIN
	KEY_BRIGHTNESS_MAX
	KEY_KBDINPUTASSIST_PREV
	KEY_KBDINPUTASSIST_NEXT
	KEY_KBDINPUTASSIST_PREVGROUP
	KEY_KBDINPUTASSIST_NEXTGROUP
	KEY_KBDINPUTASSIST_ACCEPT
	KEY_KBDINPUTASSIST_CANCEL

https://bugs.freedesktop.org/show_bug.cgi?id=95295

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 8527242ed9)
2016-05-30 08:31:16 +10:00
Peter Hutterer
31ffda96fa gestures: don't send swipe gestures when gestures are disabled
Introduced in 6ad303b as part of an code flow optimization, causing any 3+
finger gesture to be posted as swipe gesture, even when gestures are disabled.
However, the event is filtered in the higher levels with a bug message printed
to the log.

Don't post swipe gestures for devices where gestures are disabled.

https://bugs.freedesktop.org/show_bug.cgi?id=95314

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 98ee1791ca)
2016-05-30 08:31:06 +10:00
17 changed files with 296 additions and 168 deletions

View file

@ -2,7 +2,7 @@ AC_PREREQ([2.64])
m4_define([libinput_major_version], [1]) m4_define([libinput_major_version], [1])
m4_define([libinput_minor_version], [3]) m4_define([libinput_minor_version], [3])
m4_define([libinput_micro_version], [0]) m4_define([libinput_micro_version], [3])
m4_define([libinput_version], m4_define([libinput_version],
[libinput_major_version.libinput_minor_version.libinput_micro_version]) [libinput_major_version.libinput_minor_version.libinput_micro_version])
@ -35,7 +35,7 @@ AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
# b) If interfaces have been changed or added, but binary compatibility has # b) If interfaces have been changed or added, but binary compatibility has
# been preserved, change to C+1:0:A+1 # been preserved, change to C+1:0:A+1
# c) If the interface is the same as the previous version, change to C:R+1:A # c) If the interface is the same as the previous version, change to C:R+1:A
LIBINPUT_LT_VERSION=18:3:8 LIBINPUT_LT_VERSION=18:6:8
AC_SUBST(LIBINPUT_LT_VERSION) AC_SUBST(LIBINPUT_LT_VERSION)
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])

View file

@ -11,6 +11,7 @@ header_files = \
$(top_srcdir)/src/libinput.h \ $(top_srcdir)/src/libinput.h \
$(top_srcdir)/README.txt \ $(top_srcdir)/README.txt \
$(srcdir)/absolute-axes.dox \ $(srcdir)/absolute-axes.dox \
$(srcdir)/absolute-coordinate-ranges.dox \
$(srcdir)/clickpad-softbuttons.dox \ $(srcdir)/clickpad-softbuttons.dox \
$(srcdir)/device-configuration-via-udev.dox \ $(srcdir)/device-configuration-via-udev.dox \
$(srcdir)/faqs.dox \ $(srcdir)/faqs.dox \
@ -37,17 +38,25 @@ diagram_files = \
$(srcdir)/dot/libinput-stack-xorg.gv \ $(srcdir)/dot/libinput-stack-xorg.gv \
$(srcdir)/dot/libinput-stack-gnome.gv \ $(srcdir)/dot/libinput-stack-gnome.gv \
$(srcdir)/dot/evemu.gv \ $(srcdir)/dot/evemu.gv \
$(srcdir)/svg/software-buttons.svg \
$(srcdir)/svg/clickfinger.svg \
$(srcdir)/svg/button-scrolling.svg \ $(srcdir)/svg/button-scrolling.svg \
$(srcdir)/svg/clickfinger.svg \
$(srcdir)/svg/clickfinger-distance.svg \
$(srcdir)/svg/edge-scrolling.svg \ $(srcdir)/svg/edge-scrolling.svg \
$(srcdir)/svg/gesture-2fg-ambiguity.svg \
$(srcdir)/svg/palm-detection.svg \ $(srcdir)/svg/palm-detection.svg \
$(srcdir)/svg/pinch-gestures.svg \ $(srcdir)/svg/pinch-gestures.svg \
$(srcdir)/svg/pinch-gestures-softbuttons.svg \
$(srcdir)/svg/ptraccel-linear.svg \ $(srcdir)/svg/ptraccel-linear.svg \
$(srcdir)/svg/ptraccel-low-dpi.svg \ $(srcdir)/svg/ptraccel-low-dpi.svg \
$(srcdir)/svg/ptraccel-touchpad.svg \ $(srcdir)/svg/ptraccel-touchpad.svg \
$(srcdir)/svg/ptraccel-trackpoint.svg \ $(srcdir)/svg/ptraccel-trackpoint.svg \
$(srcdir)/svg/software-buttons.svg \
$(srcdir)/svg/swipe-gestures.svg \ $(srcdir)/svg/swipe-gestures.svg \
$(srcdir)/svg/tablet-axes.svg \
$(srcdir)/svg/tablet-interfaces.svg \
$(srcdir)/svg/tablet-left-handed.svg \
$(srcdir)/svg/tablet-out-of-bounds.svg \
$(srcdir)/svg/tablet.svg \
$(srcdir)/svg/tap-n-drag.svg \ $(srcdir)/svg/tap-n-drag.svg \
$(srcdir)/svg/thumb-detection.svg \ $(srcdir)/svg/thumb-detection.svg \
$(srcdir)/svg/top-software-buttons.svg \ $(srcdir)/svg/top-software-buttons.svg \

View file

@ -0,0 +1,119 @@
/**
@page absolute_coordinate_ranges Coordinate ranges for absolute axes
libinput requires that all touchpads provide a correct axis range and
resolution. These are used to enable or disable certain features or adapt
the interaction with the touchpad. For example, the software button area is
narrower on small touchpads to avoid reducing the interactive surface too
much. Likewise, palm detection works differently on small touchpads as palm
interference is less likely to happen.
Touchpads with incorrect axis ranges generate error messages
in the form:
<blockquote>
Axis 0x35 value 4000 is outside expected range [0, 3000]
</blockquote>
This error message indicates that the ABS_MT_POSITION_X axis (i.e. the x
axis) generated an event outside the expected range of 0-3000. In this case
the value was 4000.
This discrepancy between the coordinate range the kernels advertises vs.
what the touchpad sends can be the source of a number of perceived
bugs in libinput.
@section absolute_coordinate_ranges_fix Measuring and fixing touchpad ranges
To fix the touchpad you need to:
-# measure the physical size of your touchpad in mm
-# run touchpad-edge-detector
-# trim the udev match rule to something sensible
-# replace the resolution with the calculated resolution based on physical
settings
-# test locally
-# send a patch to the systemd project
Detailed explanations are below.
[libevdev](http://freedesktop.org/wiki/Software/libevdev/) provides a tool
called **touchpad-edge-detector** that allows measuring the touchpad's input
ranges. Run the tool as root against the device node of your touchpad device
and repeatedly move a finger around the whole outside area of the
touchpad. Then control+c the process and note the output.
An example output is below:
@code
$> sudo touchpad-edge-detector /dev/input/event4
Touchpad SynPS/2 Synaptics TouchPad on /dev/input/event4
Move one finger around the touchpad to detect the actual edges
Kernel says: x [1024..3112], y [2024..4832]
Touchpad sends: x [2445..4252], y [3464..4071]
Touchpad size as listed by the kernel: 49x66mm
Calculate resolution as:
x axis: 2088/<width in mm>
y axis: 2808/<height in mm>
Suggested udev rule:
# <Laptop model description goes here>
evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvnLENOVO:bvrGJET72WW(2.22):bd02/21/2014:svnLENOVO:pn20ARS25701:pvrThinkPadT440s:rvnLENOVO:rn20ARS25701:rvrSDK0E50512STD:cvnLENOVO:ct10:cvrNotAvailable:*
EVDEV_ABS_00=2445:4252:<x resolution>
EVDEV_ABS_01=3464:4071:<y resolution>
EVDEV_ABS_35=2445:4252:<x resolution>
EVDEV_ABS_36=3464:4071:<y resolution>
@endcode
Note the discrepancy between the coordinate range the kernels advertises vs.
what the touchpad sends.
To fix the advertised ranges, the udev rule should be taken and trimmed
before being sent to the [systemd project](https://github.com/systemd/systemd).
An example commit can be found
[here](https://github.com/systemd/systemd/commit/26f667eac1c5e89b689aa0a1daef6a80f473e045).
In most cases the match can and should be trimmed to the system vendor (svn)
and the product version (pvr), with everything else replaced by a wildcard
(*). In this case, a Lenovo T440s, a suitable match string would be: @code
evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*pvrThinkPadT440s*
@endcode
@note hwdb match strings only allow for alphanumeric ascii characters. Use a
wildcard (* or ?, whichever appropriate) for special characters.
The actual axis overrides are in the form:
@code
# axis number=min:max:resolution
EVDEV_ABS_00=2445:4252:42
@endcode
or, if the range is correct but the resolution is wrong
@code
# axis number=::resolution
EVDEV_ABS_00=::42
@endcode
Note the leading single space. The axis numbers are in hex and can be found
in *linux/input-event-codes.h*. For touchpads ABS_X, ABS_Y,
ABS_MT_POSITION_X and ABS_MT_POSITION_Y are required.
@note The touchpad's ranges and/or resolution should only be fixed when
there is a significant discrepancy. A few units do not make a difference and
a resolution that is off by 2 or less usually does not matter either.
Once a match and override rule has been found, follow the instructions at
the top of the
[60-evdev.hwdb](https://github.com/systemd/systemd/blob/master/hwdb/60-evdev.hwdb)
file to save it locally and trigger the udev hwdb reload. Rebooting is
always a good idea. If the match string is correct, the new properties will
show up in the
output of
@code
udevadm info /sys/class/input/event4
@endcode
Adjust the command for the event node of your touchpad.
A udev builtin will apply the new axis ranges automatically.
When the axis override is confirmed to work, please submit it as a patch to
the [systemd project](https://github.com/systemd/systemd) or if that is not
possible as a libinput bug here:
https://bugs.freedesktop.org/enter_bug.cgi?product=Wayland&component=libinput
*/

View file

@ -8,6 +8,7 @@
- @subpage palm_detection - @subpage palm_detection
- @subpage t440_support - @subpage t440_support
- @subpage touchpad_jumping_cursor - @subpage touchpad_jumping_cursor
- @subpage absolute_coordinate_ranges
@page touchscreens Touchscreens @page touchscreens Touchscreens

View file

@ -248,7 +248,7 @@ tp_gesture_handle_state_none(struct tp_dispatch *tp, uint64_t time)
if (ntouches == 2) if (ntouches == 2)
return GESTURE_STATE_SCROLL; return GESTURE_STATE_SCROLL;
else else
return GESTURE_STATE_SWIPE; return GESTURE_STATE_NONE;
} }
first = touches[0]; first = touches[0];

View file

@ -289,6 +289,39 @@ tp_get_delta(struct tp_touch *t)
return tp_normalize_delta(t->tp, delta); return tp_normalize_delta(t->tp, delta);
} }
static inline void
tp_check_axis_range(struct tp_dispatch *tp,
unsigned int code,
int value)
{
int min, max;
switch(code) {
case ABS_X:
case ABS_MT_POSITION_X:
min = tp->warning_range.min.x;
max = tp->warning_range.max.x;
break;
case ABS_Y:
case ABS_MT_POSITION_Y:
min = tp->warning_range.min.y;
max = tp->warning_range.max.y;
break;
default:
return;
}
if (value < min || value > max) {
log_info_ratelimit(tp_libinput_context(tp),
&tp->warning_range.range_warn_limit,
"Axis %#x value %d is outside expected range [%d, %d]\n"
"See %s/absolute_coordinate_ranges.html for details\n",
code, value, min, max,
HTTP_DOC_LINK);
}
}
static void static void
tp_process_absolute(struct tp_dispatch *tp, tp_process_absolute(struct tp_dispatch *tp,
const struct input_event *e, const struct input_event *e,
@ -298,12 +331,14 @@ tp_process_absolute(struct tp_dispatch *tp,
switch(e->code) { switch(e->code) {
case ABS_MT_POSITION_X: case ABS_MT_POSITION_X:
tp_check_axis_range(tp, e->code, e->value);
t->point.x = e->value; t->point.x = e->value;
t->millis = time; t->millis = time;
t->dirty = true; t->dirty = true;
tp->queued |= TOUCHPAD_EVENT_MOTION; tp->queued |= TOUCHPAD_EVENT_MOTION;
break; break;
case ABS_MT_POSITION_Y: case ABS_MT_POSITION_Y:
tp_check_axis_range(tp, e->code, e->value);
t->point.y = e->value; t->point.y = e->value;
t->millis = time; t->millis = time;
t->dirty = true; t->dirty = true;
@ -322,7 +357,6 @@ tp_process_absolute(struct tp_dispatch *tp,
tp_end_sequence(tp, t, time); tp_end_sequence(tp, t, time);
break; break;
case ABS_MT_PRESSURE: case ABS_MT_PRESSURE:
t->pressure_delta = e->value - t->pressure;
t->pressure = e->value; t->pressure = e->value;
t->dirty = true; t->dirty = true;
tp->queued |= TOUCHPAD_EVENT_OTHERAXIS; tp->queued |= TOUCHPAD_EVENT_OTHERAXIS;
@ -339,12 +373,14 @@ tp_process_absolute_st(struct tp_dispatch *tp,
switch(e->code) { switch(e->code) {
case ABS_X: case ABS_X:
tp_check_axis_range(tp, e->code, e->value);
t->point.x = e->value; t->point.x = e->value;
t->millis = time; t->millis = time;
t->dirty = true; t->dirty = true;
tp->queued |= TOUCHPAD_EVENT_MOTION; tp->queued |= TOUCHPAD_EVENT_MOTION;
break; break;
case ABS_Y: case ABS_Y:
tp_check_axis_range(tp, e->code, e->value);
t->point.y = e->value; t->point.y = e->value;
t->millis = time; t->millis = time;
t->dirty = true; t->dirty = true;
@ -953,13 +989,11 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
if (!t->dirty) if (!t->dirty)
continue; continue;
if (t->pressure_delta < -7)
tp_motion_history_reset(t);
if (tp_detect_jumps(tp, t)) { if (tp_detect_jumps(tp, t)) {
if (!tp->semi_mt)
log_bug_kernel(tp_libinput_context(tp), log_bug_kernel(tp_libinput_context(tp),
"Touch jump detected and discarded.\n" "Touch jump detected and discarded.\n"
"See %stouchpad_jumping_cursor for details\n", "See %stouchpad_jumping_cursor.html for details\n",
HTTP_DOC_LINK); HTTP_DOC_LINK);
tp_motion_history_reset(t); tp_motion_history_reset(t);
} }
@ -2031,33 +2065,34 @@ tp_init_hysteresis(struct tp_dispatch *tp)
{ {
int res_x, res_y; int res_x, res_y;
if (tp->device->model_flags & EVDEV_MODEL_CYAPA)
goto want_hysteresis;
if (tp->device->model_flags & EVDEV_MODEL_ALPS_RUSHMORE)
goto want_hysteresis;
if (tp->semi_mt &&
(tp->device->model_flags & EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD))
goto want_hysteresis;
if (tp->device->model_flags & EVDEV_MODEL_WOBBLY_TOUCHPAD)
goto want_hysteresis;
tp->hysteresis_margin.x = 0;
tp->hysteresis_margin.y = 0;
return;
want_hysteresis:
res_x = tp->device->abs.absinfo_x->resolution; res_x = tp->device->abs.absinfo_x->resolution;
res_y = tp->device->abs.absinfo_y->resolution; res_y = tp->device->abs.absinfo_y->resolution;
tp->hysteresis_margin.x = res_x/2; tp->hysteresis_margin.x = res_x/2;
tp->hysteresis_margin.y = res_y/2; tp->hysteresis_margin.y = res_y/2;
return; return;
} }
static void
tp_init_range_warnings(struct tp_dispatch *tp,
struct evdev_device *device,
int width,
int height)
{
const struct input_absinfo *x, *y;
x = device->abs.absinfo_x;
y = device->abs.absinfo_y;
tp->warning_range.min.x = x->minimum - 0.05 * width;
tp->warning_range.min.y = y->minimum - 0.05 * height;
tp->warning_range.max.x = x->maximum + 0.05 * width;
tp->warning_range.max.y = y->maximum + 0.05 * height;
/* One warning every 5 min is enough */
ratelimit_init(&tp->warning_range.range_warn_limit, s2us(3000), 1);
}
static int static int
tp_init(struct tp_dispatch *tp, tp_init(struct tp_dispatch *tp,
struct evdev_device *device) struct evdev_device *device)
@ -2081,6 +2116,8 @@ tp_init(struct tp_dispatch *tp,
height = device->abs.dimensions.y; height = device->abs.dimensions.y;
diagonal = sqrt(width*width + height*height); diagonal = sqrt(width*width + height*height);
tp_init_range_warnings(tp, device, width, height);
tp->reports_distance = libevdev_has_event_code(device->evdev, tp->reports_distance = libevdev_has_event_code(device->evdev,
EV_ABS, EV_ABS,
ABS_MT_DISTANCE); ABS_MT_DISTANCE);

View file

@ -155,7 +155,6 @@ struct tp_touch {
uint64_t millis; uint64_t millis;
int distance; /* distance == 0 means touch */ int distance; /* distance == 0 means touch */
int pressure; int pressure;
int pressure_delta;
struct { struct {
/* A quirk mostly used on Synaptics touchpads. In a /* A quirk mostly used on Synaptics touchpads. In a
@ -244,6 +243,11 @@ struct tp_dispatch {
struct device_coords hysteresis_margin; struct device_coords hysteresis_margin;
struct {
struct device_coords min, max;
struct ratelimit range_warn_limit;
} warning_range;
struct { struct {
double x_scale_coeff; double x_scale_coeff;
double y_scale_coeff; double y_scale_coeff;

View file

@ -403,6 +403,10 @@ pad_process(struct evdev_dispatch *dispatch,
case EV_SYN: case EV_SYN:
pad_flush(pad, device, time); pad_flush(pad, device, time);
break; break;
case EV_MSC:
/* The EKR sends the serial as MSC_SERIAL, ignore this for
* now */
break;
default: default:
log_error(device->base.seat->libinput, log_error(device->base.seat->libinput,
"Unexpected event type %s (%#x)\n", "Unexpected event type %s (%#x)\n",
@ -465,12 +469,12 @@ pad_init_buttons(struct pad_dispatch *pad,
pad->button_map[code] = map++; pad->button_map[code] = map++;
} }
for (code = BTN_A; code < BTN_A + 6; code++) { for (code = BTN_BASE; code < BTN_BASE + 2; code++) {
if (libevdev_has_event_code(device->evdev, EV_KEY, code)) if (libevdev_has_event_code(device->evdev, EV_KEY, code))
pad->button_map[code] = map++; pad->button_map[code] = map++;
} }
for (code = BTN_BASE; code < BTN_BASE + 2; code++) { for (code = BTN_A; code < BTN_A + 6; code++) {
if (libevdev_has_event_code(device->evdev, EV_KEY, code)) if (libevdev_has_event_code(device->evdev, EV_KEY, code))
pad->button_map[code] = map++; pad->button_map[code] = map++;
} }

View file

@ -568,7 +568,11 @@ get_key_type(uint16_t code)
return EVDEV_KEY_TYPE_BUTTON; return EVDEV_KEY_TYPE_BUTTON;
if (code >= KEY_OK && code <= KEY_LIGHTS_TOGGLE) if (code >= KEY_OK && code <= KEY_LIGHTS_TOGGLE)
return EVDEV_KEY_TYPE_KEY; return EVDEV_KEY_TYPE_KEY;
if (code >= BTN_DPAD_UP && code <= BTN_TRIGGER_HAPPY40) if (code >= BTN_DPAD_UP && code <= BTN_DPAD_RIGHT)
return EVDEV_KEY_TYPE_BUTTON;
if (code >= KEY_ALS_TOGGLE && code <= KEY_KBDINPUTASSIST_CANCEL)
return EVDEV_KEY_TYPE_KEY;
if (code >= BTN_TRIGGER_HAPPY && code <= BTN_TRIGGER_HAPPY40)
return EVDEV_KEY_TYPE_BUTTON; return EVDEV_KEY_TYPE_BUTTON;
return EVDEV_KEY_TYPE_NONE; return EVDEV_KEY_TYPE_NONE;
} }
@ -1731,17 +1735,17 @@ evdev_read_model_flags(struct evdev_device *device)
{ "LIBINPUT_MODEL_APPLE_INTERNAL_KEYBOARD", EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD }, { "LIBINPUT_MODEL_APPLE_INTERNAL_KEYBOARD", EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD },
{ "LIBINPUT_MODEL_CYBORG_RAT", EVDEV_MODEL_CYBORG_RAT }, { "LIBINPUT_MODEL_CYBORG_RAT", EVDEV_MODEL_CYBORG_RAT },
{ "LIBINPUT_MODEL_CYAPA", EVDEV_MODEL_CYAPA }, { "LIBINPUT_MODEL_CYAPA", EVDEV_MODEL_CYAPA },
{ "LIBINPUT_MODEL_ALPS_RUSHMORE", EVDEV_MODEL_ALPS_RUSHMORE },
{ "LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD", EVDEV_MODEL_LENOVO_T450_TOUCHPAD }, { "LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD", EVDEV_MODEL_LENOVO_T450_TOUCHPAD },
{ "LIBINPUT_MODEL_WOBBLY_TOUCHPAD", EVDEV_MODEL_WOBBLY_TOUCHPAD },
{ NULL, EVDEV_MODEL_DEFAULT }, { NULL, EVDEV_MODEL_DEFAULT },
}; };
const struct model_map *m = model_map; const struct model_map *m = model_map;
uint32_t model_flags = 0; uint32_t model_flags = 0;
const char *val;
while (m->property) { while (m->property) {
if (!!udev_device_get_property_value(device->udev_device, val = udev_device_get_property_value(device->udev_device,
m->property)) { m->property);
if (val && !streq(val, "0")) {
log_debug(device->base.seat->libinput, log_debug(device->base.seat->libinput,
"%s: tagged as %s\n", "%s: tagged as %s\n",
evdev_device_get_sysname(device), evdev_device_get_sysname(device),

View file

@ -113,9 +113,7 @@ enum evdev_device_model {
EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD = (1 << 13), EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD = (1 << 13),
EVDEV_MODEL_CYBORG_RAT = (1 << 14), EVDEV_MODEL_CYBORG_RAT = (1 << 14),
EVDEV_MODEL_CYAPA = (1 << 15), EVDEV_MODEL_CYAPA = (1 << 15),
EVDEV_MODEL_ALPS_RUSHMORE = (1 << 16),
EVDEV_MODEL_LENOVO_T450_TOUCHPAD= (1 << 17), EVDEV_MODEL_LENOVO_T450_TOUCHPAD= (1 << 17),
EVDEV_MODEL_WOBBLY_TOUCHPAD = (1 << 18),
}; };
struct mt_slot { struct mt_slot {

View file

@ -1889,10 +1889,13 @@ libinput_event_tablet_tool_get_y_transformed(struct libinput_event_tablet_tool *
* *
* Returns the tool that was in use during this event. * Returns the tool that was in use during this event.
* *
* If the caller holds at least one reference (see * The returned tablet tool is not refcounted and may become invalid after
* libinput_tablet_tool_ref()), this struct is used whenever the * the next call to libinput. Use libinput_tablet_tool_ref() and
* tools enters proximity. Otherwise, if no references remain when the tool * libinput_tablet_tool_unref() to continue using the handle outside of the
* leaves proximity, the tool may be destroyed. * immediate scope.
*
* If the caller holds at least one reference, this struct is used
* whenever the tools enters proximity again.
* *
* @note Physical tool tracking requires hardware support. If unavailable, * @note Physical tool tracking requires hardware support. If unavailable,
* libinput creates one tool per type per tablet. See @ref * libinput creates one tool per type per tablet. See @ref
@ -1999,7 +2002,7 @@ libinput_event_tablet_tool_get_time_usec(struct libinput_event_tablet_tool *even
/** /**
* @ingroup event_tablet * @ingroup event_tablet
* *
* Return the type of tool type for a tool object, see @ref * Return the tool type for a tool object, see @ref
* tablet-tool-types for details. * tablet-tool-types for details.
* *
* @param tool The libinput tool * @param tool The libinput tool
@ -2047,7 +2050,8 @@ libinput_tablet_tool_ref(struct libinput_tablet_tool *tool);
* @ingroup event_tablet * @ingroup event_tablet
* *
* Decrement the reference count of the tool by one. When the reference * Decrement the reference count of the tool by one. When the reference
* count of tool reaches 0, the memory allocated for tool will be freed. * count of the tool reaches 0, the memory allocated for the tool will be
* freed.
* *
* @param tool The tool to decrement the ref count of * @param tool The tool to decrement the ref count of
* @return NULL if the tool was destroyed otherwise the passed tool * @return NULL if the tool was destroyed otherwise the passed tool
@ -3065,6 +3069,11 @@ libinput_device_get_output_name(struct libinput_device *device);
* seat name pair at any given time, but if no external reference is kept, it * seat name pair at any given time, but if no external reference is kept, it
* may be destroyed if no device belonging to it is left. * may be destroyed if no device belonging to it is left.
* *
* The returned seat is not refcounted and may become invalid after
* the next call to libinput. Use libinput_seat_ref() and
* libinput_seat_unref() to continue using the handle outside of the
* immediate scope.
*
* @param device A previously obtained device * @param device A previously obtained device
* @return The seat this input device belongs to * @return The seat this input device belongs to
*/ */

View file

@ -342,6 +342,42 @@ START_TEST(keyboard_time_usec)
} }
END_TEST END_TEST
START_TEST(keyboard_no_buttons)
{
struct litest_device *dev = litest_current_device();
struct libinput *li = dev->libinput;
struct libinput_event *event;
int code;
const char *name;
litest_drain_events(dev->libinput);
for (code = 0; code < KEY_MAX; code++) {
if (!libevdev_has_event_code(dev->evdev, EV_KEY, code))
continue;
name = libevdev_event_code_get_name(EV_KEY, code);
if (!name || !strneq(name, "KEY_", 4))
continue;
litest_keyboard_key(dev, code, true);
litest_keyboard_key(dev, code, false);
libinput_dispatch(li);
event = libinput_get_event(li);
litest_is_keyboard_event(event,
code,
LIBINPUT_KEY_STATE_PRESSED);
libinput_event_destroy(event);
event = libinput_get_event(li);
litest_is_keyboard_event(event,
code,
LIBINPUT_KEY_STATE_RELEASED);
libinput_event_destroy(event);
}
}
END_TEST
void void
litest_setup_tests(void) litest_setup_tests(void)
{ {
@ -351,4 +387,6 @@ litest_setup_tests(void)
litest_add("keyboard:keys", keyboard_has_key, LITEST_KEYS, LITEST_ANY); litest_add("keyboard:keys", keyboard_has_key, LITEST_KEYS, LITEST_ANY);
litest_add("keyboard:keys", keyboard_keys_bad_device, LITEST_ANY, LITEST_ANY); litest_add("keyboard:keys", keyboard_keys_bad_device, LITEST_ANY, LITEST_ANY);
litest_add("keyboard:time", keyboard_time_usec, LITEST_KEYS, LITEST_ANY); litest_add("keyboard:time", keyboard_time_usec, LITEST_KEYS, LITEST_ANY);
litest_add("keyboard:events", keyboard_no_buttons, LITEST_KEYS, LITEST_ANY);
} }

View file

@ -1499,28 +1499,6 @@ litest_touch_move_extended(struct litest_device *d,
litest_slot_move(d, slot, x, y, axes, true); litest_slot_move(d, slot, x, y, axes, true);
} }
void
litest_touch_move_to_extended(struct litest_device *d,
unsigned int slot,
double x_from, double y_from,
double x_to, double y_to,
struct axis_replacement *axes,
int steps, int sleep_ms)
{
for (int i = 0; i < steps - 1; i++) {
litest_touch_move_extended(d, slot,
x_from + (x_to - x_from)/steps * i,
y_from + (y_to - y_from)/steps * i,
axes);
if (sleep_ms) {
libinput_dispatch(d->libinput);
msleep(sleep_ms);
libinput_dispatch(d->libinput);
}
}
litest_touch_move_extended(d, slot, x_to, y_to, axes);
}
void void
litest_touch_move_to(struct litest_device *d, litest_touch_move_to(struct litest_device *d,
unsigned int slot, unsigned int slot,
@ -1528,11 +1506,17 @@ litest_touch_move_to(struct litest_device *d,
double x_to, double y_to, double x_to, double y_to,
int steps, int sleep_ms) int steps, int sleep_ms)
{ {
litest_touch_move_to_extended(d, slot, for (int i = 0; i < steps - 1; i++) {
x_from, y_from, litest_touch_move(d, slot,
x_to, y_to, x_from + (x_to - x_from)/steps * i,
NULL, y_from + (y_to - y_from)/steps * i);
steps, sleep_ms); if (sleep_ms) {
libinput_dispatch(d->libinput);
msleep(sleep_ms);
libinput_dispatch(d->libinput);
}
}
litest_touch_move(d, slot, x_to, y_to);
} }
static int static int
@ -2248,8 +2232,12 @@ litest_create_uinput(const char *name,
abs = abs_info; abs = abs_info;
while (abs && abs->value != -1) { while (abs && abs->value != -1) {
rc = libevdev_enable_event_code(dev, EV_ABS, struct input_absinfo a = *abs;
abs->value, abs);
/* abs_info->value is used for the code and may be outside
of [min, max] */
a.value = abs->minimum;
rc = libevdev_enable_event_code(dev, EV_ABS, abs->value, &a);
litest_assert_int_eq(rc, 0); litest_assert_int_eq(rc, 0);
abs++; abs++;
} }

View file

@ -409,13 +409,6 @@ litest_touch_move_to(struct litest_device *d,
double x_from, double y_from, double x_from, double y_from,
double x_to, double y_to, double x_to, double y_to,
int steps, int sleep_ms); int steps, int sleep_ms);
void
litest_touch_move_to_extended(struct litest_device *d,
unsigned int slot,
double x_from, double y_from,
double x_to, double y_to,
struct axis_replacement *axes,
int steps, int sleep_ms);
void void
litest_touch_move_two_touches(struct litest_device *d, litest_touch_move_two_touches(struct litest_device *d,

View file

@ -3594,7 +3594,7 @@ START_TEST(touchpad_thumb_edgescroll)
libinput_dispatch(li); libinput_dispatch(li);
litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS); litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
litest_touch_move_to_extended(dev, 0, 99, 55, 99, 70, axes, 10, 0); litest_touch_move_to(dev, 0, 99, 55, 99, 70, 10, 0);
litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS); litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
} }
@ -3924,72 +3924,6 @@ START_TEST(touchpad_tool_tripletap_touch_count)
} }
END_TEST END_TEST
START_TEST(touchpad_t450_motion_drops)
{
struct litest_device *dev = litest_current_device();
struct libinput *li = dev->libinput;
struct libinput_event *event;
struct libinput_event_pointer *ptrev;
int i;
double d;
/* In some areas on the touchpad we only get pressure events.
* https://bugs.freedesktop.org/show_bug.cgi?id=94379
*/
litest_drain_events(li);
litest_touch_down(dev, 0, 50, 50);
for (i = 0; i < 10; i++) {
litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3000 - i);
litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3000 - i);
litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 30);
litest_event(dev, EV_ABS, ABS_X, 3000 - i);
litest_event(dev, EV_ABS, ABS_Y, 3000 - i);
litest_event(dev, EV_ABS, ABS_PRESSURE, 30);
litest_event(dev, EV_SYN, SYN_REPORT, 0);
litest_drain_events(li);
}
/* several pressure-only events */
for (i = 0; i< 20; i++) {
litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 30 + i % 2);
litest_event(dev, EV_ABS, ABS_PRESSURE, 30 + i % 2);
litest_event(dev, EV_SYN, SYN_REPORT, 0);
litest_assert_empty_queue(li);
}
/* a 100 unit jump followed by fine-grained motion, we expect small
* motions without the jump */
for (i = 0; i < 10; i++) {
litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3100 + i);
litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3100 + i);
litest_event(dev, EV_ABS, ABS_X, 3100 + i);
litest_event(dev, EV_ABS, ABS_Y, 3100 + i);
litest_event(dev, EV_ABS, ABS_PRESSURE, 30);
litest_event(dev, EV_SYN, SYN_REPORT, 0);
libinput_dispatch(li);
}
event = libinput_get_event(li);
ck_assert_notnull(event);
while (event) {
ptrev = litest_is_motion_event(event);
d = libinput_event_pointer_get_dx(ptrev);
litest_assert_double_lt(d, 1.0);
d = libinput_event_pointer_get_dy(ptrev);
litest_assert_double_lt(d, 1.0);
libinput_event_destroy(event);
event = libinput_get_event(li);
}
}
END_TEST
START_TEST(touchpad_time_usec) START_TEST(touchpad_time_usec)
{ {
struct litest_device *dev = litest_current_device(); struct litest_device *dev = litest_current_device();
@ -4178,7 +4112,6 @@ litest_setup_tests(void)
litest_add("touchpad:thumb", touchpad_thumb_tap_hold_2ndfg_tap, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH); litest_add("touchpad:thumb", touchpad_thumb_tap_hold_2ndfg_tap, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH);
litest_add_for_device("touchpad:bugs", touchpad_tool_tripletap_touch_count, LITEST_SYNAPTICS_TOPBUTTONPAD); litest_add_for_device("touchpad:bugs", touchpad_tool_tripletap_touch_count, LITEST_SYNAPTICS_TOPBUTTONPAD);
litest_add_for_device("touchpad:bugs", touchpad_t450_motion_drops, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
litest_add("touchpad:time", touchpad_time_usec, LITEST_TOUCHPAD, LITEST_ANY); litest_add("touchpad:time", touchpad_time_usec, LITEST_TOUCHPAD, LITEST_ANY);

View file

@ -204,7 +204,7 @@ accel_profiles(struct libinput_device *device)
profile = libinput_device_config_accel_get_default_profile(device); profile = libinput_device_config_accel_get_default_profile(device);
xasprintf(&str, xasprintf(&str,
"%s%s%s%s", "%s%s %s%s",
(profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "*" : "", (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "*" : "",
(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "flat" : "", (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "flat" : "",
(profile == LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "*" : "", (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "*" : "",
@ -268,10 +268,13 @@ print_device_notify(struct libinput_event *ev)
printf("pointer "); printf("pointer ");
if (libinput_device_has_capability(dev, if (libinput_device_has_capability(dev,
LIBINPUT_DEVICE_CAP_TOUCH)) LIBINPUT_DEVICE_CAP_TOUCH))
printf("touch"); printf("touch ");
if (libinput_device_has_capability(dev, if (libinput_device_has_capability(dev,
LIBINPUT_DEVICE_CAP_TABLET_TOOL)) LIBINPUT_DEVICE_CAP_TABLET_TOOL))
printf("tablet"); printf("tablet ");
if (libinput_device_has_capability(dev,
LIBINPUT_DEVICE_CAP_TABLET_PAD))
printf("tablet-pad");
printf("\n"); printf("\n");
printf("Tap-to-click: %s\n", tap_default(dev)); printf("Tap-to-click: %s\n", tap_default(dev));

View file

@ -26,10 +26,6 @@ libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:fwversion:800
libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:800 libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:800
LIBINPUT_ATTR_SIZE_HINT=100x55 LIBINPUT_ATTR_SIZE_HINT=100x55
libinput:name:*AlpsPS/2 ALPS DualPoint TouchPad:fwversion:310
libinput:name:*AlpsPS/2 ALPS GlidePoint:fwversion:310
LIBINPUT_MODEL_ALPS_RUSHMORE=1
########################################## ##########################################
# Apple # Apple
########################################## ##########################################
@ -80,14 +76,6 @@ libinput:name:Atmel maXTouch Touchpad:dmi:*svn*GOOGLE*:pn*Samus*
libinput:name:Cypress APA Trackpad ?cyapa?:dmi:* libinput:name:Cypress APA Trackpad ?cyapa?:dmi:*
LIBINPUT_MODEL_CYAPA=1 LIBINPUT_MODEL_CYAPA=1
##########################################
# HP
##########################################
# HP 14-ac157tu
libinput:name:*ETPS/2 Elantech Touchpad*:dmi:*svnHP*pvrCNB1:*
LIBINPUT_MODEL_WOBBLY_TOUCHPAD=1
########################################## ##########################################
# LENOVO # LENOVO
########################################## ##########################################