Compare commits

...

27 commits
1.31.0 ... main

Author SHA1 Message Date
Peter Hutterer
ef9624a16b evdev: store the SYN_REPORT value in the frame
If the SYN_REPORT has a value of nonzero we need to keep that value in
the frame - our upper layers rely on this to detect repeat frames.

Closes #1261

Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1449>
2026-03-19 00:09:30 +00:00
GKraats
dcbfbc4cf1 util: fix usec computation on 32 bits
Enforce the needed 64-bit computing on 32 bits.

Signed-off-by: GKraats <vd.kraats@hccnet.nl>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1446>
2026-03-18 00:25:48 +00:00
Peter Hutterer
ad857a51a4 tools/record: fix delta times not being relative
Missing last_time assignment caused the delta time between events to be
the total time.

Fixes: a202ed6115 ("Use a newtype usec_t for timestamps for better type-safety")
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1448>
2026-03-17 05:05:14 +00:00
Peter Hutterer
a521d054d4 tools: fix leak of evdev_prev in libinput-record
Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:46 +00:00
Peter Hutterer
f86d5ab2ab test: add missing button state assertion for eraser button release
The second 'Expect button event' block in
tablet_eraser_button_different_buttons is missing the button state
assertion that the first block has. This event should be a
BUTTON_STATE_RELEASED (the eraser left proximity), but without the
check the test passes even if the state is wrong.

Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:46 +00:00
Peter Hutterer
32fd9ec95f tools: Remove dead eraser_button_button initialization to BTN_STYLUS
Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:46 +00:00
Peter Hutterer
45150cc6ec tools: fix missing fd assignment in libinput-debug-tablet
The fd opened for the evdev device is never stored in ctx->fds[1].fd
so we never poll for it. Real impact was limited since we do poll for
the libinput fd and we process libevdev events whenever any of the fds
triggers.

Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:46 +00:00
Peter Hutterer
c8c1c07a2a tools: fix swapped fread arguments causing DMI modalias to always be "unknown"
fread(buf, sizeof(buf), 1, dmi) reads one block of 2048 bytes,
returning the number of complete blocks (0 or 1). Since DMI modalias
files are always shorter than 2048 bytes, fread returns 0 even when
data was successfully read into buf. The 'if (n > 0)' check then
always fails and the DMI string stays as "unknown".

Swap the size and nmemb arguments so fread returns the number of
bytes read instead.

Fixes: 0ecd08c134 ("tools: use __attribute__(cleanup)")

Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:46 +00:00
Peter Hutterer
b1f478b897 tools: fix pencil tablet tool type in libinput-record
Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:45 +00:00
Peter Hutterer
333d7131ab tools: fix swapped strstartswith arguments in find_device()
Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:45 +00:00
Peter Hutterer
cd9d6c66fd tablet: fix eraser button get_default_mode/get_default_button return values
Co-Authored-by: Claude Code <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1444>
2026-03-17 00:46:45 +00:00
Peter Hutterer
a0dc0997f5 meson.build: explicitly convert a boolean to string
Fixes:
  DEPRECATION: Variable substitution with boolean value 'MESON_ENABLED_DEBUG_GUI' is deprecated.

Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1445>
2026-03-13 12:15:21 +10:00
Peter Hutterer
c6813dc7d8 tools: add --compress-motion-events to the man page and zsh completion
Fixes: dc249b0ffe ("tools/debug-events: add ability to compress motion events")
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1443>
2026-03-11 14:22:40 +10:00
Ilya Kamenko
8dd25ece10 Fold hold-to-scroll into existing scroll button lock mode
Instead of adding a new ENABLED_HOLD enum value, modify the existing
ENABLED lock mode so that hold+scroll+release doesn't engage the lock.

Add a 500ms grace period: if the button was held and used to scroll for
longer than 500ms, releasing the button does not engage the lock
(temporary scroll). If released within 500ms (e.g. shaky hands
triggering accidental motion), the lock still engages as before.

This fixes the unintuitive behavior where the lock engages even after
actively scrolling, without requiring new API surface.

Closes: https://gitlab.freedesktop.org/libinput/libinput/-/issues/1259

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1435>
2026-03-10 23:12:25 +00:00
Mingcong Bai
43547b461b quirks: add Goodix pressure pad quirk for 27C6:01E7
This touchpad is found on the newly released Lenovo ThinkBook G8+ IPH.

Signed-off-by: Mingcong Bai <jeffbai@aosc.io>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1442>
2026-03-10 11:37:34 +08:00
David Santamaría Rogado
2ddc734114 test: set ID_INTEGRATION into test devices
Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1429>
2026-03-10 02:27:36 +00:00
David Santamaría Rogado
819e943ab0 evdev: use udev's ID_INTEGRATION
Now we have in udev the ID_INTEGRATION propery that tells us if a device
is internal or external, use it while still allow hwdb and quirks to
override it.

In the future is possible that we could remove quirks for keyboards
integration and hwdb for touchpads and joysticks integration.

Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1429>
2026-03-10 02:27:36 +00:00
David Santamaría Rogado
1c82aa1659 quirks: add some more goodix haptic touchpads
Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1440>
2026-03-09 09:48:05 +01:00
David Santamaría Rogado
526130fe8d quirks: hp omnibook ultra flip 14 touch pressure
Add pressure attributes to make libinput measure touchpad-pressure
behave right.

Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1430>
2026-03-09 01:34:07 +00:00
David Santamaría Rogado
b95840d36e quirks: hp omnibook ultra flip 14 improve rule set
Some initial units had 14t-fh000 instead 14-fh0xxx in their product name
but they are exactly the same model.

We could match both in product version SBKPF or in board product name
8CDE. Match board as seems the way hp-wmi kernel module uses to match.

While at it rewrite the entire huge comment to a little less huge
comment but with more really interesting info.

Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1430>
2026-03-09 01:34:07 +00:00
Peter Hutterer
7726350420 tablet: allow for the eraser button to be any button
The previous restriction was BTN_STYLUS* or any button the pen
advertises. This is too restrictive - it works well enough for any pen
with less than 3 buttons (BTN_STYLUS3 is always available on those) but
otherwise it cannot work. A 3-button pen may not advertise any other
buttons, leaving us with the eraser button being a duplicate button. And
events cannot be distinquished between eraser button or real button.

Open up the configuration to effectively any BTN_ event code.

Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1436>
2026-03-09 01:14:21 +00:00
Peter Hutterer
cdcb827365 Fix the evdev_usage_is_button check for the BTN_STYLUS group
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1436>
2026-03-09 01:14:21 +00:00
Peter Hutterer
0a3ecbea24 tablet: fix missing linebreak after an error message
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1436>
2026-03-09 01:14:21 +00:00
BBaoVanC
db62bf7ab1 quirks/apple: Add AttrSizeHint to Magic Trackpad USB-C
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1437>
2026-03-04 04:53:28 +00:00
David Santamaría Rogado
9eae99d4fe quirks: microsoft surface keyboard event BTN_0
Apply AttrEventCode=-BTN_0 to all surface keyboards.

Fixes: #1251.

Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1431>
2026-02-22 08:40:11 +00:00
David Santamaría Rogado
a86b8a0008 doc: list-quirks should be quirks list
while at it replace also a code comment in the same line.

Signed-off-by: David Santamaría Rogado <howl.nsp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1432>
2026-02-20 19:56:46 +01:00
Sicelo A. Mhlongo
3428edf1ea doc/user: document keypad slide switch support
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1428>
2026-02-17 12:03:56 +02:00
137 changed files with 950 additions and 147 deletions

View file

@ -45,6 +45,7 @@ __all_seats()
'--verbose[Use verbose output]' \
'--show-keycodes[Make all keycodes visible]' \
'--grab[Exclusively grab all opened devices]' \
'--compress-motion-events[Compress repeated motion events on a TTY]' \
'--device=[Use the given device with the path backend]:device:_files -W /dev/input/ -P /dev/input/' \
'--udev=[Listen for notifications on the given seat]:seat:__all_seats' \
'--apply-to=[Apply configuration options where the device name matches the pattern]:pattern' \

View file

@ -124,6 +124,12 @@ button lock, the button is now considered logically held down. Pressing and
releasing the button a second time logically releases the button. While the
button is logically held down, motion events are converted to scroll events.
If the button is held and used to scroll for longer than a short grace
period, releasing the button does not engage the lock. This allows
hold-to-scroll for short, precise adjustments without accidentally toggling
the lock. A quick click or a brief scroll within the grace period still
engages the lock as normal.
.. _scroll_sources:
------------------------------------------------------------------------------

View file

@ -4,9 +4,9 @@
Switches
==============================================================================
libinput supports the lid and tablet-mode switches. Unlike button events
that come in press and release pairs, switches are usually toggled once and
left at the setting for an extended period of time.
libinput supports the lid, tablet-mode, and keypad slide switches. Unlike
button events that come in press and release pairs, switches are usually
toggled once and left at the setting for an extended period of time.
Only some switches are handled by libinput, see **libinput_switch** for a
list of supported switches. Switch events are exposed to the caller, but
@ -59,3 +59,20 @@ tablet mode is disengaged.
This handling of tablet mode switches is transparent to the user, no
notifications are sent and the device appears as enabled at all times.
.. _switches_keypad_slide:
------------------------------------------------------------------------------
Keypad slide switch handling
------------------------------------------------------------------------------
Where available, libinput listens to devices providing a keypad slide switch.
This is usually available on devices that have an always-attached physical
keyboard which can slide under the screen. An example of such a device is the
Nokia N900.
The event sent by the kernel is ``EV_SW`` ``SW_KEYPAD_SLIDE`` and is provided
as **LIBINPUT_SWITCH_KEYPAD_SLIDE**. The keypad slide switch does not cause any
other input devices to be enabled nor disabled in response, since on some
devices the kernel event is sent while the keyboard is partially visible and
thus usable.

View file

@ -124,7 +124,7 @@ and product name (pn).
Once in place, run the following command to verify the quirk is valid and
works for your device: ::
$ sudo libinput list-quirks /dev/input/event10
$ sudo libinput quirks list /dev/input/event10
AttrPressureRange=10:8
Replace the event node with the one from your device. If the
@ -218,7 +218,7 @@ and product name (pn).
Once in place, run the following command to verify the quirk is valid and
works for your device: ::
$ sudo libinput list-quirks /dev/input/event10
$ sudo libinput quirks list /dev/input/event10
AttrTouchSizeRange=10:8
Replace the event node with the one from your device. If the

View file

@ -131,7 +131,7 @@ Handled device types
- Mice
- Keyboards
- Virtual absolute pointing devices such as those used by QEMU or VirtualBox
- Switches (Lid Switch and Tablet Mode switch)
- Switches (Lid Switch, Tablet Mode switch, and Keypad Slide switch)
- Graphics tablets
- :ref:`Trackpoints`

View file

@ -766,7 +766,7 @@ executable('ptraccel-debug',
if is_debug_build
config_tool_option_test = configuration_data()
config_tool_option_test.set('DISABLE_WARNING', 'yes')
config_tool_option_test.set('MESON_ENABLED_DEBUG_GUI', get_option('debug-gui'))
config_tool_option_test.set('MESON_ENABLED_DEBUG_GUI', get_option('debug-gui').to_string())
config_tool_option_test.set('MESON_BUILD_ROOT', meson.current_build_dir())
config_tool_option_test.set('TOOL_PATH', libinput_tool.full_path())
tool_option_test = configure_file(input: 'tools/test_tool_option_parsing.py',

View file

@ -2,6 +2,15 @@
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# Match vid and pid as it can have other names.
[Goodix Haptic Touchpad (27C6:01E7)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x01E7
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5100:00 27C6:01E8 Touchpad
[Goodix Haptic Touchpad (27C6:01E8)]
MatchBus=i2c
MatchVendor=0x27C6
@ -9,6 +18,33 @@ MatchProduct=0x01E8
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5100:00 27C6:01E9 Touchpad
[Goodix Haptic Touchpad (27C6:01E9)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x01E9
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5100:00 27C6:01EA Touchpad
[Goodix Haptic Touchpad (27C6:01EA)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x01EA
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5100:00 27C6:01EB Touchpad
[Goodix Haptic Touchpad (27C6:01EB)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x01EB
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5420:00 27C6:0F95 Touchpad
[Goodix Haptic Touchpad (27C6:0F95)]

View file

@ -11,15 +11,10 @@ AttrLidSwitchReliability=write_open
# - Surface Laptop 3: Microsoft Surface 045E:09AE Keyboard
# - Surface Book 2: Microsoft Surface Keyboard
[Microsoft Surface Keyboard]
MatchName=*Microsoft Surface *Keyboard*
MatchName=Microsoft Surface *Keyboard
MatchDMIModalias=dmi:*:svnMicrosoftCorporation:*
AttrKeyboardIntegration=internal
[Microsoft Surface Cover]
MatchName=*Microsoft Surface *Cover*
MatchDMIModalias=dmi:*:svnMicrosoftCorporation:*
AttrKeyboardIntegration=internal
AttrEventCode=-BTN_0;
AttrKeyboardIntegration=internal
[Microsoft Surface Laptop Studio Touchpad]
MatchVendor=0x045E

View file

@ -88,6 +88,7 @@ AttrThumbSizeThreshold=700
MatchBus=usb
MatchVendor=0x05AC
MatchProduct=0x0324
AttrSizeHint=162x115
AttrTouchSizeRange=20:10
AttrPressureRange=3:0
AttrPalmSizeThreshold=900

View file

@ -24,28 +24,27 @@ MatchName=*Intel Virtual Button*
MatchDMIModalias=dmi:*:svnHP:pnHPElitex21013G3:*
ModelTabletModeSwitchUnreliable=1
# The HP OmniBook Ultra Flip Laptop 14-fh0xxx's custom Intel ISH firmware
# filters out events from its builtin keyboard and touchpad when the hinge is
# opened little more than 180 degrees but toggles tablet-mode when it's opened
# little less than 180 degrees.
# Do not suspend the keyboard and touchpad to let use the device in flat
# position and also give consistency with some keyboard keys controlled by the
# Video Bus device (brightness down/up), the HP WMI hotkeys device (mic mute and
# hp hubs launcher key) and the backlight getting on and off by the firmware at
# the same time it enables disables the input.
# This one is for the keyboard and...
[HP OmniBook Ultra Flip Laptop 14-fh0xxx Keyboard]
# The HP OmniBook Ultra Flip 14 toggles tablet mode at a little less than 180
# degrees and hardware switches off inputs at a little more than 180 degrees.
# We don't suspend ourselves to allow using them in flat position. It is
# possible that HP fixes this in the future (i.e. so tablet mode toggles
# after 180 degrees) so check before removing these rules.
# This rule is for the keyboard and...
[HP OmniBook Ultra Flip Laptop 14-fh0xxx and 14t-fh000 Keyboard]
MatchBus=ps2
MatchUdevType=keyboard
MatchDMIModalias=dmi:*:svnHP:pnHPOmniBookUltraFlipLaptop14-fh0xxx:*
MatchDMIModalias=dmi:*:svnHP:*:rn8CDE:*
ModelTabletModeNoSuspend=1
# ...this one is for the touchpad.
[HP OmniBook Ultra Flip Laptop 14-fh0xxx Touchpad]
# ...this rule is for the touchpad.
[HP OmniBook Ultra Flip Laptop 14-fh0xxx and 14t-fh000 Touchpad]
MatchBus=i2c
MatchUdevType=touchpad
MatchDMIModalias=dmi:*:svnHP:pnHPOmniBookUltraFlipLaptop14-fh0xxx:*
MatchDMIModalias=dmi:*:svnHP:*:rn8CDE:*
ModelTabletModeNoSuspend=1
AttrPressureRange=15:5
AttrThumbPressureThreshold=80
AttrPalmPressureThreshold=125
[HP Pavilion dm4]
MatchName=*SynPS/2 Synaptics TouchPad

View file

@ -82,10 +82,10 @@ files will not be used.
Debugging
---------
When modifying a data file, use the `libinput list-quirks` tool to
When modifying a data file, use the `libinput quirks list` tool to
verify the changes. The tool can be pointed at the data directory to
analyse, use `--verbose` to get more info. For example:
```
libinput list-quirks --data-dir /path/to/git/repo/quirks/ --verbose /dev/input/event0
libinput quirks list --data-dir /path/to/git/repo/quirks/ --verbose /dev/input/event0
```

View file

@ -332,9 +332,9 @@ evdev_usage_is_button(evdev_usage_t usage)
case EVDEV_BTN_TOOL_FINGER:
case EVDEV_BTN_TOUCH:
return false;
case BTN_STYLUS:
case BTN_STYLUS2:
case BTN_STYLUS3:
case EVDEV_BTN_STYLUS:
case EVDEV_BTN_STYLUS2:
case EVDEV_BTN_STYLUS3:
return true;
case EVDEV_BTN_MISC ... EVDEV_BTN_DIGI - 1:
case EVDEV_BTN_WHEEL ... EVDEV_BTN_GEAR_UP:
@ -550,10 +550,12 @@ evdev_frame_append(struct evdev_frame *frame,
size_t nevents)
{
assert(nevents > 0);
int syn_report_value = 0;
for (size_t i = 0; i < nevents; i++) {
if (evdev_usage_eq(events[i].usage, EVDEV_SYN_REPORT)) {
nevents = i;
syn_report_value = events[i].value;
break;
}
}
@ -568,14 +570,24 @@ evdev_frame_append(struct evdev_frame *frame,
frame->count += nevents;
}
frame->events[frame->count - 1] = (struct evdev_event){
.usage = evdev_usage_from_uint32_t(EVDEV_SYN_REPORT),
.value = syn_report_value,
};
return 0;
}
static inline int
evdev_frame_append_one(struct evdev_frame *frame, evdev_usage_t usage, int32_t value)
{
if (evdev_usage_eq(usage, EVDEV_SYN_REPORT))
if (evdev_usage_eq(usage, EVDEV_SYN_REPORT)) {
frame->events[frame->count - 1] = (struct evdev_event){
.usage = evdev_usage_from_uint32_t(EVDEV_SYN_REPORT),
.value = value,
};
return 0;
}
if (frame->count >= frame->max_size)
return -ENOMEM;

View file

@ -2678,6 +2678,22 @@ evdev_tag_touchpad(struct evdev_device *device, struct udev_device *udev_device)
int bustype, vendor;
const char *prop;
prop = udev_device_get_property_value(udev_device, "ID_INTEGRATION");
if (prop) {
if (streq(prop, "internal")) {
evdev_tag_touchpad_internal(device);
return;
}
if (streq(prop, "external")) {
evdev_tag_touchpad_external(device);
return;
}
evdev_log_info(device, "tagged with unknown value %s\n", prop);
}
/* Fall back to ID_TOUCHPAD_INTEGRATION if ID_INTEGRATION is missing */
prop = udev_device_get_property_value(udev_device,
"ID_INPUT_TOUCHPAD_INTEGRATION");
if (prop) {

View file

@ -1311,18 +1311,6 @@ eraser_button_get_default_mode(struct libinput_tablet_tool *tool)
static enum libinput_config_status
eraser_button_set_button(struct libinput_tablet_tool *tool, uint32_t button)
{
switch (button) {
case BTN_STYLUS:
case BTN_STYLUS2:
case BTN_STYLUS3:
break;
default:
log_bug_libinput(libinput_device_get_context(tool->last_device),
"Unsupported eraser button 0x%x",
button);
return LIBINPUT_CONFIG_STATUS_INVALID;
}
tool->eraser_button.want_button = button;
eraser_button_toggle(tool);

View file

@ -54,6 +54,7 @@
#define DEFAULT_WHEEL_CLICK_ANGLE 15
#define DEFAULT_BUTTON_SCROLL_TIMEOUT usec_from_millis(200)
#define SCROLL_BUTTON_LOCK_GRACE_TIMEOUT usec_from_millis(500)
enum evdev_device_udev_tags {
EVDEV_UDEV_TAG_NONE = 0,
@ -228,6 +229,15 @@ evdev_button_scroll_button(struct evdev_device *device, usec_t time, int is_pres
break; /* handle event */
case BUTTONSCROLL_LOCK_FIRSTDOWN:
assert(!is_press);
if (device->scroll.button_scroll_state == BUTTONSCROLL_SCROLLING &&
usec_cmp(usec_delta(time, device->scroll.button_down_time),
SCROLL_BUTTON_LOCK_GRACE_TIMEOUT) >= 0) {
/* held + scrolled past grace period: temporary scroll,
* no lock engaged */
device->scroll.lock_state = BUTTONSCROLL_LOCK_IDLE;
evdev_log_debug(device, "scroll lock: temp scroll done\n");
break; /* pass release through */
}
device->scroll.lock_state = BUTTONSCROLL_LOCK_FIRSTUP;
evdev_log_debug(device, "scroll lock: first up\n");
return; /* filter release event */
@ -489,6 +499,7 @@ static void
evdev_tag_trackpoint(struct evdev_device *device, struct udev_device *udev_device)
{
char *prop;
const char *udev_prop;
if (!libevdev_has_property(device->evdev, INPUT_PROP_POINTING_STICK) &&
!parse_udev_flag(device, udev_device, "ID_INPUT_POINTINGSTICK"))
@ -496,10 +507,22 @@ evdev_tag_trackpoint(struct evdev_device *device, struct udev_device *udev_devic
device->tags |= EVDEV_TAG_TRACKPOINT;
udev_prop = udev_device_get_property_value(udev_device, "ID_INTEGRATION");
if (udev_prop) {
if (streq(udev_prop, "internal")) {
/* noop, this is the default anyway */
} else if (streq(udev_prop, "external"))
device->tags |= EVDEV_TAG_EXTERNAL_MOUSE;
else
evdev_log_info(device,
"tagged with unknown value %s\n",
udev_prop);
}
_unref_(quirks) *q = libinput_device_get_quirks(&device->base);
if (q && quirks_get_string(q, QUIRK_ATTR_TRACKPOINT_INTEGRATION, &prop)) {
if (streq(prop, "internal")) {
/* noop, this is the default anyway */
device->tags &= ~EVDEV_TAG_EXTERNAL_MOUSE;
} else if (streq(prop, "external")) {
device->tags |= EVDEV_TAG_EXTERNAL_MOUSE;
evdev_log_info(device, "is an external pointing stick\n");
@ -527,6 +550,7 @@ static void
evdev_tag_keyboard(struct evdev_device *device, struct udev_device *udev_device)
{
char *prop;
const char *udev_prop;
int code;
if (!libevdev_has_event_type(device->evdev, EV_KEY))
@ -537,6 +561,18 @@ evdev_tag_keyboard(struct evdev_device *device, struct udev_device *udev_device)
return;
}
udev_prop = udev_device_get_property_value(udev_device, "ID_INTEGRATION");
if (udev_prop) {
if (streq(udev_prop, "internal"))
evdev_tag_keyboard_internal(device);
else if (streq(udev_prop, "external"))
evdev_tag_keyboard_external(device);
else
evdev_log_info(device,
"tagged with unknown value %s\n",
udev_prop);
}
_unref_(quirks) *q = libinput_device_get_quirks(&device->base);
if (q && quirks_get_string(q, QUIRK_ATTR_KEYBOARD_INTEGRATION, &prop)) {
if (streq(prop, "internal")) {

View file

@ -5206,7 +5206,7 @@ libinput_tablet_tool_config_eraser_button_get_default_mode(
if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
return LIBINPUT_CONFIG_ERASER_BUTTON_DEFAULT;
return tool->config.eraser_button.get_mode(tool);
return tool->config.eraser_button.get_default_mode(tool);
}
LIBINPUT_EXPORT enum libinput_config_status
@ -5216,16 +5216,9 @@ libinput_tablet_tool_config_eraser_button_set_button(struct libinput_tablet_tool
if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
switch (button) {
case BTN_STYLUS:
case BTN_STYLUS2:
case BTN_STYLUS3:
break;
default:
if (!libinput_tablet_tool_has_button(tool, button))
return LIBINPUT_CONFIG_STATUS_INVALID;
break;
}
evdev_usage_t usage = evdev_usage_from_code(EV_KEY, button);
if (!evdev_usage_is_button(usage))
return LIBINPUT_CONFIG_STATUS_INVALID;
return tool->config.eraser_button.set_button(tool, button);
}
@ -5246,7 +5239,7 @@ libinput_tablet_tool_config_eraser_button_get_default_button(
if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
return 0;
return tool->config.eraser_button.get_button(tool);
return tool->config.eraser_button.get_default_button(tool);
}
#ifdef HAVE_LIBWACOM

View file

@ -6624,7 +6624,9 @@ enum libinput_config_scroll_button_lock_state {
* If the state is
* @ref LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED, the button is considered
* logically down after the first press and release sequence, and logically
* up after the second press and release sequence.
* up after the second press and release sequence. If the button is held
* and used to scroll for longer than a short grace period, releasing the
* button does not engage the lock.
*
* @param device The device to configure
* @param state The state to set the scroll button lock to
@ -7371,14 +7373,9 @@ libinput_tablet_tool_config_eraser_button_get_default_mode(
* the eraser mode to @ref LIBINPUT_CONFIG_ERASER_BUTTON_BUTTON via
* libinput_tablet_tool_config_eraser_button_set_mode().
*
* The buttons BTN_STYLUS, BTN_STYLUS2 and BTN_STYLUS2 are always
* allowed, even if libinput_tablet_tool_has_button() returns zero
* for the button. Otherwise, the button must be one that
* libinput_tablet_tool_has_button() returns a nonzero value for.
*
* @param tool The libinput tool
* @param button The button, usually one of BTN_STYLUS, BTN_STYLUS2 or
* BTN_STYLUS3
* @param button The button code. Must be a valid button (e.g. BTN_STYLUS)
* excluding fake buttons (e.g. BTN_TOOL_*) and keys (KEY_*)
*
* @return A config status code
*

View file

@ -24,7 +24,7 @@
#include "config.h"
/* This has the hallmarks of a library to make it re-usable from the tests
* and from the list-quirks tool. It doesn't have all of the features from a
* and from the quirks list tool. It doesn't have all of the features from a
* library you'd expect though
*/

View file

@ -41,7 +41,7 @@ DECLARE_NEWTYPE(usec, uint64_t);
static inline usec_t
usec_from_millis(uint32_t millis)
{
return usec_from_uint64_t(millis * 1000);
return usec_from_uint64_t(millis * 1000ULL);
}
static inline usec_t
@ -101,13 +101,13 @@ us2ms_f(usec_t us)
static inline usec_t
usec_from_timeval(const struct timeval *tv)
{
return usec_from_uint64_t(tv->tv_sec * 1000000 + tv->tv_usec);
return usec_from_uint64_t(tv->tv_sec * 1000000ULL + tv->tv_usec);
}
static inline usec_t
usec_from_timespec(const struct timespec *tp)
{
return usec_from_uint64_t(tp->tv_sec * 1000000 + tp->tv_nsec / 1000);
return usec_from_uint64_t(tp->tv_sec * 1000000ULL + tp->tv_nsec / 1000);
}
static inline usec_t

View file

@ -75,5 +75,6 @@ TEST_DEVICE(LITEST_ABSINFO_OVERRIDE,
{ "EVDEV_ABS_01", "2:2000:200:20" },
{ "EVDEV_ABS_35", "3:3000:300:30" },
{ "EVDEV_ABS_36", "4:4000:400:40" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -197,4 +197,8 @@ TEST_DEVICE(LITEST_ACER_HAWAII_KEYBOARD,
.name = "Chicony ACER Hawaii Keyboard",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -93,4 +93,8 @@ TEST_DEVICE(LITEST_ACER_HAWAII_TOUCHPAD,
.name = "Chicony ACER Hawaii Keyboard Touchpad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -157,4 +157,8 @@ TEST_DEVICE(LITEST_AIPTEK,
.name = "Aiptek",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -173,4 +173,8 @@ TEST_DEVICE(LITEST_ALPS_3FG,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.create = alps_create, )
.create = alps_create,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -120,4 +120,8 @@ TEST_DEVICE(LITEST_ALPS_DUALPOINT,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -113,4 +113,8 @@ TEST_DEVICE(LITEST_ALPS_SEMI_MT,
.name = "AlpsPS/2 ALPS GlidePoint",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -218,4 +218,8 @@ TEST_DEVICE(LITEST_ANKER_MOUSE_KBD,
.name = "USB Laser Game Mouse",
.id = &input_id,
.absinfo = absinfo,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -100,4 +100,8 @@ TEST_DEVICE(LITEST_APPLETOUCH,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -226,4 +226,8 @@ TEST_DEVICE(LITEST_APPLE_KEYBOARD,
.name = "Apple Inc. Apple Internal Keyboard / Trackpad",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -100,5 +100,6 @@ TEST_DEVICE(LITEST_MAGICMOUSE,
* re-writing those, so let's assume the default */
.udev_properties = {
{ "MOUSE_DPI", "1000" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -323,4 +323,8 @@ TEST_DEVICE(LITEST_MOUSE_GLADIUS,
.name = "ASUS ROG GLADIUS",
.id = &input_id,
.absinfo = absinfo,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -132,4 +132,8 @@ TEST_DEVICE(LITEST_ATMEL_HOVER,
.name = "Atmel maXTouch Touchpad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -127,4 +127,8 @@ TEST_DEVICE(LITEST_BCM5974,
.name = "bcm5974",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -85,5 +85,6 @@ TEST_DEVICE(LITEST_CALIBRATED_TOUCHSCREEN,
.udev_properties = {
{ "LIBINPUT_CALIBRATION_MATRIX", "1.2 3.4 5.6 7.8 9.10 11.12" },
{ "WL_OUTPUT", "myOutput" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -58,4 +58,8 @@ TEST_DEVICE(LITEST_CYBORG_RAT,
.name = "Saitek Cyborg R.A.T.5 Mouse",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -90,5 +90,6 @@ TEST_DEVICE(LITEST_DELL_CANVAS_TOTEM_TOUCH,
.absinfo = absinfo,
.udev_properties = {
{ "LIBINPUT_DEVICE_GROUP", "dell-canvas-totem-group" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -127,5 +127,6 @@ TEST_DEVICE(LITEST_DELL_CANVAS_TOTEM,
.absinfo = absinfo,
.udev_properties = {
{ "LIBINPUT_DEVICE_GROUP", "dell-canvas-totem-group" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -146,4 +146,8 @@ TEST_DEVICE(LITEST_ELAN_TABLET,
.name = "ELAN2514:00 04F3:23B9",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -109,4 +109,8 @@ TEST_DEVICE(LITEST_ELANTECH_TOUCHPAD,
.name = "ETPS/2 Elantech Touchpad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -53,4 +53,8 @@ TEST_DEVICE(LITEST_MOUSE_FORMAT_STRING,
.name = "Evil %s %d %x Mouse %p %",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -123,4 +123,8 @@ TEST_DEVICE(LITEST_GENERIC_PRESSUREPAD,
.name = "Some Generic Pressurepad Touchpad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -76,4 +76,8 @@ TEST_DEVICE(LITEST_GENERIC_SINGLETOUCH,
.name = "generic_singletouch",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -198,4 +198,8 @@ TEST_DEVICE(LITEST_GENERIC_USBCOMBO_KEYBOARD,
.name = "Generic USB KeyTouch Combo",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -100,7 +100,7 @@ TEST_DEVICE(LITEST_GENERIC_USBCOMBO_TOUCHPAD,
.events = events,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INPUT_TOUCHPAD_INTEGRATION", "external" },
{ "ID_INTEGRATION", "external" },
{ NULL },
},
.quirk_file = quirk_file, )

View file

@ -61,5 +61,6 @@ TEST_DEVICE(LITEST_GPIO_KEYS,
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
})

View file

@ -60,5 +60,6 @@ TEST_DEVICE(LITEST_HP_WMI_HOTKEYS,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
})

View file

@ -108,4 +108,8 @@ TEST_DEVICE(LITEST_HUION_TABLET,
.name = "HUION PenTablet Pen",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -78,5 +78,6 @@ TEST_DEVICE(LITEST_HUION_Q620M_DIAL,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INPUT_TABLET_PAD", "1" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -54,5 +54,6 @@ TEST_DEVICE(LITEST_IGNORED_MOUSE,
.events = events,
.udev_properties = {
{ "LIBINPUT_IGNORE_DEVICE", "1" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -45,7 +45,11 @@ TEST_DEVICE(LITEST_KEYBOARD_ALL_CODES,
.name = NAME,
.id = &input_id,
.events = NULL,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )
static bool
all_codes_create(struct litest_device *d)

View file

@ -250,4 +250,8 @@ TEST_DEVICE(LITEST_KEYBOARD_QUIRKED,
.id = &input_id,
.events = events,
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
},
.quirk_file = quirk_file, )

View file

@ -343,4 +343,8 @@ TEST_DEVICE(LITEST_KEYBOARD_BLACKWIDOW,
.name = "Razer Razer BlackWidow 2013",
.id = &input_id,
.absinfo = absinfo,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -215,4 +215,8 @@ TEST_DEVICE(LITEST_KEYBOARD_BLADE_STEALTH_VIDEOSWITCH,
.name = "Razer Razer Blade Stealth",
.id = &input_id,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -341,4 +341,8 @@ TEST_DEVICE(LITEST_KEYBOARD_BLADE_STEALTH,
.name = "Razer Razer Blade Stealth",
.id = &input_id,
.absinfo = absinfo,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -202,4 +202,8 @@ TEST_DEVICE(LITEST_KEYBOARD,
.name = "AT Translated Set 2 keyboard",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -52,5 +52,6 @@ TEST_DEVICE(LITEST_KEYPAD_SLIDE_SWITCH,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -57,4 +57,8 @@ TEST_DEVICE(LITEST_LENOVO_SCROLLPOINT,
.name = "HID 04b3:3109",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -57,5 +57,6 @@ TEST_DEVICE(LITEST_LID_SWITCH_SURFACE3,
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -56,5 +56,6 @@ TEST_DEVICE(LITEST_LID_SWITCH,
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -88,4 +88,8 @@ TEST_DEVICE(LITEST_KEYBOARD_LOGITECH_MEDIA_KEYBOARD_ELITE,
.name = "Logitech Logitech USB Keyboard Consumer Control",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -52,4 +52,8 @@ TEST_DEVICE(LITEST_LOGITECH_TRACKBALL,
.name = "Logitech USB Trackball",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -120,6 +120,6 @@ TEST_DEVICE(LITEST_MAGIC_TRACKPAD,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INPUT_TOUCHPAD_INTEGRATION", "external" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -57,5 +57,6 @@ TEST_DEVICE(LITEST_MOUSE_LOW_DPI,
.events = events,
.udev_properties = {
{ "MOUSE_DPI", "400@125" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -55,4 +55,8 @@ TEST_DEVICE(LITEST_MOUSE_PS2,
.name = "ImExPS/2 Generic Explorer Mouse",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -195,4 +195,8 @@ TEST_DEVICE(LITEST_MOUSE_ROCCAT,
.name = "ROCCAT ROCCAT Kone XTD",
.id = &input_id,
.absinfo = absinfo,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -52,4 +52,8 @@ TEST_DEVICE(LITEST_MOUSE_VIRTUAL,
.id = &input_id,
.events = events,
.absinfo = NULL,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -56,5 +56,6 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_CLICK_ANGLE,
.udev_properties = {
{ "MOUSE_WHEEL_CLICK_ANGLE", "-7" },
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
{ "ID_INTEGRATION", "external" },
{ NULL },
})

View file

@ -57,5 +57,6 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_CLICK_COUNT,
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
{ "MOUSE_WHEEL_CLICK_COUNT", "-14" },
{ "MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL", "27" },
{ "ID_INTEGRATION", "external" },
{ NULL },
})

View file

@ -60,4 +60,8 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_HIRES_DISABLED,
.id = &input_id,
.absinfo = NULL,
.events = events,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -56,5 +56,6 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_TILT,
.udev_properties = {
{ "MOUSE_WHEEL_TILT_HORIZONTAL", "1" },
{ "MOUSE_WHEEL_TILT_VERTICAL", "1" },
{ "ID_INTEGRATION", "external" },
{ NULL },
})

View file

@ -52,4 +52,8 @@ TEST_DEVICE(LITEST_MOUSE,
.name = "Lenovo Optical USB Mouse",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -56,4 +56,8 @@ TEST_DEVICE(LITEST_MS_NANO_TRANSCEIVER_MOUSE,
.name = "Microsoft Microsoft® Nano Transceiver v2.0",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -382,4 +382,8 @@ TEST_DEVICE(LITEST_MS_SURFACE_COVER,
.name = "Microsoft Surface Type Cover",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -87,4 +87,8 @@ TEST_DEVICE(LITEST_NEXUS4_TOUCH_SCREEN,
.name = "Nexus 4 touch screen",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -127,4 +127,8 @@ TEST_DEVICE(LITEST_PLOOPY_PAVONIS_STYLUS,
.name = "Ploopy Corporation Ploopy Pavonis Trackpad Stylus",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -213,4 +213,8 @@ TEST_DEVICE(LITEST_PROTOCOL_A_SCREEN,
.name = "Protocol A touch screen",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -98,4 +98,8 @@ TEST_DEVICE(LITEST_QEMU_TABLET,
.name = "QEMU 0.12.1 QEMU USB Tablet",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -94,4 +94,8 @@ TEST_DEVICE(LITEST_SONY_VAIO_KEYS,
.name = "Sony Vaio Keys",
.id = &input_id,
.events = events,
.absinfo = NULL, )
.absinfo = NULL,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -112,4 +112,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_HOVER_SEMI_MT,
.name = "SynPS/2 Synaptics TouchPad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -96,4 +96,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_I2C,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
},
.quirk_file = quirk_file, )

View file

@ -99,4 +99,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_PHANTOMCLICKS,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
},
.quirk_file = quirk_file, )

View file

@ -123,4 +123,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_PRESSUREPAD,
.name = "SYNA2B31:00 06CB:CE37 Touchpad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -122,4 +122,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_RMI4,
.name = "Synaptics TM3053-004",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -99,4 +99,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_TOUCHPAD,
.name = "SynPS/2 Synaptics TouchPad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -115,4 +115,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_TOPBUTTONPAD,
.name = "SynPS/2 Synaptics TouchPad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -122,4 +122,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_TRACKPOINT_BUTTONS,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -113,4 +113,8 @@ TEST_DEVICE(LITEST_SYNAPTICS_CLICKPAD_X220,
.name = "SynPS/2 Synaptics TouchPad",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -79,5 +79,6 @@ TEST_DEVICE(LITEST_TABLET_DOUBLEDIAL_PAD,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INPUT_TABLET_PAD", "1" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -61,5 +61,6 @@ TEST_DEVICE(LITEST_TABLET_MODE_UNRELIABLE,
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
})

View file

@ -76,5 +76,6 @@ TEST_DEVICE(LITEST_TABLET_REL_DIAL_PAD,
.absinfo = absinfo,
.udev_properties = {
{ "ID_INPUT_TABLET_PAD", "1" },
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -82,5 +82,6 @@ TEST_DEVICE(LITEST_THINKPAD_EXTRABUTTONS,
.absinfo = NULL,
.udev_properties = {
{ "ID_INPUT_SWITCH", "1" },
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -93,4 +93,8 @@ TEST_DEVICE(LITEST_GENERIC_MULTITOUCH_SCREEN,
.name = "generic-mt",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -122,4 +122,8 @@ TEST_DEVICE(LITEST_TOUCHPAD_PALMPRESSURE_ZERO,
.id = &input_id,
.events = events,
.absinfo = absinfo,
.quirk_file = quirk_file, )
.quirk_file = quirk_file,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -84,4 +84,8 @@ TEST_DEVICE(LITEST_MULTITOUCH_FUZZ_SCREEN,
.name = "touchscreen with fuzz",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -84,4 +84,8 @@ TEST_DEVICE(LITEST_TOUCHSCREEN_INVALID_RANGE,
.name = "touchscreen-invalid-range",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -87,4 +87,8 @@ TEST_DEVICE(LITEST_TOUCHSCREEN_MT_TOOL_TYPE,
.name = "touchscreen-mt-tool-type",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -52,4 +52,8 @@ TEST_DEVICE(LITEST_TRACKPOINT,
.name = "TPPS/2 IBM TrackPoint",
.id = &input_id,
.absinfo = NULL,
.events = events, )
.events = events,
.udev_properties = {
{ "ID_INTEGRATION", "internal" },
{ NULL },
}, )

View file

@ -106,4 +106,8 @@ TEST_DEVICE(LITEST_UCLOGIC_TABLET,
.name = "uclogic PenTablet Pen",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -113,4 +113,8 @@ TEST_DEVICE(LITEST_VMWARE_VIRTMOUSE,
.name = "VMware VMware Virtual USB Mouse",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

View file

@ -113,4 +113,8 @@ TEST_DEVICE(LITEST_WACOM_BAMBOO_16FG_PEN,
.name = "Wacom Bamboo 16FG 4x5 Pen",
.id = &input_id,
.events = events,
.absinfo = absinfo, )
.absinfo = absinfo,
.udev_properties = {
{ "ID_INTEGRATION", "external" },
{ NULL },
}, )

Some files were not shown because too many files have changed in this diff Show more