Compare commits

...

16 commits
main ... 1.17.2

Author SHA1 Message Date
Peter Hutterer
f42b8dd1ae libinput 1.17.2
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-04-30 13:52:07 +10:00
Udo Rader
4813e63f79 quirks: add quirk for Lenovo Yoga Slim 9 Touchpad
This touchpad is a pressure pad and needs the pressure
handling disabled.

Fixes #604

Signed-off-by: Udo Rader <udo.rader@bestsolution.at>
(cherry picked from commit 144f5ed93d)
2021-04-29 10:59:06 +10:00
Peter Hutterer
26c65758e9 quirks: add palm size quirk for the Gigabyte Aero 15
Fixes #599

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 10124797b5)
2021-04-29 10:59:04 +10:00
Chris Dickson
a3103ded82 quirks: mark the 0x252 razer keyboard as internal
Signed-off-by: Chris Dickson <hobochili@pm.me>
(cherry picked from commit 9ce8d561c1)
2021-04-29 10:58:50 +10:00
Peter Hutterer
b8d79df696 evdev: don't truncate event time to 32 bits
This causes a bunch of "your system is too slow" messages in e.g. the various
gesture tests.

Fixes 95a72990
Fixes #601

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 04dc67e092)
2021-04-29 10:58:44 +10:00
Peter Hutterer
eea702e30a evdev: don't check the event time if it's higher than the dispatch time
The dispatch time is taken during libinput_dispatch(), i.e. at the beginning
of an event sequence. We always read all events off the device, so where
events come in while we're inside the main dispatch loop, our event time may
be later than the saved dispatch_time. This causes an uint underflow and our
tdelta > 10 will be true for that case.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 95a72990ad)
2021-04-29 10:58:43 +10:00
Jonas Ådahl
0cfe00f493 tablet-pad-leds: Open led file with O_NONBLOCK | O_CLOEXEC
We don't want the file to be left open after any fork/exec, and we don't
want the read to be blocking; so open it as such.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit f723b28220)
2021-04-29 10:58:24 +10:00
Ben Weston
0d3d885a1a quirk: fix sensitivity for Dell Latitude 7490 pointing-stick
Signed-off-by: Ben Weston <b.weston60@gmail.com>
(cherry picked from commit 74f6821d7a)
2021-04-29 10:58:13 +10:00
Peter Hutterer
6df5169229 libinput 1.17.1
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-03-24 14:46:08 +10:00
Greg V
4f2f1d29ec quirks: add wildcard to HID-over-I2C names (for FreeBSD)
The FreeBSD HID stack adds the device type to the evdev name,
so we get e.g. "ACPI0C50:00 18D1:5028 TouchPad".

(Maybe this shouldn't be matched by name at all though...)

Signed-off-by: Greg V <greg@unrelenting.technology>
(cherry picked from commit 06697b5e85)
2021-03-24 14:45:24 +10:00
Greg V
4c1862c1e4 quirks: implement DMI support on FreeBSD
FreeBSD does not use Linux modaliases, so we have to generate these strings.
Unfortunately for us, the data in kenv has the chassis type pre-parsed into
a nice string, so we have to match these strings back into numbers.
Only relevant types are included to avoid bloating the code.

Signed-off-by: Greg V <greg@unrelenting.technology>
(cherry picked from commit 6941f74070)
2021-03-24 14:45:18 +10:00
Greg V
a49826a7a8 quirks: add quirks for Apple SPI input devices
The Linux applespi driver currently uses the Synaptics vendor ID
on the trackpad for some reason (even though, at least from bcm5974
we only know that Broadcom is involved..) but my upcoming FreeBSD driver
uses the Apple vendor ID everywhere, so add two quirks.

Signed-off-by: Greg V <greg@unrelenting.technology>
(cherry picked from commit d8b1a773e3)
2021-03-24 14:45:17 +10:00
Greg V
f905054b5b quirks: recognize SPI bus
Apple MacBooks (Broadwell/Skylake/Kaby Lake and Apple Silicon)
use SPI to communicate with the keyboard and trackpad.

Signed-off-by: Greg V <greg@unrelenting.technology>
(cherry picked from commit 5f00c32d9e)
2021-03-24 14:45:16 +10:00
Peter Hutterer
b8f90d074e doc/user: explain why we are doing motion normalization
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 2f8dab4537)
2021-03-24 14:44:47 +10:00
Peter Hutterer
7624497df5 completion: add missing libinput analyze subtools to the zsh completions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 40b83b1105)
2021-03-24 14:44:31 +10:00
Pedro Ribeiro
1ca2f11524 Add Lenovo Legion 5 keyboard to 50-system-lenovo.quirks
Signed-off-by: Pedro Ribeiro <pedrib@gmail.com>
(cherry picked from commit 5e69c5f9ae)
2021-03-24 14:44:29 +10:00
13 changed files with 184 additions and 11 deletions

View file

@ -163,12 +163,35 @@ __all_seats()
':device:_files -W /dev/input/ -P /dev/input/' ':device:_files -W /dev/input/ -P /dev/input/'
} }
(( $+functions[_libinput_analyze_per-slot-delta] )) || _libinput_analyze_per-slot-delta()
{
_arguments \
'--help[Show help message and exit]' \
':recording:_files'
}
(( $+functions[_libinput_analyze_touch-down-state] )) || _libinput_analyze_touch-down-state()
{
_arguments \
'--help[Show help message and exit]' \
':recording:_files'
}
(( $+functions[_libinput_analyze_recording] )) || _libinput_analyze_recording()
{
_arguments \
'--help[Show help message and exit]' \
':recording:_files'
}
(( $+functions[_libinput_analyze] )) || _libinput_analyze() (( $+functions[_libinput_analyze] )) || _libinput_analyze()
{ {
local curcontext=$curcontext state line ret=1 local curcontext=$curcontext state line ret=1
local features local features
features=( features=(
"per-slot-delta:analyze relative movement per touch per slot" "per-slot-delta:analyze relative movement per touch per slot"
"recording:analyze a recording by printing a pretty table"
"touch-down-state:analyze a recording for logical touch down states"
) )
_arguments -C \ _arguments -C \

View file

@ -27,6 +27,11 @@ libinput applies a dpi-dependent acceleration function. At low speeds, a
movement speed increases, acceleration is applied - at high speeds a low-dpi movement speed increases, acceleration is applied - at high speeds a low-dpi
device will roughly feel the same as a higher-dpi mouse. device will roughly feel the same as a higher-dpi mouse.
The reason for the normalization is convenience: a caller can assume that a
delta of 1 should result in a movement of 1 pixel on a traditional
(low-dpi) screen. On screens with high resolutions, the caller must scale
according to the UI scale factors.
This normalization only applies to accelerated coordinates, unaccelerated This normalization only applies to accelerated coordinates, unaccelerated
coordinates are left in device-units. It is up to the caller to interpret coordinates are left in device-units. It is up to the caller to interpret
those coordinates correctly. those coordinates correctly.

View file

@ -1,5 +1,5 @@
project('libinput', 'c', project('libinput', 'c',
version : '1.17.0', version : '1.17.2',
license : 'MIT/Expat', license : 'MIT/Expat',
default_options : [ 'c_std=gnu99', 'warning_level=2' ], default_options : [ 'c_std=gnu99', 'warning_level=2' ],
meson_version : '>= 0.47.0') meson_version : '>= 0.47.0')

View file

@ -14,6 +14,13 @@ MatchVendor=0x1532
MatchProduct=0x0233 MatchProduct=0x0233
AttrKeyboardIntegration=internal AttrKeyboardIntegration=internal
[Razer Blade Stealth Keyboard]
MatchUdevType=keyboard
MatchBus=usb
MatchVendor=0x1532
MatchProduct=0x0252
AttrKeyboardIntegration=internal
[Razer Blade Lid Switch] [Razer Blade Lid Switch]
MatchName=*Lid Switch* MatchName=*Lid Switch*
MatchDMIModalias=dmi:*svnRazer:pnBlade* MatchDMIModalias=dmi:*svnRazer:pnBlade*

View file

@ -27,6 +27,12 @@ AttrTouchSizeRange=150:130
MatchName=*Apple Inc. Apple Internal Keyboard* MatchName=*Apple Inc. Apple Internal Keyboard*
AttrKeyboardIntegration=internal AttrKeyboardIntegration=internal
[Apple Internal Keyboard (SPI)]
MatchUdevType=keyboard
MatchBus=spi
MatchVendor=0x5AC
AttrKeyboardIntegration=internal
# The Apple MagicMouse has a touchpad built-in but the kernel still # The Apple MagicMouse has a touchpad built-in but the kernel still
# emulates a full 2/3 button mouse for us. Ignore anything from the # emulates a full 2/3 button mouse for us. Ignore anything from the
# ABS interface # ABS interface
@ -89,3 +95,22 @@ MatchBus=usb
MatchVendor=0x5AC MatchVendor=0x5AC
MatchProduct=0x0262 MatchProduct=0x0262
AttrPalmSizeThreshold=1600 AttrPalmSizeThreshold=1600
[Apple Laptop Touchpad (SPI)]
MatchUdevType=touchpad
MatchBus=spi
MatchVendor=0x5AC
ModelAppleTouchpad=1
AttrSizeHint=104x75
AttrTouchSizeRange=150:130
AttrPalmSizeThreshold=1600
# The Linux applespi driver currently uses the Synaptics vendor for some reason
[Apple Laptop Touchpad (SPI)]
MatchUdevType=touchpad
MatchBus=spi
MatchVendor=0x6CB
ModelAppleTouchpad=1
AttrSizeHint=104x75
AttrTouchSizeRange=150:130
AttrPalmSizeThreshold=1600

View file

@ -82,6 +82,12 @@ MatchName=*DualPoint Stick
MatchDMIModalias=dmi:*svnDellInc.:pnLatitudeE7470* MatchDMIModalias=dmi:*svnDellInc.:pnLatitudeE7470*
AttrTrackpointMultiplier=0.125 AttrTrackpointMultiplier=0.125
[Latitude 7490 Trackpoint]
MatchName=*Mouse
MatchUdevType=pointingstick
MatchDMIModalias=dmi:**bvnDellInc.:*:pnLatitude7490*
AttrTrackpointMultiplier=0.3
[Precision 7x50 Touchpad] [Precision 7x50 Touchpad]
MatchBus=i2c MatchBus=i2c
MatchUdevType=touchpad MatchUdevType=touchpad

View file

@ -0,0 +1,5 @@
[Gigabyte Aero 15 touchpad]
MatchUdevType=touchpad
MatchName=ETPS/2 Elantech Touchpad
MatchDMIModalias=dmi:*svnGIGABYTE:pnAERO15-XA*
AttrPalmSizeThreshold=800

View file

@ -89,7 +89,7 @@ ModelChromebook=1
[Google Chromebook Eve] [Google Chromebook Eve]
MatchUdevType=touchpad MatchUdevType=touchpad
MatchName=ACPI0C50:00 18D1:5028 MatchName=ACPI0C50:00 18D1:5028*
MatchDMIModalias=dmi:*svnGoogle:pnEve* MatchDMIModalias=dmi:*svnGoogle:pnEve*
ModelChromebook=1 ModelChromebook=1
AttrPressureRange=6:4 AttrPressureRange=6:4

View file

@ -22,7 +22,7 @@ ModelHPPavilionDM4Touchpad=1
# Touchpad is a clickpad but INPUT_PROP_BUTTONPAD is not set, see # Touchpad is a clickpad but INPUT_PROP_BUTTONPAD is not set, see
# https://bugs.freedesktop.org/show_bug.cgi?id=97147 # https://bugs.freedesktop.org/show_bug.cgi?id=97147
[HP Stream 11] [HP Stream 11]
MatchName=SYN1EDE:00 06CB:7442 MatchName=SYN1EDE:00 06CB:7442*
MatchDMIModalias=dmi:*svnHewlett-Packard:pnHPStreamNotebookPC11* MatchDMIModalias=dmi:*svnHewlett-Packard:pnHPStreamNotebookPC11*
AttrInputPropEnable=INPUT_PROP_BUTTONPAD AttrInputPropEnable=INPUT_PROP_BUTTONPAD

View file

@ -205,3 +205,28 @@ ModelTabletModeNoSuspend=1
MatchName=AT Raw Set 2 keyboard MatchName=AT Raw Set 2 keyboard
MatchDMIModalias=dmi:*svnLENOVO:*pvrThinkPadX1Tablet:* MatchDMIModalias=dmi:*svnLENOVO:*pvrThinkPadX1Tablet:*
ModelTabletModeNoSuspend=1 ModelTabletModeNoSuspend=1
# Misidentified as an external keyboard by libinput
# Tested on Legion 5 15AR05H
[Lenovo Legion 5 Keyboard]
MatchUdevType=keyboard
MatchBus=usb
MatchVendor=0x048D
MatchProduct=0xC100
AttrKeyboardIntegration=internal
[Lenovo Legion 5 Keyboard]
MatchUdevType=keyboard
MatchBus=usb
MatchVendor=0x048D
MatchProduct=0xC955
AttrKeyboardIntegration=internal
# https://gitlab.freedesktop.org/libinput/libinput/-/issues/604
[Lenovo Yoga Slim 9 14ITL5 Pressurepad]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x01E8
AttrEventCodeDisable=ABS_MT_PRESSURE;ABS_PRESSURE;

View file

@ -132,7 +132,7 @@ pad_led_new(struct libinput *libinput, const char *prefix, int group, int mode)
if (rc == -1) if (rc == -1)
goto error; goto error;
fd = open_restricted(libinput, path, O_RDONLY); fd = open_restricted(libinput, path, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
if (fd < 0) { if (fd < 0) {
errno = -fd; errno = -fd;
goto error; goto error;

View file

@ -1024,6 +1024,7 @@ evdev_note_time_delay(struct evdev_device *device,
{ {
struct libinput *libinput = evdev_libinput_context(device); struct libinput *libinput = evdev_libinput_context(device);
uint32_t tdelta; uint32_t tdelta;
uint64_t eventtime = input_event_time(ev);
/* if we have a current libinput_dispatch() snapshot, compare our /* if we have a current libinput_dispatch() snapshot, compare our
* event time with the one from the snapshot. If we have more than * event time with the one from the snapshot. If we have more than
@ -1031,10 +1032,11 @@ evdev_note_time_delay(struct evdev_device *device,
* where there is no steady event flow and thus SYN_DROPPED may not * where there is no steady event flow and thus SYN_DROPPED may not
* get hit by the kernel despite us being too slow. * get hit by the kernel despite us being too slow.
*/ */
if (libinput->dispatch_time == 0) if (libinput->dispatch_time == 0 ||
eventtime > libinput->dispatch_time)
return; return;
tdelta = us2ms(libinput->dispatch_time - input_event_time(ev)); tdelta = us2ms(libinput->dispatch_time - eventtime);
if (tdelta > 10) { if (tdelta > 10) {
evdev_log_bug_client_ratelimit(device, evdev_log_bug_client_ratelimit(device,
&device->delay_warning_limit, &device->delay_warning_limit,

View file

@ -35,6 +35,9 @@
#include <dirent.h> #include <dirent.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <libgen.h> #include <libgen.h>
#ifdef __FreeBSD__
#include <kenv.h>
#endif
#include "libinput-versionsort.h" #include "libinput-versionsort.h"
#include "libinput-util.h" #include "libinput-util.h"
@ -111,6 +114,7 @@ enum bustype {
BT_PS2, BT_PS2,
BT_RMI, BT_RMI,
BT_I2C, BT_I2C,
BT_SPI,
}; };
enum udev_type { enum udev_type {
@ -352,10 +356,11 @@ property_cleanup(struct property *p)
} }
/** /**
* Return the dmi modalias from the udev device. * Return the system DMI info in modalias format.
*/ */
#ifdef __linux__
static inline char * static inline char *
init_dmi(void) init_dmi_linux(void)
{ {
struct udev *udev; struct udev *udev;
struct udev_device *udev_device; struct udev_device *udev_device;
@ -363,9 +368,6 @@ init_dmi(void)
char *copy = NULL; char *copy = NULL;
const char *syspath = "/sys/devices/virtual/dmi/id"; const char *syspath = "/sys/devices/virtual/dmi/id";
if (getenv("LIBINPUT_RUNNING_TEST_SUITE"))
return safe_strdup("dmi:");
udev = udev_new(); udev = udev_new();
if (!udev) if (!udev)
return NULL; return NULL;
@ -388,6 +390,73 @@ init_dmi(void)
return copy; return copy;
} }
#endif
#ifdef __FreeBSD__
static inline char *
init_dmi_freebsd(void)
{
#define LEN (KENV_MVALLEN + 1)
char *modalias;
char bios_vendor[LEN], bios_version[LEN], bios_date[LEN];
char sys_vendor[LEN], product_name[LEN], product_version[LEN];
char board_vendor[LEN], board_name[LEN], board_version[LEN];
char chassis_vendor[LEN], chassis_type[LEN], chassis_version[LEN];
int chassis_type_num = 0x2;
kenv(KENV_GET, "smbios.bios.vendor", bios_vendor, LEN);
kenv(KENV_GET, "smbios.bios.version", bios_version, LEN);
kenv(KENV_GET, "smbios.bios.reldate", bios_date, LEN);
kenv(KENV_GET, "smbios.system.maker", sys_vendor, LEN);
kenv(KENV_GET, "smbios.system.product", product_name, LEN);
kenv(KENV_GET, "smbios.system.version", product_version, LEN);
kenv(KENV_GET, "smbios.planar.maker", board_vendor, LEN);
kenv(KENV_GET, "smbios.planar.product", board_name, LEN);
kenv(KENV_GET, "smbios.planar.version", board_version, LEN);
kenv(KENV_GET, "smbios.chassis.vendor", chassis_vendor, LEN);
kenv(KENV_GET, "smbios.chassis.type", chassis_type, LEN);
kenv(KENV_GET, "smbios.chassis.version", chassis_version, LEN);
#undef LEN
if (strcmp(chassis_type, "Desktop") == 0)
chassis_type_num = 0x3;
else if (strcmp(chassis_type, "Portable") == 0)
chassis_type_num = 0x8;
else if (strcmp(chassis_type, "Laptop") == 0)
chassis_type_num = 0x9;
else if (strcmp(chassis_type, "Notebook") == 0)
chassis_type_num = 0xA;
else if (strcmp(chassis_type, "Tablet") == 0)
chassis_type_num = 0x1E;
else if (strcmp(chassis_type, "Convertible") == 0)
chassis_type_num = 0x1F;
else if (strcmp(chassis_type, "Detachable") == 0)
chassis_type_num = 0x20;
xasprintf(&modalias,
"dmi:bvn%s:bvr%s:bd%s:svn%s:pn%s:pvr%s:rvn%s:rn%s:rvr%s:cvn%s:ct%d:cvr%s:",
bios_vendor, bios_version, bios_date, sys_vendor, product_name,
product_version, board_vendor, board_name, board_version, chassis_vendor,
chassis_type_num, chassis_version);
return modalias;
}
#endif
static inline char *
init_dmi(void)
{
if (getenv("LIBINPUT_RUNNING_TEST_SUITE"))
return safe_strdup("dmi:");
#if defined(__linux__)
return init_dmi_linux();
#elif defined(__FreeBSD__)
return init_dmi_freebsd();
#else
return NULL;
#endif
}
/** /**
* Return the dt compatible string * Return the dt compatible string
@ -499,6 +568,8 @@ parse_match(struct quirks_context *ctx,
s->match.bus = BT_RMI; s->match.bus = BT_RMI;
else if (streq(value, "i2c")) else if (streq(value, "i2c"))
s->match.bus = BT_I2C; s->match.bus = BT_I2C;
else if (streq(value, "spi"))
s->match.bus = BT_SPI;
else else
goto out; goto out;
} else if (streq(key, "MatchVendor")) { } else if (streq(key, "MatchVendor")) {
@ -1241,6 +1312,10 @@ match_fill_bus_vid_pid(struct match *m,
m->bus = BT_I2C; m->bus = BT_I2C;
m->bits |= M_BUS; m->bits |= M_BUS;
break; break;
case BUS_SPI:
m->bus = BT_SPI;
m->bits |= M_BUS;
break;
default: default:
break; break;
} }