Compare commits

..

No commits in common. "main" and "1.31.0" have entirely different histories.
main ... 1.31.0

187 changed files with 395 additions and 1668 deletions

View file

@ -45,7 +45,6 @@ __all_seats()
'--verbose[Use verbose output]' \ '--verbose[Use verbose output]' \
'--show-keycodes[Make all keycodes visible]' \ '--show-keycodes[Make all keycodes visible]' \
'--grab[Exclusively grab all opened devices]' \ '--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/' \ '--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' \ '--udev=[Listen for notifications on the given seat]:seat:__all_seats' \
'--apply-to=[Apply configuration options where the device name matches the pattern]:pattern' \ '--apply-to=[Apply configuration options where the device name matches the pattern]:pattern' \

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 489 KiB

After

Width:  |  Height:  |  Size: 181 KiB

View file

@ -110,7 +110,7 @@ The most common matrices are:
.. math:: .. math::
\begin{pmatrix} \begin{pmatrix}
-1 & 0 & 1 \\ -1 & 0 & 1 \\
0 & 1 & 0 \\ 1 & 0 & 0 \\
0 & 0 & 1 0 & 0 & 1
\end{pmatrix} \end{pmatrix}

View file

@ -87,7 +87,7 @@ suggested hwdb entry. ::
If there are discrepancies between the coordinate range the kernels If there are discrepancies between the coordinate range the kernels
advertises and what the touchpad sends, the hwdb entry should be added to the advertises and what what the touchpad sends, the hwdb entry should be added to the
``60-evdev.hwdb`` file provided by the `systemd project <https://github.com/systemd/systemd>`_. ``60-evdev.hwdb`` file provided by the `systemd project <https://github.com/systemd/systemd>`_.
An example commit can be found An example commit can be found
`here <https://github.com/systemd/systemd/commit/26f667eac1c5e89b689aa0a1daef6a80f473e045>`_. `here <https://github.com/systemd/systemd/commit/26f667eac1c5e89b689aa0a1daef6a80f473e045>`_.

View file

@ -198,7 +198,7 @@ events is performed within the dispatch method.
evdev [label="evdev_device_dispatch()"] evdev [label="evdev_device_dispatch()"]
plugins [label="plugin pipeline"] plugins [label="plugin pipline"]
fallback [label="fallback_interface_process()"]; fallback [label="fallback_interface_process()"];
touchpad [label="tp_interface_process()"] touchpad [label="tp_interface_process()"]

View file

@ -13,7 +13,7 @@ Instructions on how to build libinput and its tools and how to build against
libinput. libinput.
The build instruction on this page detail how to overwrite your The build instruction on this page detail how to overwrite your
system-provided libinput with one from the git repository, system-provided libinput with one from the git repository, see
see :ref:`reverting_install` to revert to the previous state. see :ref:`reverting_install` to revert to the previous state.
.. _distribution_repos: .. _distribution_repos:
@ -27,7 +27,7 @@ the latest libinput without building it manually.
.. note:: The list below is provided for convenience. The libinput community .. note:: The list below is provided for convenience. The libinput community
cannot provide any guarantees that the packages in those repositories are cannot provide any guarantees that the packages in those repositories are
correct, up-to-date and/or unmodified from the git branch. Due diligence correct, up-to-date and/or unmodified from the git branch. Due dilligence
is recommended. is recommended.
The following repositories provide an up-to-date package for libinput: The following repositories provide an up-to-date package for libinput:

View file

@ -30,7 +30,7 @@ The "bounce" method guarantees that all press events are delivered
immediately and most release events are delivered immediately. The immediately and most release events are delivered immediately. The
"spurious" method requires that release events are delayed, libinput thus "spurious" method requires that release events are delayed, libinput thus
does not enable this method unless a faulty event sequence is detected. A does not enable this method unless a faulty event sequence is detected. A
message is printed to the log when spurious debouncing was detected. message is printed to the log when spurious deboucing was detected.
libinput's debouncing is supposed to correct hardware damage or libinput's debouncing is supposed to correct hardware damage or
substandard hardware. Debouncing also exists as an accessibility feature substandard hardware. Debouncing also exists as an accessibility feature

View file

@ -60,7 +60,7 @@ is unfortunately not visibly obvious.
available. available.
If fingers are down in the main area in addition to fingers in the If fingers are down in the main area in addition to fingers in the
left or right button area, those fingers are ignored. left or right button area, those fingers are are ignored.
A release event always releases the buttons logically down, regardless of A release event always releases the buttons logically down, regardless of
the current finger position the current finger position
@ -77,7 +77,7 @@ The movement of a finger can alter the button area behavior:
- once a finger has moved out of the button area, it cannot move back in and - once a finger has moved out of the button area, it cannot move back in and
trigger a right or middle button event trigger a right or middle button event
- a finger moving within the software button area does not move the pointer - a finger moving within the software button area does not move the pointer
- once a finger moves out of the button area it will control the - once a finger moves out out of the button area it will control the
pointer (this only applies if there is no other finger down on the pointer (this only applies if there is no other finger down on the
touchpad) touchpad)

View file

@ -47,7 +47,7 @@ for those devices it is expected to be implemented by the toolkit.
Three-finger drag Three-finger drag
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Three-finger drag emulates the mouse button down while three fingers Three-finger drag allows emulates the mouse button down while three fingers
are down on a touchpad without the need to press a physical button or use are down on a touchpad without the need to press a physical button or use
:ref:`tapndrag`. See :ref:`drag_3fg` for details on how this feature works. :ref:`tapndrag`. See :ref:`drag_3fg` for details on how this feature works.
@ -165,7 +165,7 @@ most touchpads.
Disable while trackpointing Disable while trackpointing
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
DWTP is a form of palm detection for devices that have a trackpoint (like DWTP is a form of palm detecion for devices that have a trackpoint (like
Thinkpads). While the user is using the trackpoint, the touchpad is disabled, Thinkpads). While the user is using the trackpoint, the touchpad is disabled,
being enabled again after a timeout. See :ref:`disable-while-trackpointing` for being enabled again after a timeout. See :ref:`disable-while-trackpointing` for
more info. more info.
@ -205,8 +205,8 @@ Tablet tool pressure range
The pressure range on a :ref:`Tablet tool <tablet-tools>` can be reduced The pressure range on a :ref:`Tablet tool <tablet-tools>` can be reduced
from the full available hardware range to a subset of that range. The effect from the full available hardware range to a subset of that range. The effect
of this is that the tablet will not register pressure until the given of this is that the tablet will not register pressure below the given
threshold is met, and will reach the maximum logical pressure the given threshold is met, and will reach the maximum logical pressure
before the maximum hardware-supported pressure is reached. before the maximum hardware-supported pressure is reached.
See :ref:`tablet-pressure-range` for more info. See :ref:`tablet-pressure-range` for more info.

View file

@ -144,9 +144,10 @@ This test suite can take test names etc. as arguments, have a look at
:ref:`test-suite` for more info. There are a bunch of other tests that are :ref:`test-suite` for more info. There are a bunch of other tests that are
run by the CI on merge requests, you can run those locally with :: run by the CI on merge requests, you can run those locally with ::
$> sudo meson test -C builddir $> sudo ninja -C builddir check
So it always pays to run that before submitting. So it always pays to run that before submitting. This will also run the code
through valgrind and pick up any memory leaks.
.. _contributing_submitting_code: .. _contributing_submitting_code:

View file

@ -64,7 +64,7 @@ MOUSE_DPI
MOUSE_WHEEL_CLICK_ANGLE MOUSE_WHEEL_CLICK_ANGLE
The angle in degrees for each click on a mouse wheel. See The angle in degrees for each click on a mouse wheel. See
**libinput_event_pointer_get_axis_source()** for details. **libinput_pointer_get_axis_source()** for details.
Below is an example udev rule to assign "seat1" to a device from vendor Below is an example udev rule to assign "seat1" to a device from vendor
@ -94,7 +94,7 @@ type label does not guarantee that the device is initialized by libinput.
If a device fails to meet the requirements for a device type (e.g. a keyboard If a device fails to meet the requirements for a device type (e.g. a keyboard
labelled as touchpad) the device will not be available through libinput. labelled as touchpad) the device will not be available through libinput.
Only one device type should be set per device at a time, though libinput can Only one device type should be set per device at a type, though libinput can
handle some combinations for historical reasons. handle some combinations for historical reasons.
Below is an example udev rule to remove an **ID_INPUT_TOUCHPAD** setting Below is an example udev rule to remove an **ID_INPUT_TOUCHPAD** setting

View file

@ -23,7 +23,7 @@ the serial bus (PS/2) as internal keyboards: ::
[Serial Keyboards] [Serial Keyboards]
MatchUdevType=keyboard MatchUdevType=keyboard
MatchBus=ps2 MatchBus=serial
AttrKeyboardIntegration=internal AttrKeyboardIntegration=internal
@ -46,7 +46,7 @@ Installing temporary local device quirks
The model quirks are part of the source distribution and should never be The model quirks are part of the source distribution and should never be
modified. For temporary local workarounds, libinput reads the modified. For temporary local workarounds, libinput reads the
``/etc/libinput/local-overrides.quirks`` file. Users may add sections to ``/etc/libinput/local-overrides.quirks`` file. Users may add a sections to
this file to add a device quirk for a local device but beware that **any this file to add a device quirk for a local device but beware that **any
modification must be upstreamed** or it may cease to work at any time. modification must be upstreamed** or it may cease to work at any time.
@ -130,7 +130,7 @@ Quirks starting with **Model*** triggers implementation-defined behaviour
for this device not needed for any other device. Only the more for this device not needed for any other device. Only the more
general-purpose **Model*** flags are listed here. general-purpose **Model*** flags are listed here.
ModelALPSSerialTouchpad, ModelAppleTouchpad, ModelWacomTouchpad, ModelChromebook ModelALPSTouchpad, ModelAppleTouchpad, ModelWacomTouchpad, ModelChromebook
Reserved for touchpads made by the respective vendors Reserved for touchpads made by the respective vendors
ModelTouchpadVisibleMarker ModelTouchpadVisibleMarker
Indicates the touchpad has a drawn-on visible marker between the software Indicates the touchpad has a drawn-on visible marker between the software
@ -162,9 +162,9 @@ ModelScrollOnMiddleClick
Some mice can generate unwanted high-resolution scroll events when the wheel Some mice can generate unwanted high-resolution scroll events when the wheel
is pressed. Increases the scroll threshold required to start scrolling to is pressed. Increases the scroll threshold required to start scrolling to
avoid accidentally scrolling when middle clicking. avoid accidentally scrolling when middle clicking.
AttrSizeHint=NxM, AttrResolutionHint=NxM AttrSizeHint=NxM, AttrResolutionHint=N
Hints at the width x height of the device in mm, or the resolution Hints at the width x height of the device in mm, or the resolution
of the x and y axes in units/mm. These may only be used where they apply to of the x/y axis in units/mm. These may only be used where they apply to
a large proportion of matching devices. They should not be used for any a large proportion of matching devices. They should not be used for any
specific device, override ``EVDEV_ABS_*`` instead, see specific device, override ``EVDEV_ABS_*`` instead, see
:ref:`absolute_coordinate_ranges_fix`. :ref:`absolute_coordinate_ranges_fix`.

View file

@ -99,7 +99,7 @@ Hold gestures have three potential logical states:
- **begin**: one or more fingers are placed on the device at the same time - **begin**: one or more fingers are placed on the device at the same time
- **end**: all fingers are removed and the device enters a neutral logical state - **end**: all fingers are removed and the device enters a neutral logical state
- **end(cancelled)**: all fingers are part of a known interaction and the - **end(cancelled)**: all fingers are part of a known interaction and the
current hold gesture is no longer active. This may also occur when currenthold gesture is no longer active. This may also occurs when
switching between hold gestures with different finger counts. switching between hold gestures with different finger counts.
.. note:: By definition, a hold gesture does not move and thus no coordinate .. note:: By definition, a hold gesture does not move and thus no coordinate
@ -108,15 +108,14 @@ Hold gestures have three potential logical states:
For example, a user that puts one finger, then a second finger down and For example, a user that puts one finger, then a second finger down and
releases them later may trigger the following event sequence: releases them later may trigger the following event sequence:
============= ============== ============ ============= ============ ============
Action Event Finger count Action Event Finger count
============= ============== ============ ============= ============ ============
Finger 1 down **begin** 1 Finger 1 down <no event>
Finger 2 down **cancel** 1 Finger 2 down **begin** 2
\ **begin** 2
Finger 2 up **end** 2 Finger 2 up **end** 2
Finger 1 up <no event> Finger 1 up <no event>
============= ============== ============ ============= ============ ============
A hold gesture may by be **cancelled**. This occurs A hold gesture may by be **cancelled**. This occurs
when the hold gesture changes into some other interaction and should no when the hold gesture changes into some other interaction and should no
@ -255,8 +254,7 @@ towards an interaction, see :ref:`thumb_detection` and
In the context of hold gestures, thumbs and palms are treated by libinput as In the context of hold gestures, thumbs and palms are treated by libinput as
if the finger was removed from the device. Where other non-thumb/non-palm if the finger was removed from the device. Where other non-thumb/non-palm
fingers remain on the device, the current hold gesture is cancelled and a fingers remain on the device, an **hold update** event is sent. Otherwise,
new **hold begin** event with the updated finger count is sent. Otherwise,
the hold gesture terminates with a **hold cancel** event. the hold gesture terminates with a **hold cancel** event.
Notably, libinput's thumb and palm detection is not a simple boolean per Notably, libinput's thumb and palm detection is not a simple boolean per
@ -361,7 +359,7 @@ Touchpoints are assigned in sequential order and only the first two touch
points are trackable. For libinput this produces an ambiguity where it is points are trackable. For libinput this produces an ambiguity where it is
impossible to detect whether a gesture is a pinch gesture or a swipe gesture impossible to detect whether a gesture is a pinch gesture or a swipe gesture
whenever a user puts the index and middle finger down first. Since the third whenever a user puts the index and middle finger down first. Since the third
finger does not have positional information, its location cannot be finger does not have positional information, it's location cannot be
determined. determined.
.. figure:: gesture-2fg-ambiguity.svg .. figure:: gesture-2fg-ambiguity.svg

View file

@ -21,7 +21,7 @@ input devices (see :ref:`udev_device_type`) but that should not be used by
libinput. It is recommended that devices that should not be handled as input libinput. It is recommended that devices that should not be handled as input
devices at all unset the **ID_INPUT** and related properties instead. The devices at all unset the **ID_INPUT** and related properties instead. The
**LIBINPUT_IGNORE_DEVICE** property signals that only libinput should **LIBINPUT_IGNORE_DEVICE** property signals that only libinput should
ignore this device but other parts of the stack (if any) should continue ignore this property but other parts of the stack (if any) should continue
treating this device normally. treating this device normally.
Below is an example udev rule to assign **LIBINPUT_IGNORE_DEVICE** to the Below is an example udev rule to assign **LIBINPUT_IGNORE_DEVICE** to the

View file

@ -162,7 +162,7 @@ the value can be crafted manually:
.. code-block:: lua .. code-block:: lua
evdev_type = 0x2 -- EV_REL evdev_type = 0x3 -- EV_REL
evdev_code = 0x1 -- REL_Y evdev_code = 0x1 -- REL_Y
evdev_usage = (evdev_type << 16) | evdev_code evdev_usage = (evdev_type << 16) | evdev_code
@ -485,7 +485,7 @@ methods will be noops.
Version 1 of the plugin API supports the following udev properties: Version 1 of the plugin API supports the following udev properties:
- All of ``ID_INPUT_*`` that denote the device type as assigned - ``ID_INPUT`` and all of ``ID_INPUT_*`` that denote the device type as assigned
by udev. This information is usually used by libinput to determine a by udev. This information is usually used by libinput to determine a
device type. Note that for historical reasons these properties have device type. Note that for historical reasons these properties have
varying rules - some properties may be mutually exclusive, others are varying rules - some properties may be mutually exclusive, others are

View file

@ -14,7 +14,7 @@ touch the bottom edges of the touchpad during normal interaction.
Interference from a palm depends on the size of the touchpad and the position Interference from a palm depends on the size of the touchpad and the position
of the user's hand. Data from touchpads showed that almost all palm events of the user's hand. Data from touchpads showed that almost all palm events
during typing on a Lenovo T440 happened in the left-most and right-most 5% of during tying on a Lenovo T440 happened in the left-most and right-most 5% of
the touchpad. The T440 series has one of the largest touchpads, other the touchpad. The T440 series has one of the largest touchpads, other
touchpads are less affected by palm touches. touchpads are less affected by palm touches.
@ -52,7 +52,7 @@ Palm detection based on pressure
The simplest form of palm detection labels a touch as palm when the pressure The simplest form of palm detection labels a touch as palm when the pressure
value goes above a certain threshold. This threshold is usually high enough value goes above a certain threshold. This threshold is usually high enough
that it cannot be triggered by a finger movement. Once a touch is labelled as that it cannot be triggered by a finger movement. One a touch is labelled as
palm based on pressure, it will remain so even if the pressure drops below palm based on pressure, it will remain so even if the pressure drops below
the threshold again. This ensures that a palm remains a palm even when the the threshold again. This ensures that a palm remains a palm even when the
pressure changes as the user is typing. pressure changes as the user is typing.
@ -187,7 +187,7 @@ Stylus-touch arbitration
A special case of palm detection is touch arbitration on devices that A special case of palm detection is touch arbitration on devices that
support styli. When interacting with a stylus on the screen, parts of the support styli. When interacting with a stylus on the screen, parts of the
hand may touch the surface and trigger touches. As the user is currently hand may touch the surface and trigger touches. As the user is currently
interacting with the stylus, these touches would interfere with the correct interacting with the stylus, these touches would interfer with the correct
working of the stylus. working of the stylus.
libinput employs a method similar to :ref:`disable-while-typing` to detect libinput employs a method similar to :ref:`disable-while-typing` to detect

View file

@ -39,7 +39,7 @@ Velocity calculation
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
The device's speed of movement is measured across multiple input events The device's speed of movement is measured across multiple input events
through so-called "trackers". Each event prepends a tracker item, each through so-called "trackers". Each event prepends a the tracker item, each
subsequent tracker contains the delta of that item to the current position, subsequent tracker contains the delta of that item to the current position,
the timestamp of the event that created it and the cardinal direction of the the timestamp of the event that created it and the cardinal direction of the
movement at the time. If a device moves into the same direction, the movement at the time. If a device moves into the same direction, the

View file

@ -185,7 +185,7 @@ When you file a bug, please attach the following information:
- a virtual description of your input device, see :ref:`libinput-record`. - a virtual description of your input device, see :ref:`libinput-record`.
This is the most important piece of information, do not forget it! This is the most important piece of information, do not forget it!
- the vendor model number of the device (e.g. "Sony PlayStation3 controller") - the vendor model number of the device (e.g. "Sony Plastation3 controller")
.. _udev_info: .. _udev_info:
@ -368,7 +368,7 @@ them.
without someone stepping up to do the work. If you do see this tag, do ask without someone stepping up to do the work. If you do see this tag, do ask
for guidance on how to implement it. for guidance on how to implement it.
- **hw issue**: an issue that affects a specific device and is a hardware - **hw issue**: an issue that affects a specific device and is a hardware
bug, not a software bug. Often these need to be worked around in libinput bug, not a software bug. Often these needs to be worked around in libinput
but there are cases where a hw issue ends up as *cantfix*. but there are cases where a hw issue ends up as *cantfix*.
- **janitor**: a cleanup task that does not substantially affect how - **janitor**: a cleanup task that does not substantially affect how
libinput works. These are usually good bugs for newcomers to start on. libinput works. These are usually good bugs for newcomers to start on.
@ -389,7 +389,7 @@ them.
*cantfix*. *cantfix*.
- **wontfix**: this issue will not get fixed. This tag is usually assigned - **wontfix**: this issue will not get fixed. This tag is usually assigned
to feature requests that are outside the scope of libinput or would put an to feature requests that are outside the scope of libinput or would put an
unreasonable maintenance burden on the maintainers. unreasonable maintenance burdern on the maintainers.
These tags are high-level categories only, always look for the comments in These tags are high-level categories only, always look for the comments in
the issue to get further details. the issue to get further details.

View file

@ -12,7 +12,7 @@ one can be enabled at a time. As a general overview:
- touchpad devices with physical buttons below the touchpad support edge and - touchpad devices with physical buttons below the touchpad support edge and
two-finger scrolling two-finger scrolling
- touchpad devices without physical buttons (:ref:`ClickPads <clickpad_softbuttons>`) - touchpad devices without physical buttons (:ref:`ClickPads <clickpad_softbuttons>`)
support two-finger scrolling and edge scrolling support two-finger scrolling only
- pointing sticks provide on-button scrolling by default - pointing sticks provide on-button scrolling by default
- mice and other pointing devices support on-button scrolling but it is not - mice and other pointing devices support on-button scrolling but it is not
enabled by default enabled by default
@ -124,12 +124,6 @@ button lock, the button is now considered logically held down. Pressing and
releasing the button a second time logically releases the button. While the releasing the button a second time logically releases the button. While the
button is logically held down, motion events are converted to scroll events. 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: .. _scroll_sources:
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View file

@ -43,7 +43,7 @@ Thus, devices "Foo" and "Bar" both reference the same struct
The effect of seat assignment The effect of seat assignment
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
A logical seat is interpreted as a group of devices that usually belong to a A logical set is interpreted as a group of devices that usually belong to a
single user that interacts with a computer. Thus, the devices are single user that interacts with a computer. Thus, the devices are
semantically related. This means for devices within the same logical seat: semantically related. This means for devices within the same logical seat:

View file

@ -4,9 +4,9 @@
Switches Switches
============================================================================== ==============================================================================
libinput supports the lid, tablet-mode, and keypad slide switches. Unlike libinput supports the lid and tablet-mode switches. Unlike button events
button events that come in press and release pairs, switches are usually that come in press and release pairs, switches are usually toggled once and
toggled once and left at the setting for an extended period of time. left at the setting for an extended period of time.
Only some switches are handled by libinput, see **libinput_switch** for a Only some switches are handled by libinput, see **libinput_switch** for a
list of supported switches. Switch events are exposed to the caller, but list of supported switches. Switch events are exposed to the caller, but
@ -59,20 +59,3 @@ tablet mode is disengaged.
This handling of tablet mode switches is transparent to the user, no This handling of tablet mode switches is transparent to the user, no
notifications are sent and the device appears as enabled at all times. 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

@ -58,7 +58,7 @@ event of type **LIBINPUT_EVENT_TABLET_TOOL_TIP**, and again when the tip
ceases contact with the surface. ceases contact with the surface.
Tablet tools may send button events; these are exclusively for extra buttons Tablet tools may send button events; these are exclusively for extra buttons
unrelated to the tip. A button event is independent of the tip and can occur while unrelated to the tip. A button event is independent of the tip and can while
the tip is down or up. the tip is down or up.
Some tablet tools' pressure detection is too sensitive, causing phantom Some tablet tools' pressure detection is too sensitive, causing phantom
@ -67,7 +67,7 @@ tools are capable of detecting 1 gram of pressure.
libinput uses a device-specific pressure threshold to determine when the tip libinput uses a device-specific pressure threshold to determine when the tip
is considered logically down. As a result, libinput may send a nonzero is considered logically down. As a result, libinput may send a nonzero
pressure value while the tip is logically up. Most applications can and pressure value while the tip is logically up. Most application can and
should ignore pressure information until they receive the event of type should ignore pressure information until they receive the event of type
**LIBINPUT_EVENT_TABLET_TOOL_TIP**. Applications that require extremely **LIBINPUT_EVENT_TABLET_TOOL_TIP**. Applications that require extremely
fine-grained pressure sensitivity should use the pressure data instead of fine-grained pressure sensitivity should use the pressure data instead of
@ -100,7 +100,7 @@ all pen-like tools to absolute mode.
If a tool in relative mode must not use pointer acceleration, callers If a tool in relative mode must not use pointer acceleration, callers
should use the absolute coordinates returned by should use the absolute coordinates returned by
**libinput_event_tablet_tool_get_x()** and **libinput_event_tablet_tool_get_y()** **libinput_event_tablet_tool_get_x()** and libinput_event_tablet_tool_get_y()
and calculate the delta themselves. Callers that require exact physical and calculate the delta themselves. Callers that require exact physical
distance should also use these functions to calculate delta movements. distance should also use these functions to calculate delta movements.
@ -284,7 +284,7 @@ with **libinput_tablet_tool_get_tool_id()** but makes no promises about the
content or format of the ID. content or format of the ID.
libinput currently supports Wacom-style tool IDs as provided on the Wacom libinput currently supports Wacom-style tool IDs as provided on the Wacom
Intuos 3, 4, 5, Wacom Cintiq and Wacom Intuos Pro series. The tool ID can Intuos 3, 4, 5, Wacon Cintiq and Wacom Intuos Pro series. The tool ID can
be used to distinguish between e.g. a Wacom Classic Pen or a Wacom Pro Pen. be used to distinguish between e.g. a Wacom Classic Pen or a Wacom Pro Pen.
It is the caller's responsibility to interpret the tool ID. It is the caller's responsibility to interpret the tool ID.
@ -357,7 +357,7 @@ tablet by 180 degrees to move the tablet pad button area to right side of
the tablet. When left-handed mode is enabled on a tablet device (see the tablet. When left-handed mode is enabled on a tablet device (see
**libinput_device_config_left_handed_set()**) the tablet tool and tablet pad **libinput_device_config_left_handed_set()**) the tablet tool and tablet pad
behavior changes. In left-handed mode, the tools' axes are adjusted behavior changes. In left-handed mode, the tools' axes are adjusted
so that the origin of each axis remains the logical north-west of so that the origin of each axis remains the logical north-east of
the physical tablet. For example, the x and y axes are inverted and the the physical tablet. For example, the x and y axes are inverted and the
positive x/y coordinates are down/right of the top-left corner of the tablet positive x/y coordinates are down/right of the top-left corner of the tablet
in its current orientation. On a tablet pad, the ring and strip are in its current orientation. On a tablet pad, the ring and strip are
@ -401,7 +401,7 @@ caller to decide whether the mode only applies to buttons, rings and strips
or only to rings and strips (this is the case with the Wacom OS X and or only to rings and strips (this is the case with the Wacom OS X and
Windows driver). Windows driver).
The availability of modes on a tablet pad usually depends on visual feedback The availability of modes on a touchpad usually depends on visual feedback
such as LEDs around the touch ring. If no visual feedback is available, only such as LEDs around the touch ring. If no visual feedback is available, only
one mode may be available. one mode may be available.
@ -509,7 +509,7 @@ tip of the tool - inverting the tool brings the eraser into proximity.
.. figure:: tablet-eraser-invert.svg .. figure:: tablet-eraser-invert.svg
:align: center :align: center
A pen-like tool used as pen and as eraser by inverting it An pen-like tool used as pen and as eraser by inverting it
Having an eraser as a separate tool is beneficial in many applications as the Having an eraser as a separate tool is beneficial in many applications as the
eraser tool can be assigned different functionality (colors, paint tools, etc.) eraser tool can be assigned different functionality (colors, paint tools, etc.)
@ -524,7 +524,7 @@ into proximity immediately after - as if the tool was physically inverted.
.. figure:: tablet-eraser-button.svg .. figure:: tablet-eraser-button.svg
:align: center :align: center
A pen-like tool used as pen and as eraser by pressing the eraser button An pen-like tool used as pen and as eraser by pressing the eraser button
Microsoft mandates this behavior (see Microsoft mandates this behavior (see
`Windows Pen States <https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states>`_ `Windows Pen States <https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states>`_
@ -541,4 +541,4 @@ is disabled, pressing that button will generate a normal tablet tool button
event. event.
This configuration is only available on pens with an eraser button, not on This configuration is only available on pens with an eraser button, not on
pens with an invert-type eraser. with an invert-type eraser.

View file

@ -59,16 +59,13 @@ tap-and-drag enabled by default.
middle-click drag, tap with three fingers followed by a middle-click drag, tap with three fingers followed by a
single-finger drag. single-finger drag.
Also optional is a feature called "drag lock". With drag lock **disabled**, Also optional is a feature called "drag lock". With drag lock disabled, lifting
lifting the finger will stop any drag process. When **enabled**, the drag the finger will stop any drag process. When enabled, the drag
process continues even after lifting a finger, allowing the user to process continues even after lifting a finger but can be ended
reset the finger position and keep moving without releasing the drag. with an additional tap. If timeout-based drag-locks are enabled
the drag process will also automatically end once the finger has
libinput supports two variations of this drag lock: "sticky" and "timeout". been lifted for an implementation-specific timeout. Drag lock can be
In sticky mode, the drag lock must be ended with an explicit additional tap. enabled and disabled with **libinput_device_config_tap_set_drag_lock_enabled()**.
In timeout mode, the drag lock ends automatically if no finger was put back on
the touchpad within a timeout. Drag lock can be enabled and disabled with
**libinput_device_config_tap_set_drag_lock_enabled()**.
Note that drag lock only applies if tap-and-drag is enabled. Note that drag lock only applies if tap-and-drag is enabled.
.. figure:: tap-n-drag.svg .. figure:: tap-n-drag.svg
@ -84,13 +81,11 @@ position can be reset by lifting and quickly setting it down again on the
touchpad (d). This will be interpreted as continuing move and is especially touchpad (d). This will be interpreted as continuing move and is especially
useful on small touchpads or with slow pointer acceleration. useful on small touchpads or with slow pointer acceleration.
If drag lock is enabled, the release of the mouse buttons after the finger If drag lock is enabled, the release of the mouse buttons after the finger
release (e) is triggered by a timeout (if in timeout mode) or by tapping again (f). release (e) is triggered by a timeout. To release the button immediately,
simply tap again (f).
libinput also supports an "auto drag-lock" feature: if drag lock is **disabled** If drag lock is enabled in sticky mode there is no timeout after
but the dragging finger is released at the very edge of the touchpad, releasing a finger and an extra tap is required to release the button.
a drag lock automatically activates for a short timeout. This allows a user to
quickly reset the finger to elsewhere on the touchpad and continue the dragging
motion. If the finger is released elsewhere, no drag lock activates.
If two fingers are supported by the hardware, a second finger can be used to If two fingers are supported by the hardware, a second finger can be used to
drag while the first is held in-place. drag while the first is held in-place.

View file

@ -15,7 +15,7 @@ run to check for behavior changes and/or regressions. For quick iteration,
the number of tests to run can be filtered, see :ref:`test-filtering`. the number of tests to run can be filtered, see :ref:`test-filtering`.
This allows for developers to verify a subset of tests (e.g. This allows for developers to verify a subset of tests (e.g.
touchpad tap-to-click) while hacking on that specific feature and only run touchpad tap-to-click) while hacking on that specific feature and only run
the full suite when development is finished. the full suite when development is done finished.
.. note:: The test suite relies on udev and the kernel, specifically uinput. .. note:: The test suite relies on udev and the kernel, specifically uinput.
It creates virtual input devices and replays the events. This may It creates virtual input devices and replays the events. This may
@ -38,7 +38,7 @@ Job control in the test suite
The test suite runner has a make-like job control enabled by the ``-j`` or The test suite runner has a make-like job control enabled by the ``-j`` or
``--jobs`` flag and will fork off as many parallel processes as given by this ``--jobs`` flag and will fork off as many parallel processes as given by this
flag. The default if unspecified is 8. When debugging a specific test case flag. The default if unspecified is 8. When debugging a specific test case
failure it is recommended to employ test filters (see :ref:`test-filtering`) failure it is recommended to employ test filtures (see :ref:`test-filtering`)
and disable parallel tests. The test suite automatically disables parallel and disable parallel tests. The test suite automatically disables parallel
make when run in gdb. make when run in gdb.
@ -235,7 +235,7 @@ suites as:
:: ::
$ meson test --no-suite=hardware # only run container-friendly tests $ meson test --no-suite=machine # only run container-friendly tests
$ meson test --suite=valgrind --setup=valgrind # run all valgrind-compatible tests $ meson test --suite=valgrind --setup=valgrind # run all valgrind-compatible tests
$ meson test --no-suite=root # run all tests not requiring root $ meson test --no-suite=root # run all tests not requiring root

View file

@ -269,7 +269,7 @@ alphanumeric key shows up as letter "a".
The recording can be replayed with the ``libinput replay`` command: :: The recording can be replayed with the ``libinput replay`` command: ::
$ sudo libinput replay touchpad.yml $ sudo libinput replay touchpad.yml
/dev/input/event19: SynPS/2 Synaptics TouchPad SynPS/2 Synaptics TouchPad: /dev/input/event19
Hit enter to start replaying Hit enter to start replaying
@ -329,13 +329,16 @@ specific bug. For example, a touchpad may not work in response to keyboard
events. To accurately reproduce this sequence, the timing between multiple events. To accurately reproduce this sequence, the timing between multiple
devices must be correct and we need to record the events in one go. devices must be correct and we need to record the events in one go.
``libinput record`` can record multiple devices by specifying them on the ``libinput record`` has a ``--multiple`` argument to record multiple devices at
commandline. Recording multiple devices requires the ``--output-file`` once. Unlike the normal invocation, this one requires a number of arguments: ::
argument: ::
$ sudo libinput record --output-file=touchpad-bug.yml /dev/input/event17 /dev/input/event3 $ sudo libinput record --multiple --output-file=touchpad-bug.yml /dev/input/event17 /dev/input/event3
recording to 'touchpad-bug.yml' recording to 'touchpad-bug.yml'
As seen above, a user must specify ``--multiple`` and the ``--output-file``.
Finally, all devices to be recorded must be specified on the commandline as
well.
Replaying events is the same as for a single recording: :: Replaying events is the same as for a single recording: ::
$ sudo libinput replay touchpad-bug.yml $ sudo libinput replay touchpad-bug.yml
@ -362,7 +365,7 @@ The ``libinput analyze`` tool is a multiplexer for various sub-tools that
can analyze input events previously recorded from a device. can analyze input events previously recorded from a device.
Please see the **libinput-analyze(1)** man page for information about what Please see the **libinput-analyze(1)** man page for information about what
tools are available and the man page for each respective tool. tools are available and the man page for each respective too.
.. _libinput-quirks: .. _libinput-quirks:

View file

@ -8,10 +8,10 @@ Touchpad jitter describes random movement by a few pixels even when the
user's finger is unmoving. user's finger is unmoving.
libinput has a mechanism called a **hysteresis** to avoid that jitter. When libinput has a mechanism called a **hysteresis** to avoid that jitter. When
active, movement within the **hysteresis margin** is discarded. If the active, movement with in the **hysteresis margin** is discarded. If the
movement delta is larger than the margin, the movement is passed on as movement delta is larger than the margin, the movement is passed on as
pointer movement. This is a simplified summary, developers should pointer movement. This is a simplified summary, developers should
read the implementation of the hysteresis in ``src/evdev.h``. read the implementation of the hysteresis in ``src/evdev.c``.
libinput uses the kernel ``fuzz`` value to determine the size of the libinput uses the kernel ``fuzz`` value to determine the size of the
hysteresis. Users should override this with a udev hwdb entry where the hysteresis. Users should override this with a udev hwdb entry where the

View file

@ -76,8 +76,8 @@ Example output of the tool is below: ::
The example output shows five completed touch sequences and one ongoing one. The example output shows five completed touch sequences and one ongoing one.
For each, the respective minimum and maximum pressure values are printed as For each, the respective minimum and maximum pressure values are printed as
well as some statistics. The ``down`` column shows that each sequence was well as some statistics. The ``down`` column show that each sequence was
considered logically down at some point (see the thresholds in the last line), considered logically down at some point (see the threholds in the last line),
two of the sequences were considered thumbs. This is an interactive tool and two of the sequences were considered thumbs. This is an interactive tool and
its output may change frequently. Refer to the its output may change frequently. Refer to the
**libinput-measure-touchpad-pressure(1)** man page for more details. **libinput-measure-touchpad-pressure(1)** man page for more details.
@ -112,7 +112,7 @@ Once the thresholds are decided on (e.g. 10 and 8), they can be enabled with
AttrPalmPressureThreshold=150 AttrPalmPressureThreshold=150
AttrThumbPressureThreshold=100 AttrThumbPressureThreshold=100
The file name **must** be ``/etc/libinput/local-overrides.quirks``. The file name **must** be ``/etc/libinput/local-overrides.quirks``. The
The first line is the section name and can be free-form. The ``Match`` The first line is the section name and can be free-form. The ``Match``
directives limit the quirk to your touchpad, make sure the device name directives limit the quirk to your touchpad, make sure the device name
matches your device's name (see ``libinput record``'s output). The dmi matches your device's name (see ``libinput record``'s output). The dmi
@ -124,7 +124,7 @@ and product name (pn).
Once in place, run the following command to verify the quirk is valid and Once in place, run the following command to verify the quirk is valid and
works for your device: :: works for your device: ::
$ sudo libinput quirks list /dev/input/event10 $ sudo libinput list-quirks /dev/input/event10
AttrPressureRange=10:8 AttrPressureRange=10:8
Replace the event node with the one from your device. If the 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 Once in place, run the following command to verify the quirk is valid and
works for your device: :: works for your device: ::
$ sudo libinput quirks list /dev/input/event10 $ sudo libinput list-quirks /dev/input/event10
AttrTouchSizeRange=10:8 AttrTouchSizeRange=10:8
Replace the event node with the one from your device. If the Replace the event node with the one from your device. If the

View file

@ -50,7 +50,7 @@ touchpads. Some devices can detect multiple fingers but only provide
Some devices provide additional touch size information through Some devices provide additional touch size information through
the ``ABS_MT_TOUCH_MAJOR/ABS_MT_TOUCH_MINOR`` axes and/or the ``ABS_MT_TOUCH_MAJOR/ABS_MT_TOUCH_MINOR`` axes and/or
the ``ABS_MT_WIDTH_MAJOR/ABS_MT_WIDTH_MINOR`` axes. These axes specify the ``ABS_MT_WIDTH_MAJOR/ABS_MT_WIDTH_MINOR`` axes. These axes specifcy
the size of the touch ellipse. While the kernel documentation specifies how the size of the touch ellipse. While the kernel documentation specifies how
these axes are supposed to be mapped, few devices forward reliable these axes are supposed to be mapped, few devices forward reliable
information. libinput uses these values together with a device-specific information. libinput uses these values together with a device-specific

View file

@ -25,7 +25,7 @@ Physically separate buttons
Touchpads with physical buttons usually provide two buttons, left and right. Touchpads with physical buttons usually provide two buttons, left and right.
A few touchpads with three buttons exist, and Apple used to have touchpads A few touchpads with three buttons exist, and Apple used to have touchpads
with a single physical button until ca 2008. Touchpads with only two with a single physical buttons until ca 2008. Touchpads with only two
buttons require the software stack to emulate a middle button. libinput does buttons require the software stack to emulate a middle button. libinput does
this when both buttons are pressed simultaneously. this when both buttons are pressed simultaneously.

View file

@ -25,7 +25,7 @@ Button scrolling on trackpoints
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Trackpoint devices have :ref:`button_scrolling` enabled by default. This may Trackpoint devices have :ref:`button_scrolling` enabled by default. This may
interfere with middle-button dragging, if middle-button dragging is required interfer with middle-button dragging, if middle-button dragging is required
by a user then button scrolling must be disabled. by a user then button scrolling must be disabled.
.. _trackpoint_range: .. _trackpoint_range:

View file

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

View file

@ -45,7 +45,7 @@ Both events have their own set of APIs to access the data within:
- ``LIBINPUT_EVENT_POINTER_SCROLL_WHEEL`` available since libinput 1.19. - ``LIBINPUT_EVENT_POINTER_SCROLL_WHEEL`` available since libinput 1.19.
* ``libinput_event_pointer_get_scroll_value_v120()`` returns a value * ``libinput_event_pointer_get_scroll_value_v120()`` returns a value
normalized into multiples of 120, see below. Any multiple of 120 should normalized into the 0..120 range, see below. Any multiple of 120 should
be treated as one full wheel click. be treated as one full wheel click.
.. note:: Where possible, the ``libinput_event_pointer_get_axis_value()``, .. note:: Where possible, the ``libinput_event_pointer_get_axis_value()``,
@ -77,7 +77,7 @@ wheel:
| 20 | 20 | 1 | 120 | | 20 | 20 | 1 | 120 |
+-------------+------------+---------------+------+ +-------------+------------+---------------+------+
Fast scrolling may trigger more than one detent per event and thus each Fast scrolling may trigger cover than one detent per event and thus each
event may contain multiples of the value, discrete or v120 value: event may contain multiples of the value, discrete or v120 value:
+-------------+------------+---------------+------+ +-------------+------------+---------------+------+

View file

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

View file

@ -1,11 +0,0 @@
# Do not edit this file, it will be overwritten on update
# Touchpad is not a clickpad but INPUT_PROP_BUTTONPAD is set,
# causing libinput to drop physical button events.
[Clevetura CLVX S Touchpad]
MatchUdevType=touchpad
MatchBus=bluetooth
MatchVendor=0x36F7
MatchProduct=0x5755
AttrInputProp=-INPUT_PROP_BUTTONPAD
AttrEventCode=+BTN_RIGHT

View file

@ -9,11 +9,3 @@ AttrPressureRange=10:8
MatchName=*Elan Touchpad* MatchName=*Elan Touchpad*
AttrResolutionHint=31x31 AttrResolutionHint=31x31
AttrPressureRange=10:8 AttrPressureRange=10:8
# Elan Hapticpad mostly used in Lenovo laptops.
[Elan Haptic Touchpad (04F3:3355)]
MatchBus=i2c
MatchVendor=0x04F3
MatchProduct=0x3355
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD

View file

@ -2,15 +2,6 @@
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops. # "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# Match vid and pid as it can have other names. # 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)] [Goodix Haptic Touchpad (27C6:01E8)]
MatchBus=i2c MatchBus=i2c
MatchVendor=0x27C6 MatchVendor=0x27C6
@ -18,42 +9,6 @@ MatchProduct=0x01E8
MatchUdevType=touchpad MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD 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
# "GXTP5400 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5400:00 27C6:0F96 Touchpad
[Goodix Haptic Touchpad (27C6:0F96)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x0F96
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops. # "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
# GXTP5420:00 27C6:0F95 Touchpad # GXTP5420:00 27C6:0F95 Touchpad
[Goodix Haptic Touchpad (27C6:0F95)] [Goodix Haptic Touchpad (27C6:0F95)]
@ -62,11 +17,3 @@ MatchVendor=0x27C6
MatchProduct=0x0F95 MatchProduct=0x0F95
MatchUdevType=touchpad MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD AttrInputProp=+INPUT_PROP_PRESSUREPAD
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
[Goodix Haptic Touchpad (27C6:0F90)]
MatchBus=i2c
MatchVendor=0x27C6
MatchProduct=0x0F90
MatchUdevType=touchpad
AttrInputProp=+INPUT_PROP_PRESSUREPAD

View file

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

View file

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

View file

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

View file

@ -1,11 +0,0 @@
# Do not edit this file, it will be overwritten on update
# Most Pixart Touchpad (093A:0255) devices don't have buttons so we remove right
# button in 30-vendor-pixart.quirks, but this one does.
[Positivo VAIO FE15 Touchpad]
MatchBus=i2c
MatchVendor=0x093A
MatchProduct=0x0255
MatchUdevType=touchpad
MatchDMIModalias=dmi:*:svnPositivoBahia-VAIO:pnVJFE59F11X-*:*
AttrEventCode=+BTN_RIGHT

View file

@ -1,8 +0,0 @@
# Do not edit this file, it will be overwritten on update
# Clickpad that announces BTN_RIGHT
[Wareus B15 Touchpad]
MatchName=HTIX5288:00 36B6:C001 Touchpad
MatchUdevType=touchpad
MatchDMIModalias=dmi:*svnWareus:*pnB15*
AttrEventCode=-BTN_RIGHT

View file

@ -82,10 +82,10 @@ files will not be used.
Debugging Debugging
--------- ---------
When modifying a data file, use the `libinput quirks list` tool to When modifying a data file, use the `libinput list-quirks` tool to
verify the changes. The tool can be pointed at the data directory to verify the changes. The tool can be pointed at the data directory to
analyse, use `--verbose` to get more info. For example: analyse, use `--verbose` to get more info. For example:
``` ```
libinput quirks list --data-dir /path/to/git/repo/quirks/ --verbose /dev/input/event0 libinput list-quirks --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_TOOL_FINGER:
case EVDEV_BTN_TOUCH: case EVDEV_BTN_TOUCH:
return false; return false;
case EVDEV_BTN_STYLUS: case BTN_STYLUS:
case EVDEV_BTN_STYLUS2: case BTN_STYLUS2:
case EVDEV_BTN_STYLUS3: case BTN_STYLUS3:
return true; return true;
case EVDEV_BTN_MISC ... EVDEV_BTN_DIGI - 1: case EVDEV_BTN_MISC ... EVDEV_BTN_DIGI - 1:
case EVDEV_BTN_WHEEL ... EVDEV_BTN_GEAR_UP: case EVDEV_BTN_WHEEL ... EVDEV_BTN_GEAR_UP:
@ -550,12 +550,10 @@ evdev_frame_append(struct evdev_frame *frame,
size_t nevents) size_t nevents)
{ {
assert(nevents > 0); assert(nevents > 0);
int syn_report_value = 0;
for (size_t i = 0; i < nevents; i++) { for (size_t i = 0; i < nevents; i++) {
if (evdev_usage_eq(events[i].usage, EVDEV_SYN_REPORT)) { if (evdev_usage_eq(events[i].usage, EVDEV_SYN_REPORT)) {
nevents = i; nevents = i;
syn_report_value = events[i].value;
break; break;
} }
} }
@ -570,24 +568,14 @@ evdev_frame_append(struct evdev_frame *frame,
frame->count += nevents; 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; return 0;
} }
static inline int static inline int
evdev_frame_append_one(struct evdev_frame *frame, evdev_usage_t usage, int32_t value) 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; return 0;
}
if (frame->count >= frame->max_size) if (frame->count >= frame->max_size)
return -ENOMEM; return -ENOMEM;

View file

@ -585,28 +585,8 @@ tp_gesture_handle_event_on_state_none(struct tp_dispatch *tp,
static void static void
tp_gesture_set_3fg_drag_3fg_or_swipe_timer(struct tp_dispatch *tp, usec_t time) tp_gesture_set_3fg_drag_3fg_or_swipe_timer(struct tp_dispatch *tp, usec_t time)
{ {
usec_t expire = usec_add(tp->gesture.initial_time, DRAG_3FG_OR_SWIPE_TIMEOUT); libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer,
usec_add(time, DRAG_3FG_OR_SWIPE_TIMEOUT));
/* This is a hack to avoid the state machine getting even more complicated.
* For a slow drag/fast swipe we want the time from the *initial* touch point,
* not the time from when we realised the fingers are moving. IOW
* putting 3fg down, resting for 80ms and then moving fast must trigger
* a drag, not a swipe.
*
* In theory we should set the timer in the NONE/UNKNOWN states but that would
* require a whole parallel set of states like
* NONE_BUT_TIMEOUT_FOR_FAST_STATE_EXPIRED. Let's not do that, instead we set a
* negative timer and let the normal state proceed. Either we moved by the
* threshold already (in which case we shouldn't ever get here anyway) or
* we didn't in which case the neg timer will do the right thing too when it
* fires.
*/
if (usec_cmp(expire, time) < 0)
libinput_timer_set_flags(&tp->gesture.drag_3fg_or_swipe_timer,
expire,
TIMER_FLAG_ALLOW_NEGATIVE);
else
libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer, expire);
} }
static void static void

View file

@ -178,13 +178,6 @@ tp_tap_clear_timer(struct tp_dispatch *tp)
libinput_timer_cancel(&tp->tap.timer); libinput_timer_cancel(&tp->tap.timer);
} }
static bool
tp_touch_near_any_edge(struct tp_dispatch *tp, struct tp_touch *t)
{
return (t->point.x < tp->tap.edges.left || t->point.x > tp->tap.edges.right ||
t->point.y < tp->tap.edges.top || t->point.y > tp->tap.edges.bottom);
}
static void static void
tp_tap_move_to_dead(struct tp_dispatch *tp, struct tp_touch *t) tp_tap_move_to_dead(struct tp_dispatch *tp, struct tp_touch *t)
{ {
@ -819,7 +812,6 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
usec_t time, usec_t time,
int nfingers_tapped) int nfingers_tapped)
{ {
bool at_edge = false;
switch (event) { switch (event) {
case TAP_EVENT_TOUCH: { case TAP_EVENT_TOUCH: {
@ -833,8 +825,7 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
break; break;
} }
case TAP_EVENT_RELEASE: case TAP_EVENT_RELEASE:
if (tp->tap.drag_lock != LIBINPUT_CONFIG_DRAG_LOCK_DISABLED || if (tp->tap.drag_lock != LIBINPUT_CONFIG_DRAG_LOCK_DISABLED) {
(at_edge = tp_touch_near_any_edge(tp, t))) {
enum tp_tap_state dest[3] = { enum tp_tap_state dest[3] = {
TAP_STATE_1FGTAP_DRAGGING_WAIT, TAP_STATE_1FGTAP_DRAGGING_WAIT,
TAP_STATE_2FGTAP_DRAGGING_WAIT, TAP_STATE_2FGTAP_DRAGGING_WAIT,
@ -842,8 +833,7 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
}; };
assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); assert(nfingers_tapped >= 1 && nfingers_tapped <= 3);
tp->tap.state = dest[nfingers_tapped - 1]; tp->tap.state = dest[nfingers_tapped - 1];
if (at_edge || if (tp->tap.drag_lock ==
tp->tap.drag_lock ==
LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_TIMEOUT) LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_TIMEOUT)
tp_tap_set_draglock_timer(tp, time); tp_tap_set_draglock_timer(tp, time);
} else { } else {
@ -1589,20 +1579,6 @@ tp_init_tap(struct tp_dispatch *tp)
tp->tap.drag_enabled = tp_drag_default(tp->device); tp->tap.drag_enabled = tp_drag_default(tp->device);
tp->tap.drag_lock = tp_drag_lock_default(tp->device); tp->tap.drag_lock = tp_drag_lock_default(tp->device);
struct evdev_device *device = tp->device;
const struct input_absinfo *absx = device->abs.absinfo_x;
const struct input_absinfo *absy = device->abs.absinfo_y;
assert(absx && absy);
struct phys_coords mm = { 5.0, 5.0 };
struct device_coords edge_margin = evdev_device_mm_to_units(device, &mm);
tp->tap.edges.left = edge_margin.x;
tp->tap.edges.right = (absx->maximum - edge_margin.x + absx->minimum);
tp->tap.edges.top = edge_margin.y;
tp->tap.edges.bottom = (absy->maximum - edge_margin.y + absy->minimum);
snprintf(timer_name, snprintf(timer_name,
sizeof(timer_name), sizeof(timer_name),
"%s tap", "%s tap",

View file

@ -333,7 +333,7 @@ tp_new_touch(struct tp_dispatch *tp, struct tp_touch *t, usec_t time)
again. That's a kernel bug, so let's complain. */ again. That's a kernel bug, so let's complain. */
if (t->state == TOUCH_MAYBE_END) { if (t->state == TOUCH_MAYBE_END) {
evdev_log_bug_kernel(tp->device, evdev_log_bug_kernel(tp->device,
"touch %d ended and began in same frame.\n", "touch %d ended and began in in same frame.\n",
t->index); t->index);
tp->nfingers_down++; tp->nfingers_down++;
t->state = TOUCH_UPDATE; t->state = TOUCH_UPDATE;
@ -1335,7 +1335,7 @@ tp_position_fake_touches(struct tp_dispatch *tp)
return; return;
/* We have at least one fake touch down. Find the top-most real /* We have at least one fake touch down. Find the top-most real
* touch and copy its coordinates over to all fake touches. * touch and copy its coordinates over to to all fake touches.
* This is more reliable than just taking the first touch. * This is more reliable than just taking the first touch.
*/ */
for (i = 0; i < tp->num_slots; i++) { for (i = 0; i < tp->num_slots; i++) {
@ -2678,22 +2678,6 @@ evdev_tag_touchpad(struct evdev_device *device, struct udev_device *udev_device)
int bustype, vendor; int bustype, vendor;
const char *prop; 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, prop = udev_device_get_property_value(udev_device,
"ID_INPUT_TOUCHPAD_INTEGRATION"); "ID_INPUT_TOUCHPAD_INTEGRATION");
if (prop) { if (prop) {

View file

@ -450,11 +450,6 @@ struct tp_dispatch {
unsigned int nfingers_down; /* number of fingers down for tapping (excl. unsigned int nfingers_down; /* number of fingers down for tapping (excl.
thumb/palm) */ thumb/palm) */
/* Edges for auto drag-lock, in device coordinates */
struct {
int left, right, top, bottom;
} edges;
} tap; } tap;
struct { struct {

View file

@ -237,11 +237,14 @@ pad_led_group_add_toggle_button(struct pad_led_group *group,
return 0; return 0;
} }
static inline char * static inline bool
pad_led_get_sysfs_base_path(struct evdev_device *device) pad_led_get_sysfs_base_path(struct evdev_device *device,
char *path_out,
size_t path_out_sz)
{ {
struct udev_device *parent, *udev_device; struct udev_device *parent, *udev_device;
const char *test_path; const char *test_path;
int rc;
udev_device = device->udev_device; udev_device = device->udev_device;
@ -250,18 +253,24 @@ pad_led_get_sysfs_base_path(struct evdev_device *device)
test_path = test_path =
udev_device_get_property_value(udev_device, udev_device_get_property_value(udev_device,
"LIBINPUT_TEST_TABLET_PAD_SYSFS_PATH"); "LIBINPUT_TEST_TABLET_PAD_SYSFS_PATH");
if (test_path) if (test_path) {
return safe_strdup(test_path); rc = snprintf(path_out, path_out_sz, "%s", test_path);
return rc != -1;
}
parent = udev_device_get_parent_with_subsystem_devtype(udev_device, parent = udev_device_get_parent_with_subsystem_devtype(udev_device,
"input", "input",
NULL); NULL);
if (!parent) if (!parent)
return NULL; return false;
return strdup_printf("%s/%s::wacom-", rc = snprintf(path_out,
path_out_sz,
"%s/%s::wacom-",
udev_device_get_syspath(parent), udev_device_get_syspath(parent),
udev_device_get_sysname(parent)); udev_device_get_sysname(parent));
return rc != -1;
} }
static int static int
@ -279,12 +288,11 @@ pad_add_mode_group(struct pad_dispatch *pad,
struct libinput *li = pad_libinput_context(pad); struct libinput *li = pad_libinput_context(pad);
struct pad_led_group *group = NULL; struct pad_led_group *group = NULL;
int rc = -ENOMEM; int rc = -ENOMEM;
_autofree_ char *syspath; char syspath[PATH_MAX];
/* syspath is /sys/class/leds/input1234/input12345::wacom-" and /* syspath is /sys/class/leds/input1234/input12345::wacom-" and
only needs the group + mode appended */ only needs the group + mode appended */
syspath = pad_led_get_sysfs_base_path(device); if (!pad_led_get_sysfs_base_path(device, syspath, sizeof(syspath)))
if (!syspath)
return -ENOMEM; return -ENOMEM;
group = pad_group_new(pad, group_index, nmodes); group = pad_group_new(pad, group_index, nmodes);

View file

@ -178,7 +178,7 @@ tablet_filter_axis_fuzz(const struct tablet_dispatch *tablet,
fuzz = libevdev_get_abs_fuzz(device->evdev, evdev_usage_code(e->usage)); fuzz = libevdev_get_abs_fuzz(device->evdev, evdev_usage_code(e->usage));
/* ABS_DISTANCE doesn't have fuzz set and causes continuous /* ABS_DISTANCE doesn't have have fuzz set and causes continuous
* updates for the cursor/lens tools. Add a minimum fuzz of 2, same * updates for the cursor/lens tools. Add a minimum fuzz of 2, same
* as the xf86-input-wacom driver * as the xf86-input-wacom driver
*/ */
@ -1311,6 +1311,18 @@ eraser_button_get_default_mode(struct libinput_tablet_tool *tool)
static enum libinput_config_status static enum libinput_config_status
eraser_button_set_button(struct libinput_tablet_tool *tool, uint32_t button) 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; tool->eraser_button.want_button = button;
eraser_button_toggle(tool); eraser_button_toggle(tool);
@ -1866,24 +1878,38 @@ tablet_calculate_arbitration_rect(struct tablet_dispatch *tablet)
{ {
struct evdev_device *device = tablet->device; struct evdev_device *device = tablet->device;
struct phys_rect r = { 0 }; struct phys_rect r = { 0 };
const double maxdim = 600; /* 600mm covers all the way to the right/bottom */ struct phys_coords mm;
struct phys_coords mm = evdev_device_units_to_mm(device, &tablet->axes.point); mm = evdev_device_units_to_mm(device, &tablet->axes.point);
/* The rect we disable is 20mm left of the tip, covering that whole side of the /* The rect we disable is 20mm left of the tip, 100mm north of the
* tablet. If the stylus is tilted left (tip further right than the eraser end) * tip, and 200x250mm large.
* assume left-handed mode. * If the stylus is tilted left (tip further right than the eraser
* end) assume left-handed mode.
*
* Obviously if we'd run out of the boundaries, we clip the rect
* accordingly.
*/ */
if (tablet->axes.tilt.x > 0) { if (tablet->axes.tilt.x > 0) {
r.x = mm.x - 20; r.x = mm.x - 20;
r.w = maxdim; r.w = 200;
} else { } else {
r.x = 0; r.x = mm.x + 20;
r.w = mm.x + 20; r.w = 200;
r.x -= r.w;
} }
if (r.x < 0) {
r.w += r.x;
r.x = 0;
}
r.y = mm.y - 100;
r.h = 250;
if (r.y < 0) {
r.h += r.y;
r.y = 0; r.y = 0;
r.h = maxdim; }
return r; return r;
} }
@ -2451,7 +2477,7 @@ tablet_setup_touch_arbitration(struct evdev_device *device,
struct libinput_device_group *group2 = struct libinput_device_group *group2 =
libinput_device_get_device_group(&new_device->base); libinput_device_get_device_group(&new_device->base);
/* same physical device? -> better, otherwise keep the one we have */ /* same phsical device? -> better, otherwise keep the one we have */
if (group1 != group2) if (group1 != group2)
return; return;

View file

@ -54,7 +54,6 @@
#define DEFAULT_WHEEL_CLICK_ANGLE 15 #define DEFAULT_WHEEL_CLICK_ANGLE 15
#define DEFAULT_BUTTON_SCROLL_TIMEOUT usec_from_millis(200) #define DEFAULT_BUTTON_SCROLL_TIMEOUT usec_from_millis(200)
#define SCROLL_BUTTON_LOCK_GRACE_TIMEOUT usec_from_millis(500)
enum evdev_device_udev_tags { enum evdev_device_udev_tags {
EVDEV_UDEV_TAG_NONE = 0, EVDEV_UDEV_TAG_NONE = 0,
@ -229,15 +228,6 @@ evdev_button_scroll_button(struct evdev_device *device, usec_t time, int is_pres
break; /* handle event */ break; /* handle event */
case BUTTONSCROLL_LOCK_FIRSTDOWN: case BUTTONSCROLL_LOCK_FIRSTDOWN:
assert(!is_press); 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; device->scroll.lock_state = BUTTONSCROLL_LOCK_FIRSTUP;
evdev_log_debug(device, "scroll lock: first up\n"); evdev_log_debug(device, "scroll lock: first up\n");
return; /* filter release event */ return; /* filter release event */
@ -499,7 +489,6 @@ static void
evdev_tag_trackpoint(struct evdev_device *device, struct udev_device *udev_device) evdev_tag_trackpoint(struct evdev_device *device, struct udev_device *udev_device)
{ {
char *prop; char *prop;
const char *udev_prop;
if (!libevdev_has_property(device->evdev, INPUT_PROP_POINTING_STICK) && if (!libevdev_has_property(device->evdev, INPUT_PROP_POINTING_STICK) &&
!parse_udev_flag(device, udev_device, "ID_INPUT_POINTINGSTICK")) !parse_udev_flag(device, udev_device, "ID_INPUT_POINTINGSTICK"))
@ -507,22 +496,10 @@ evdev_tag_trackpoint(struct evdev_device *device, struct udev_device *udev_devic
device->tags |= EVDEV_TAG_TRACKPOINT; 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); _unref_(quirks) *q = libinput_device_get_quirks(&device->base);
if (q && quirks_get_string(q, QUIRK_ATTR_TRACKPOINT_INTEGRATION, &prop)) { if (q && quirks_get_string(q, QUIRK_ATTR_TRACKPOINT_INTEGRATION, &prop)) {
if (streq(prop, "internal")) { if (streq(prop, "internal")) {
device->tags &= ~EVDEV_TAG_EXTERNAL_MOUSE; /* noop, this is the default anyway */
} else if (streq(prop, "external")) { } else if (streq(prop, "external")) {
device->tags |= EVDEV_TAG_EXTERNAL_MOUSE; device->tags |= EVDEV_TAG_EXTERNAL_MOUSE;
evdev_log_info(device, "is an external pointing stick\n"); evdev_log_info(device, "is an external pointing stick\n");
@ -550,7 +527,6 @@ static void
evdev_tag_keyboard(struct evdev_device *device, struct udev_device *udev_device) evdev_tag_keyboard(struct evdev_device *device, struct udev_device *udev_device)
{ {
char *prop; char *prop;
const char *udev_prop;
int code; int code;
if (!libevdev_has_event_type(device->evdev, EV_KEY)) if (!libevdev_has_event_type(device->evdev, EV_KEY))
@ -561,18 +537,6 @@ evdev_tag_keyboard(struct evdev_device *device, struct udev_device *udev_device)
return; 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); _unref_(quirks) *q = libinput_device_get_quirks(&device->base);
if (q && quirks_get_string(q, QUIRK_ATTR_KEYBOARD_INTEGRATION, &prop)) { if (q && quirks_get_string(q, QUIRK_ATTR_KEYBOARD_INTEGRATION, &prop)) {
if (streq(prop, "internal")) { if (streq(prop, "internal")) {
@ -1361,7 +1325,7 @@ evdev_read_wheel_click_count_prop(struct evdev_device *device,
evdev_log_error(device, evdev_log_error(device,
"mouse wheel click count is present but invalid, " "mouse wheel click count is present but invalid, "
"using %d degrees for angle instead\n", "using %d degrees for angle instead instead\n",
DEFAULT_WHEEL_CLICK_ANGLE); DEFAULT_WHEEL_CLICK_ANGLE);
*angle = DEFAULT_WHEEL_CLICK_ANGLE; *angle = DEFAULT_WHEEL_CLICK_ANGLE;
@ -1810,9 +1774,9 @@ evdev_disable_accelerometer_axes(struct evdev_device *device)
libevdev_disable_event_code(evdev, EV_ABS, ABS_Y); libevdev_disable_event_code(evdev, EV_ABS, ABS_Y);
libevdev_disable_event_code(evdev, EV_ABS, ABS_Z); libevdev_disable_event_code(evdev, EV_ABS, ABS_Z);
libevdev_disable_event_code(evdev, EV_REL, REL_X); libevdev_disable_event_code(evdev, EV_ABS, REL_X);
libevdev_disable_event_code(evdev, EV_REL, REL_Y); libevdev_disable_event_code(evdev, EV_ABS, REL_Y);
libevdev_disable_event_code(evdev, EV_REL, REL_Z); libevdev_disable_event_code(evdev, EV_ABS, REL_Z);
} }
static bool static bool

View file

@ -562,12 +562,6 @@ libinputplugin_unregister(lua_State *L)
return luaL_error(L, "@@unregistering@@"); return luaL_error(L, "@@unregistering@@");
} }
static int
readonly_newindex(lua_State *L)
{
return luaL_error(L, "attempt to modify a read-only table");
}
static int static int
libinputplugin_gc(lua_State *L) libinputplugin_gc(lua_State *L)
{ {
@ -679,28 +673,7 @@ libinputplugin_log_error(lua_State *L)
return libinputplugin_log(L, LIBINPUT_LOG_PRIORITY_ERROR); return libinputplugin_log(L, LIBINPUT_LOG_PRIORITY_ERROR);
} }
static void static const struct luaL_Reg libinputplugin_vtable[] = {
setup_vfuncs(lua_State *L,
const char *metatable_name,
const struct luaL_Reg *vfuncs,
const struct luaL_Reg *public_methods)
{
luaL_newmetatable(L, metatable_name);
luaL_setfuncs(L, vfuncs, 0);
lua_newtable(L);
luaL_setfuncs(L, public_methods, 0);
lua_setfield(L, -2, "__index");
/* set metatable.__metatable = false to prevent a script from getmetatable(),
which is blocked anyway but safe and sorry and whatnot */
lua_pushboolean(L, 0);
lua_setfield(L, -2, "__metatable");
lua_pop(L, 1);
}
static const struct luaL_Reg libinputplugin_methods[] = {
{ "now", libinputplugin_now }, { "now", libinputplugin_now },
{ "version", libinputplugin_version }, { "version", libinputplugin_version },
{ "connect", libinputplugin_connect }, { "connect", libinputplugin_connect },
@ -712,18 +685,18 @@ static const struct luaL_Reg libinputplugin_methods[] = {
{ "log_debug", libinputplugin_log_debug }, { "log_debug", libinputplugin_log_debug },
{ "log_info", libinputplugin_log_info }, { "log_info", libinputplugin_log_info },
{ "log_error", libinputplugin_log_error }, { "log_error", libinputplugin_log_error },
{ "__gc", libinputplugin_gc },
{ NULL, NULL } { NULL, NULL }
}; };
static const struct luaL_Reg libinputplugin_meta[] = { { "__gc", libinputplugin_gc },
{ "__newindex",
readonly_newindex },
{ NULL, NULL } };
static void static void
libinputplugin_init(lua_State *L) libinputplugin_init(lua_State *L)
{ {
setup_vfuncs(L, PLUGIN_METATABLE, libinputplugin_meta, libinputplugin_methods); luaL_newmetatable(L, PLUGIN_METATABLE);
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); /* push metatable */
lua_settable(L, -3); /* metatable.__index = metatable */
luaL_setfuncs(L, libinputplugin_vtable, 0);
} }
static int static int
@ -1100,7 +1073,7 @@ evdevdevice_gc(lua_State *L)
return 0; return 0;
} }
static const struct luaL_Reg evdevdevice_methods[] = { static const struct luaL_Reg evdevdevice_vtable[] = {
{ "info", evdevdevice_info }, { "info", evdevdevice_info },
{ "name", evdevdevice_name }, { "name", evdevdevice_name },
{ "usages", evdevdevice_usages }, { "usages", evdevdevice_usages },
@ -1114,17 +1087,18 @@ static const struct luaL_Reg evdevdevice_methods[] = {
{ "prepend_frame", evdevdevice_prepend_frame }, { "prepend_frame", evdevdevice_prepend_frame },
{ "append_frame", evdevdevice_append_frame }, { "append_frame", evdevdevice_append_frame },
{ "disable_feature", evdevdevice_disable_feature }, { "disable_feature", evdevdevice_disable_feature },
{ "__gc", evdevdevice_gc },
{ NULL, NULL } { NULL, NULL }
}; };
static const struct luaL_Reg evdevdevice_meta[] = { { "__gc", evdevdevice_gc },
{ "__newindex", readonly_newindex },
{ NULL, NULL } };
static void static void
evdevdevice_init(lua_State *L) evdevdevice_init(lua_State *L)
{ {
setup_vfuncs(L, EVDEV_DEVICE_METATABLE, evdevdevice_meta, evdevdevice_methods); luaL_newmetatable(L, EVDEV_DEVICE_METATABLE);
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); /* push metatable */
lua_settable(L, -3); /* metatable.__index = metatable */
luaL_setfuncs(L, evdevdevice_vtable, 0);
} }
static void static void
@ -1362,7 +1336,7 @@ libinput_lua_plugin_new_from_path(struct libinput *libinput, const char *path)
return NULL; return NULL;
} }
int ret = luaL_loadfilex(L, path, "t"); int ret = luaL_loadfile(L, path);
if (ret == LUA_OK) { if (ret == LUA_OK) {
plugin->L = steal(&L); plugin->L = steal(&L);

View file

@ -726,9 +726,6 @@ plugin_has_mask(struct libinput_plugin *plugin, struct evdev_frame *frame)
size_t nevents; size_t nevents;
struct evdev_event *events = evdev_frame_get_events(frame, &nevents); struct evdev_event *events = evdev_frame_get_events(frame, &nevents);
if (nevents == 0)
return false;
/* nevents - 1 because we don't check the SYN_REPORT */ /* nevents - 1 because we don't check the SYN_REPORT */
for (size_t i = 0; i < nevents - 1; i++) { for (size_t i = 0; i < nevents - 1; i++) {
struct evdev_event *e = &events[i]; struct evdev_event *e = &events[i];

View file

@ -230,7 +230,7 @@ libinput_plugin_enable_evdev_usage(struct libinput_plugin *plugin,
* for P3 the injected event I is received before E. * for P3 the injected event I is received before E.
* *
* An example for event injection being harmful: * An example for event injection being harmful:
* A plugin may monitor tablet proximity state and prepend * A plugin may monitor tablet proximity state and prepent
* proximity-in events if the tablet does not send proximity-in * proximity-in events if the tablet does not send proximity-in
* events. This plugin stops monitoring events once it sees correct * events. This plugin stops monitoring events once it sees correct
* proximity-in events. * proximity-in events.
@ -279,7 +279,7 @@ libinput_plugin_inject_evdev_frame(struct libinput_plugin *libinput,
* *
* If called within a plugin's timer callback, any frames generated by * If called within a plugin's timer callback, any frames generated by
* the plugin will only be seen by plugins after this plugin. These * the plugin will only be seen by plugins after this plugin. These
* frames will be processed in the usual evdev_frame() callback and there * frames will be processed in the usual evdev_fame() callback and there
* is no indication that the events were queued from within a timer * is no indication that the events were queued from within a timer
* callback. Using the above example: * callback. Using the above example:
* *

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

View file

@ -348,7 +348,7 @@ enum libinput_tablet_pad_strip_axis_source {
* LIBINPUT_TABLET_TOOL_TYPE_PEN. * LIBINPUT_TABLET_TOOL_TYPE_PEN.
* Use libinput_tablet_tool_get_tool_id() to get a specific model where applicable. * Use libinput_tablet_tool_get_tool_id() to get a specific model where applicable.
* *
* Note that on some devices, the eraser tool is on the tail end of a pen * Note that on some device, the eraser tool is on the tail end of a pen
* device. On other devices, e.g. MS Surface 3, the eraser is the pen tip * device. On other devices, e.g. MS Surface 3, the eraser is the pen tip
* while a button is held down. * while a button is held down.
* *
@ -828,7 +828,7 @@ enum libinput_event_type {
LIBINPUT_EVENT_POINTER_AXIS, LIBINPUT_EVENT_POINTER_AXIS,
/** /**
* A scroll event from a wheel. This event is sent **in * A scroll event from a wheel. This event is sent is sent **in
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS * addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
* event for all events with a * event for all events with a
* libinput_event_pointer_get_axis_source() of @ref * libinput_event_pointer_get_axis_source() of @ref
@ -843,7 +843,7 @@ enum libinput_event_type {
/** /**
* A scroll event caused by the movement of one or more fingers on a * A scroll event caused by the movement of one or more fingers on a
* device. This event is sent **in addition** to the @ref * device. This event is sent is sent **in addition** to the @ref
* LIBINPUT_EVENT_POINTER_AXIS event for all events with a * LIBINPUT_EVENT_POINTER_AXIS event for all events with a
* libinput_event_pointer_get_axis_source() of @ref * libinput_event_pointer_get_axis_source() of @ref
* LIBINPUT_POINTER_AXIS_SOURCE_FINGER. Ignore @ref * LIBINPUT_POINTER_AXIS_SOURCE_FINGER. Ignore @ref
@ -857,7 +857,7 @@ enum libinput_event_type {
/** /**
* A scroll event from a continuous scroll source, e.g. button * A scroll event from a continuous scroll source, e.g. button
* scrolling. This event is sent **in * scrolling. This event is sent is sent **in
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS * addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
* event for all events with a * event for all events with a
* libinput_event_pointer_get_axis_source() of @ref * libinput_event_pointer_get_axis_source() of @ref
@ -1932,7 +1932,7 @@ libinput_event_touch_get_base_event(struct libinput_event_touch *event);
* *
* Gesture events are generated when a gesture is recognized on a touchpad. * Gesture events are generated when a gesture is recognized on a touchpad.
* *
* Gesture sequences always start with a LIBINPUT_EVENT_GESTURE_FOO_BEGIN * Gesture sequences always start with a LIBINPUT_EVENT_GESTURE_FOO_START
* event. All following gesture events will be of the * event. All following gesture events will be of the
* LIBINPUT_EVENT_GESTURE_FOO_UPDATE type until a * LIBINPUT_EVENT_GESTURE_FOO_UPDATE type until a
* LIBINPUT_EVENT_GESTURE_FOO_END is generated which signals the end of the * LIBINPUT_EVENT_GESTURE_FOO_END is generated which signals the end of the
@ -1994,14 +1994,12 @@ libinput_event_gesture_get_finger_count(struct libinput_event_gesture *event);
* *
* Return if the gesture ended normally, or if it was cancelled. * Return if the gesture ended normally, or if it was cancelled.
* For gesture events that are not of type * For gesture events that are not of type
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END, * @ref LIBINPUT_EVENT_GESTURE_SWIPE_END or
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END, or * @ref LIBINPUT_EVENT_GESTURE_PINCH_END, this function returns 0.
* @ref LIBINPUT_EVENT_GESTURE_HOLD_END, this function returns 0.
* *
* @note It is an application bug to call this function for events other than * @note It is an application bug to call this function for events other than
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END, * @ref LIBINPUT_EVENT_GESTURE_SWIPE_END or
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END, or * @ref LIBINPUT_EVENT_GESTURE_PINCH_END.
* @ref LIBINPUT_EVENT_GESTURE_HOLD_END.
* *
* @return 0 or 1, with 1 indicating that the gesture was cancelled. * @return 0 or 1, with 1 indicating that the gesture was cancelled.
*/ */
@ -2425,7 +2423,7 @@ libinput_event_tablet_tool_wheel_has_changed(struct libinput_event_tablet_tool *
* width of the device. See the libinput documentation for more details. * width of the device. See the libinput documentation for more details.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2448,7 +2446,7 @@ libinput_event_tablet_tool_get_x(struct libinput_event_tablet_tool *event);
* width of the device. See the libinput documentation for more details. * width of the device. See the libinput documentation for more details.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2502,7 +2500,7 @@ libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool *event);
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2518,7 +2516,7 @@ libinput_event_tablet_tool_get_pressure(struct libinput_event_tablet_tool *event
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2558,7 +2556,7 @@ libinput_event_tablet_tool_get_tilt_x(struct libinput_event_tablet_tool *event);
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis in degrees * @return The current value of the the axis in degrees
* *
* @since 1.2 * @since 1.2
*/ */
@ -2580,7 +2578,7 @@ libinput_event_tablet_tool_get_tilt_y(struct libinput_event_tablet_tool *event);
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2598,7 +2596,7 @@ libinput_event_tablet_tool_get_rotation(struct libinput_event_tablet_tool *event
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
* @return The current value of the axis * @return The current value of the the axis
* *
* @since 1.2 * @since 1.2
*/ */
@ -2632,7 +2630,7 @@ libinput_event_tablet_tool_get_size_major(struct libinput_event_tablet_tool *eve
* rotation must be taken into account. * rotation must be taken into account.
* *
* Where no rotation is available on a tool, or where rotation is zero, the * Where no rotation is available on a tool, or where rotation is zero, the
* major axis aligns with the y axis and the minor axis with the x axis. * minor axis aligns with the y axis and the minor axis with the x axis.
* *
* If this axis does not exist on the current tool, this function returns 0. * If this axis does not exist on the current tool, this function returns 0.
* *
@ -2825,10 +2823,10 @@ libinput_event_tablet_tool_get_button_state(struct libinput_event_tablet_tool *e
* @ingroup event_tablet * @ingroup event_tablet
* *
* For the button of a @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON event, return the total * For the button of a @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON event, return the total
* number of buttons pressed on all devices on the associated seat after * number of buttons pressed on all devices on the associated seat after the
* the event was triggered. * the event was triggered.
* *
* @note It is an application bug to call this function for events other than " @note It is an application bug to call this function for events other than
* @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON. For other events, this function returns 0. * @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON. For other events, this function returns 0.
* *
* @param event The libinput tablet tool event * @param event The libinput tablet tool event
@ -3207,7 +3205,7 @@ libinput_event_tablet_pad_get_base_event(struct libinput_event_tablet_pad *event
* returns 0. * returns 0.
* *
* @param event The libinput tablet pad event * @param event The libinput tablet pad event
* @return The current value of the axis * @return The current value of the the axis
* @retval -1 The finger was lifted * @retval -1 The finger was lifted
* *
* @since 1.3 * @since 1.3
@ -3261,8 +3259,8 @@ libinput_event_tablet_pad_get_ring_source(struct libinput_event_tablet_pad *even
* logical orientation. * logical orientation.
* *
* If the source is @ref LIBINPUT_TABLET_PAD_STRIP_SOURCE_FINGER, * If the source is @ref LIBINPUT_TABLET_PAD_STRIP_SOURCE_FINGER,
* libinput sends a terminating event with a strip value of -1 when the * libinput sends a terminating event with a ring value of -1 when the
* finger is lifted from the strip. A caller may use this information to e.g. * finger is lifted from the ring. A caller may use this information to e.g.
* determine if kinetic scrolling should be triggered. * determine if kinetic scrolling should be triggered.
* *
* @note It is an application bug to call this function for events other than * @note It is an application bug to call this function for events other than
@ -3270,7 +3268,7 @@ libinput_event_tablet_pad_get_ring_source(struct libinput_event_tablet_pad *even
* returns 0. * returns 0.
* *
* @param event The libinput tablet pad event * @param event The libinput tablet pad event
* @return The current value of the axis * @return The current value of the the axis
* @retval -1 The finger was lifted * @retval -1 The finger was lifted
* *
* @since 1.3 * @since 1.3
@ -3406,7 +3404,7 @@ libinput_event_tablet_pad_get_key_state(struct libinput_event_tablet_pad *event)
* returns 0. * returns 0.
* *
* @param event The libinput tablet pad event * @param event The libinput tablet pad event
* @return The delta of the axis * @return The delta of the the axis
* *
* @since 1.26 * @since 1.26
*/ */
@ -3531,7 +3529,7 @@ libinput_event_tablet_pad_get_time_usec(struct libinput_event_tablet_pad *event)
* @ingroup event_switch * @ingroup event_switch
* *
* Return the switch that triggered this event. * Return the switch that triggered this event.
* For switch events that are not of type @ref * For pointer events that are not of type @ref
* LIBINPUT_EVENT_SWITCH_TOGGLE, this function returns 0. * LIBINPUT_EVENT_SWITCH_TOGGLE, this function returns 0.
* *
* @note It is an application bug to call this function for events other than * @note It is an application bug to call this function for events other than
@ -3667,7 +3665,7 @@ libinput_udev_create_context(const struct libinput_interface *interface,
* available on this seat, or if devices are available but fail to open in * available on this seat, or if devices are available but fail to open in
* @ref libinput_interface::open_restricted. Devices that do not have the * @ref libinput_interface::open_restricted. Devices that do not have the
* minimum capabilities to be recognized as pointer, keyboard or touch * minimum capabilities to be recognized as pointer, keyboard or touch
* device are ignored. Such devices and those that failed to open are * device are ignored. Such devices and those that failed to open
* ignored until the next call to libinput_resume(). * ignored until the next call to libinput_resume().
* *
* This function may only be called once per context. * This function may only be called once per context.
@ -3764,7 +3762,7 @@ libinput_path_remove_device(struct libinput_device *device);
* Paths are not traversed recursively. * Paths are not traversed recursively.
* *
* Plugins that have a 0 byte size shadow any plugins with the same name * Plugins that have a 0 byte size shadow any plugins with the same name
* but do not provide any functionality. This allows disabling a plugin * but do not provide any fuctionality. This allows disabling a plugin
* by simply dropping an empty file in a higher-priority directory. * by simply dropping an empty file in a higher-priority directory.
* *
* This function must be called before libinput_plugin_system_load_plugins(). * This function must be called before libinput_plugin_system_load_plugins().
@ -5840,7 +5838,7 @@ libinput_device_config_accel_apply(struct libinput_device *device,
* types (e.g. scrolling) may be added in the future. * types (e.g. scrolling) may be added in the future.
* *
* The special type @ref LIBINPUT_ACCEL_TYPE_FALLBACK specifies the acceleration * The special type @ref LIBINPUT_ACCEL_TYPE_FALLBACK specifies the acceleration
* function to be used for any movement produced by the device that does not * function to be moved for any movement produced by the device that does not
* have a specific acceleration type defined. * have a specific acceleration type defined.
* *
* Use to specify the acceleration function type in * Use to specify the acceleration function type in
@ -5881,7 +5879,7 @@ enum libinput_config_accel_type {
* *
* Each custom acceleration function is defined by ``n`` points spaced uniformly * Each custom acceleration function is defined by ``n`` points spaced uniformly
* along the x-axis starting from 0 and continuing in a constant step size. * along the x-axis starting from 0 and continuing in a constant step size.
* Thereby the function is defined by the following points: * There by the function is defined by the following points:
* (0 * step, f[0]), (1 * step, f[1]), ..., ((n - 1) * step, f[n - 1]). * (0 * step, f[0]), (1 * step, f[1]), ..., ((n - 1) * step, f[n - 1]).
* The x-axis represents the device-speed in device units per millisecond. * The x-axis represents the device-speed in device units per millisecond.
* The y-axis represents the pointer-speed. * The y-axis represents the pointer-speed.
@ -6626,9 +6624,7 @@ enum libinput_config_scroll_button_lock_state {
* If the state is * If the state is
* @ref LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED, the button is considered * @ref LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED, the button is considered
* logically down after the first press and release sequence, and logically * logically down after the first press and release sequence, and logically
* up after the second press and release sequence. If the button is held * up after the second press and release sequence.
* 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 device The device to configure
* @param state The state to set the scroll button lock to * @param state The state to set the scroll button lock to
@ -7101,7 +7097,7 @@ libinput_device_config_rotation_get_default_angle(struct libinput_device *device
* Check if a tablet tool can have a custom pressure range. * Check if a tablet tool can have a custom pressure range.
* *
* @param tool The libinput tool * @param tool The libinput tool
* @return Non-zero if a device has an adjustable pressure range, zero otherwise. * @return Non-zero if a device has an adjustible pressure range, zero otherwise.
* *
* @see libinput_tablet_tool_config_pressure_range_set * @see libinput_tablet_tool_config_pressure_range_set
* @see libinput_tablet_tool_config_pressure_range_get_minimum * @see libinput_tablet_tool_config_pressure_range_get_minimum
@ -7375,9 +7371,14 @@ libinput_tablet_tool_config_eraser_button_get_default_mode(
* the eraser mode to @ref LIBINPUT_CONFIG_ERASER_BUTTON_BUTTON via * the eraser mode to @ref LIBINPUT_CONFIG_ERASER_BUTTON_BUTTON via
* libinput_tablet_tool_config_eraser_button_set_mode(). * 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 tool The libinput tool
* @param button The button code. Must be a valid button (e.g. BTN_STYLUS) * @param button The button, usually one of BTN_STYLUS, BTN_STYLUS2 or
* excluding fake buttons (e.g. BTN_TOOL_*) and keys (KEY_*) * BTN_STYLUS3
* *
* @return A config status code * @return A config status code
* *

View file

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

View file

@ -65,12 +65,12 @@ backtrace_print(FILE *fp,
child = fork(); child = fork();
if (child == 0) { if (child == 0) {
char pid[16]; char pid[8];
close(pipefd[0]); close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO); dup2(pipefd[1], STDOUT_FILENO);
snprintf(pid, sizeof(pid), "%d", parent); sprintf(pid, "%d", parent);
execlp("gstack", "gstack", pid, NULL); execlp("gstack", "gstack", pid, NULL);
exit(errno); exit(errno);

View file

@ -43,7 +43,7 @@
#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS) #define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
#define NCHARS(x) ((size_t)(((x) + 7) / 8)) #define NCHARS(x) ((size_t)(((x) + 7) / 8))
/* This bitfield helper implementation is taken from libevdev-util.h, /* This bitfield helper implementation is taken from from libevdev-util.h,
* except that it has been modified to work with arrays of unsigned chars * except that it has been modified to work with arrays of unsigned chars
*/ */
@ -260,8 +260,6 @@ _nonnull_(1) static inline void _infmask_ensure_size(infmask_t *mask, unsigned i
size_t required = _infmask_size_for_bit(bit); size_t required = _infmask_size_for_bit(bit);
if (required > mask->nmasks) { if (required > mask->nmasks) {
mask->mask = realloc(mask->mask, required * sizeof(bitmask_t)); mask->mask = realloc(mask->mask, required * sizeof(bitmask_t));
if (!mask->mask)
abort();
/* Zero out the new memory */ /* Zero out the new memory */
for (size_t i = mask->nmasks; i < required; i++) for (size_t i = mask->nmasks; i < required; i++)
mask->mask[i] = bitmask_new(); mask->mask[i] = bitmask_new();

View file

@ -48,8 +48,8 @@ file_destroy(struct file *f)
DEFINE_DESTROY_CLEANUP_FUNC(file); DEFINE_DESTROY_CLEANUP_FUNC(file);
/** /**
* Appends to the given list all files in the given directory that end * Appends to the given list all files files in the given directory that end
* with the given suffix. * with the given with the given suffix.
*/ */
static void static void
filenames(const char *directory, const char *suffix, struct list *list) filenames(const char *directory, const char *suffix, struct list *list)

View file

@ -41,7 +41,7 @@ stringbuf_init(struct stringbuf *b)
{ {
b->len = 0; b->len = 0;
b->sz = 64; b->sz = 64;
b->data = zalloc(b->sz); b->data = calloc(1, b->sz);
} }
static inline bool static inline bool
@ -62,7 +62,7 @@ stringbuf_reset(struct stringbuf *b)
static inline struct stringbuf * static inline struct stringbuf *
stringbuf_new(void) stringbuf_new(void)
{ {
struct stringbuf *b = zalloc(sizeof(*b)); struct stringbuf *b = calloc(1, sizeof(*b));
stringbuf_init(b); stringbuf_init(b);
return b; return b;
} }
@ -121,7 +121,7 @@ stringbuf_ensure_space(struct stringbuf *b, size_t sz)
} }
/** /**
* Append the data from the fd to the string buffer. * Append the the data from the fd to the string buffer.
*/ */
static inline int static inline int
stringbuf_append_from_fd(struct stringbuf *b, int fd, size_t maxlen) stringbuf_append_from_fd(struct stringbuf *b, int fd, size_t maxlen)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -198,8 +198,4 @@ TEST_DEVICE(LITEST_GENERIC_USBCOMBO_KEYBOARD,
.name = "Generic USB KeyTouch Combo", .name = "Generic USB KeyTouch Combo",
.id = &input_id, .id = &input_id,
.events = events, .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, .events = events,
.absinfo = absinfo, .absinfo = absinfo,
.udev_properties = { .udev_properties = {
{ "ID_INTEGRATION", "external" }, { "ID_INPUT_TOUCHPAD_INTEGRATION", "external" },
{ NULL }, { NULL },
}, },
.quirk_file = quirk_file, ) .quirk_file = quirk_file, )

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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