mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-03-25 18:50:47 +01:00
Compare commits
No commits in common. "main" and "1.30.901" have entirely different histories.
171 changed files with 256 additions and 1327 deletions
|
|
@ -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 |
|
|
@ -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>`_.
|
||||||
|
|
|
||||||
|
|
@ -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()"]
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -359,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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -365,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:
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ 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.c``.
|
read the implementation of the hysteresis in ``src/evdev.c``.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
+-------------+------------+---------------+------+
|
+-------------+------------+---------------+------+
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
project('libinput', 'c',
|
project('libinput', 'c',
|
||||||
version : '1.31.0',
|
version : '1.30.901',
|
||||||
license : 'MIT/Expat',
|
license : 'MIT/Expat',
|
||||||
default_options : [ 'c_std=gnu99', 'warning_level=2' ],
|
default_options : [ 'c_std=gnu99', 'warning_level=2' ],
|
||||||
meson_version : '>= 0.64.0')
|
meson_version : '>= 0.64.0')
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
|
|
@ -2,62 +2,9 @@
|
||||||
|
|
||||||
# "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)]
|
[Lenovo Haptic Touchpad (Goodix)]
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x01E7
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5100:00 27C6:01E8 Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:01E8)]
|
|
||||||
MatchBus=i2c
|
MatchBus=i2c
|
||||||
MatchVendor=0x27C6
|
MatchVendor=0x27C6
|
||||||
MatchProduct=0x01E8
|
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
|
|
||||||
|
|
||||||
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5420:00 27C6:0F95 Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:0F95)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x0F95
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
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
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -130,18 +130,13 @@ MatchName=*TPPS/2 Elan TrackPoint*
|
||||||
MatchDMIModalias=dmi:*:svnLENOVO:*:pvrThinkPadX1Carbon6th:*
|
MatchDMIModalias=dmi:*:svnLENOVO:*:pvrThinkPadX1Carbon6th:*
|
||||||
AttrTrackpointMultiplier=0.4
|
AttrTrackpointMultiplier=0.4
|
||||||
|
|
||||||
# Don't disable keys accessible in tablet mode, #106799 comment 7
|
# Lenovo Thinkpad Yoga (not the consumer versions) disables the keyboard
|
||||||
[Lenovo Thinkpad S1 Yoga and S1 Yoga 12]
|
# mechanically. We must not disable the keyboard because some keys are
|
||||||
MatchBus=ps2
|
# still accessible on the screen and volume rocker.
|
||||||
MatchUdevType=keyboard
|
# Initially #103749 and extended by #106799 comment 7
|
||||||
MatchDMIModalias=dmi:*:svnLENOVO:*:pvrThinkPadS1Yoga*:*
|
[Lenovo Thinkpad Yoga]
|
||||||
ModelTabletModeNoSuspend=1
|
MatchName=AT Translated Set 2 keyboard
|
||||||
|
MatchDMIModalias=dmi:*:svnLENOVO:*:pvrThinkPad*Yoga*:*
|
||||||
# Don't disable keys accessible in tablet mode, #103749
|
|
||||||
[Lenovo Thinkpad X1 Yoga 1st]
|
|
||||||
MatchBus=ps2
|
|
||||||
MatchUdevType=keyboard
|
|
||||||
MatchDMIModalias=dmi:*:svnLENOVO:*:pvrThinkPadX1Yoga1st:*
|
|
||||||
ModelTabletModeNoSuspend=1
|
ModelTabletModeNoSuspend=1
|
||||||
|
|
||||||
[Lenovo X1 Yoga Trackpoint 1st gen]
|
[Lenovo X1 Yoga Trackpoint 1st gen]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,9 +833,8 @@ 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 {
|
||||||
tp_tap_notify(tp,
|
tp_tap_notify(tp,
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
@ -2465,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;
|
||||||
|
|
||||||
|
|
|
||||||
46
src/evdev.c
46
src/evdev.c
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
return LIBINPUT_CONFIG_STATUS_INVALID;
|
case BTN_STYLUS2:
|
||||||
|
case BTN_STYLUS3:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!libinput_tablet_tool_has_button(tool, button))
|
||||||
|
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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
@ -730,7 +730,7 @@ enum libinput_switch {
|
||||||
* If the switch is in state @ref LIBINPUT_SWITCH_STATE_OFF, the
|
* If the switch is in state @ref LIBINPUT_SWITCH_STATE_OFF, the
|
||||||
* device is in laptop mode. If the switch is in state @ref
|
* device is in laptop mode. If the switch is in state @ref
|
||||||
* LIBINPUT_SWITCH_STATE_ON, the device is in tablet mode and the
|
* LIBINPUT_SWITCH_STATE_ON, the device is in tablet mode and the
|
||||||
* keyboard or touchpad may not be accessible.
|
* keyboard or touchpad may not be accessible.
|
||||||
*
|
*
|
||||||
* It is up to the caller to identify which devices are inaccessible
|
* It is up to the caller to identify which devices are inaccessible
|
||||||
* in tablet mode.
|
* in tablet mode.
|
||||||
|
|
@ -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
|
||||||
|
|
@ -2423,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2446,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2500,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2516,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2556,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2578,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2596,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -2630,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.
|
||||||
*
|
*
|
||||||
|
|
@ -2823,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
|
||||||
|
|
@ -3205,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
|
||||||
|
|
@ -3259,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
|
||||||
|
|
@ -3268,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
|
||||||
|
|
@ -3404,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
|
||||||
*/
|
*/
|
||||||
|
|
@ -3529,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
|
||||||
|
|
@ -3665,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.
|
||||||
|
|
@ -3762,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().
|
||||||
|
|
@ -5838,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
|
||||||
|
|
@ -5879,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.
|
||||||
|
|
@ -6624,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
|
||||||
|
|
@ -7099,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
|
||||||
|
|
@ -7373,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
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,5 @@ TEST_DEVICE(LITEST_LID_SWITCH,
|
||||||
.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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -88,8 +88,4 @@ TEST_DEVICE(LITEST_KEYBOARD_LOGITECH_MEDIA_KEYBOARD_ELITE,
|
||||||
.name = "Logitech Logitech USB Keyboard Consumer Control",
|
.name = "Logitech Logitech USB Keyboard Consumer Control",
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.events = events,
|
.events = events,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,4 @@ TEST_DEVICE(LITEST_LOGITECH_TRACKBALL,
|
||||||
.name = "Logitech USB Trackball",
|
.name = "Logitech USB Trackball",
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL,
|
||||||
.events = events,
|
.events = events, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,6 @@ TEST_DEVICE(LITEST_MAGIC_TRACKPAD,
|
||||||
.absinfo = absinfo,
|
.absinfo = absinfo,
|
||||||
|
|
||||||
.udev_properties = {
|
.udev_properties = {
|
||||||
{ "ID_INTEGRATION", "external" },
|
{ "ID_INPUT_TOUCHPAD_INTEGRATION", "external" },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,5 @@ TEST_DEVICE(LITEST_MOUSE_LOW_DPI,
|
||||||
.events = events,
|
.events = events,
|
||||||
.udev_properties = {
|
.udev_properties = {
|
||||||
{ "MOUSE_DPI", "400@125" },
|
{ "MOUSE_DPI", "400@125" },
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,4 @@ TEST_DEVICE(LITEST_MOUSE_PS2,
|
||||||
.name = "ImExPS/2 Generic Explorer Mouse",
|
.name = "ImExPS/2 Generic Explorer Mouse",
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL,
|
||||||
.events = events,
|
.events = events, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "internal" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -195,8 +195,4 @@ TEST_DEVICE(LITEST_MOUSE_ROCCAT,
|
||||||
.name = "ROCCAT ROCCAT Kone XTD",
|
.name = "ROCCAT ROCCAT Kone XTD",
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.absinfo = absinfo,
|
.absinfo = absinfo,
|
||||||
.events = events,
|
.events = events, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,4 @@ TEST_DEVICE(LITEST_MOUSE_VIRTUAL,
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.events = events,
|
.events = events,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL,
|
||||||
.quirk_file = quirk_file,
|
.quirk_file = quirk_file, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "internal" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,5 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_CLICK_ANGLE,
|
||||||
.udev_properties = {
|
.udev_properties = {
|
||||||
{ "MOUSE_WHEEL_CLICK_ANGLE", "-7" },
|
{ "MOUSE_WHEEL_CLICK_ANGLE", "-7" },
|
||||||
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
|
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,5 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_CLICK_COUNT,
|
||||||
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
|
{ "MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL", "13" },
|
||||||
{ "MOUSE_WHEEL_CLICK_COUNT", "-14" },
|
{ "MOUSE_WHEEL_CLICK_COUNT", "-14" },
|
||||||
{ "MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL", "27" },
|
{ "MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL", "27" },
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,4 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_HIRES_DISABLED,
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL,
|
||||||
.events = events,
|
.events = events,
|
||||||
.quirk_file = quirk_file,
|
.quirk_file = quirk_file, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,5 @@ TEST_DEVICE(LITEST_MOUSE_WHEEL_TILT,
|
||||||
.udev_properties = {
|
.udev_properties = {
|
||||||
{ "MOUSE_WHEEL_TILT_HORIZONTAL", "1" },
|
{ "MOUSE_WHEEL_TILT_HORIZONTAL", "1" },
|
||||||
{ "MOUSE_WHEEL_TILT_VERTICAL", "1" },
|
{ "MOUSE_WHEEL_TILT_VERTICAL", "1" },
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,4 @@ TEST_DEVICE(LITEST_MOUSE,
|
||||||
.name = "Lenovo Optical USB Mouse",
|
.name = "Lenovo Optical USB Mouse",
|
||||||
.id = &input_id,
|
.id = &input_id,
|
||||||
.absinfo = NULL,
|
.absinfo = NULL,
|
||||||
.events = events,
|
.events = events, )
|
||||||
.udev_properties = {
|
|
||||||
{ "ID_INTEGRATION", "external" },
|
|
||||||
{ NULL },
|
|
||||||
}, )
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue