mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-04-20 22:20:53 +02:00
Compare commits
No commits in common. "main" and "1.31.0" have entirely different histories.
187 changed files with 395 additions and 1668 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 |
|
|
@ -110,7 +110,7 @@ The most common matrices are:
|
||||||
.. math::
|
.. math::
|
||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
-1 & 0 & 1 \\
|
-1 & 0 & 1 \\
|
||||||
0 & 1 & 0 \\
|
1 & 0 & 0 \\
|
||||||
0 & 0 & 1
|
0 & 0 & 1
|
||||||
\end{pmatrix}
|
\end{pmatrix}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ is unfortunately not visibly obvious.
|
||||||
available.
|
available.
|
||||||
|
|
||||||
If fingers are down in the main area in addition to fingers in the
|
If fingers are down in the main area in addition to fingers in the
|
||||||
left or right button area, those fingers are ignored.
|
left or right button area, those fingers are are ignored.
|
||||||
A release event always releases the buttons logically down, regardless of
|
A release event always releases the buttons logically down, regardless of
|
||||||
the current finger position
|
the current finger position
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ The movement of a finger can alter the button area behavior:
|
||||||
- once a finger has moved out of the button area, it cannot move back in and
|
- once a finger has moved out of the button area, it cannot move back in and
|
||||||
trigger a right or middle button event
|
trigger a right or middle button event
|
||||||
- a finger moving within the software button area does not move the pointer
|
- a finger moving within the software button area does not move the pointer
|
||||||
- once a finger moves out of the button area it will control the
|
- once a finger moves out out of the button area it will control the
|
||||||
pointer (this only applies if there is no other finger down on the
|
pointer (this only applies if there is no other finger down on the
|
||||||
touchpad)
|
touchpad)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ for those devices it is expected to be implemented by the toolkit.
|
||||||
Three-finger drag
|
Three-finger drag
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
Three-finger drag emulates the mouse button down while three fingers
|
Three-finger drag allows emulates the mouse button down while three fingers
|
||||||
are down on a touchpad without the need to press a physical button or use
|
are down on a touchpad without the need to press a physical button or use
|
||||||
:ref:`tapndrag`. See :ref:`drag_3fg` for details on how this feature works.
|
:ref:`tapndrag`. See :ref:`drag_3fg` for details on how this feature works.
|
||||||
|
|
||||||
|
|
@ -165,7 +165,7 @@ most touchpads.
|
||||||
Disable while trackpointing
|
Disable while trackpointing
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
DWTP is a form of palm detection for devices that have a trackpoint (like
|
DWTP is a form of palm detecion for devices that have a trackpoint (like
|
||||||
Thinkpads). While the user is using the trackpoint, the touchpad is disabled,
|
Thinkpads). While the user is using the trackpoint, the touchpad is disabled,
|
||||||
being enabled again after a timeout. See :ref:`disable-while-trackpointing` for
|
being enabled again after a timeout. See :ref:`disable-while-trackpointing` for
|
||||||
more info.
|
more info.
|
||||||
|
|
@ -205,8 +205,8 @@ Tablet tool pressure range
|
||||||
|
|
||||||
The pressure range on a :ref:`Tablet tool <tablet-tools>` can be reduced
|
The pressure range on a :ref:`Tablet tool <tablet-tools>` can be reduced
|
||||||
from the full available hardware range to a subset of that range. The effect
|
from the full available hardware range to a subset of that range. The effect
|
||||||
of this is that the tablet will not register pressure until the given
|
of this is that the tablet will not register pressure below the given
|
||||||
threshold is met, and will reach the maximum logical pressure
|
the given threshold is met, and will reach the maximum logical pressure
|
||||||
before the maximum hardware-supported pressure is reached.
|
before the maximum hardware-supported pressure is reached.
|
||||||
|
|
||||||
See :ref:`tablet-pressure-range` for more info.
|
See :ref:`tablet-pressure-range` for more info.
|
||||||
|
|
|
||||||
|
|
@ -144,9 +144,10 @@ This test suite can take test names etc. as arguments, have a look at
|
||||||
:ref:`test-suite` for more info. There are a bunch of other tests that are
|
:ref:`test-suite` for more info. There are a bunch of other tests that are
|
||||||
run by the CI on merge requests, you can run those locally with ::
|
run by the CI on merge requests, you can run those locally with ::
|
||||||
|
|
||||||
$> sudo meson test -C builddir
|
$> sudo ninja -C builddir check
|
||||||
|
|
||||||
So it always pays to run that before submitting.
|
So it always pays to run that before submitting. This will also run the code
|
||||||
|
through valgrind and pick up any memory leaks.
|
||||||
|
|
||||||
.. _contributing_submitting_code:
|
.. _contributing_submitting_code:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ MOUSE_DPI
|
||||||
|
|
||||||
MOUSE_WHEEL_CLICK_ANGLE
|
MOUSE_WHEEL_CLICK_ANGLE
|
||||||
The angle in degrees for each click on a mouse wheel. See
|
The angle in degrees for each click on a mouse wheel. See
|
||||||
**libinput_event_pointer_get_axis_source()** for details.
|
**libinput_pointer_get_axis_source()** for details.
|
||||||
|
|
||||||
|
|
||||||
Below is an example udev rule to assign "seat1" to a device from vendor
|
Below is an example udev rule to assign "seat1" to a device from vendor
|
||||||
|
|
@ -94,7 +94,7 @@ type label does not guarantee that the device is initialized by libinput.
|
||||||
If a device fails to meet the requirements for a device type (e.g. a keyboard
|
If a device fails to meet the requirements for a device type (e.g. a keyboard
|
||||||
labelled as touchpad) the device will not be available through libinput.
|
labelled as touchpad) the device will not be available through libinput.
|
||||||
|
|
||||||
Only one device type should be set per device at a time, though libinput can
|
Only one device type should be set per device at a type, though libinput can
|
||||||
handle some combinations for historical reasons.
|
handle some combinations for historical reasons.
|
||||||
|
|
||||||
Below is an example udev rule to remove an **ID_INPUT_TOUCHPAD** setting
|
Below is an example udev rule to remove an **ID_INPUT_TOUCHPAD** setting
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ the serial bus (PS/2) as internal keyboards: ::
|
||||||
|
|
||||||
[Serial Keyboards]
|
[Serial Keyboards]
|
||||||
MatchUdevType=keyboard
|
MatchUdevType=keyboard
|
||||||
MatchBus=ps2
|
MatchBus=serial
|
||||||
AttrKeyboardIntegration=internal
|
AttrKeyboardIntegration=internal
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -46,7 +46,7 @@ Installing temporary local device quirks
|
||||||
|
|
||||||
The model quirks are part of the source distribution and should never be
|
The model quirks are part of the source distribution and should never be
|
||||||
modified. For temporary local workarounds, libinput reads the
|
modified. For temporary local workarounds, libinput reads the
|
||||||
``/etc/libinput/local-overrides.quirks`` file. Users may add sections to
|
``/etc/libinput/local-overrides.quirks`` file. Users may add a sections to
|
||||||
this file to add a device quirk for a local device but beware that **any
|
this file to add a device quirk for a local device but beware that **any
|
||||||
modification must be upstreamed** or it may cease to work at any time.
|
modification must be upstreamed** or it may cease to work at any time.
|
||||||
|
|
||||||
|
|
@ -130,7 +130,7 @@ Quirks starting with **Model*** triggers implementation-defined behaviour
|
||||||
for this device not needed for any other device. Only the more
|
for this device not needed for any other device. Only the more
|
||||||
general-purpose **Model*** flags are listed here.
|
general-purpose **Model*** flags are listed here.
|
||||||
|
|
||||||
ModelALPSSerialTouchpad, ModelAppleTouchpad, ModelWacomTouchpad, ModelChromebook
|
ModelALPSTouchpad, ModelAppleTouchpad, ModelWacomTouchpad, ModelChromebook
|
||||||
Reserved for touchpads made by the respective vendors
|
Reserved for touchpads made by the respective vendors
|
||||||
ModelTouchpadVisibleMarker
|
ModelTouchpadVisibleMarker
|
||||||
Indicates the touchpad has a drawn-on visible marker between the software
|
Indicates the touchpad has a drawn-on visible marker between the software
|
||||||
|
|
@ -162,9 +162,9 @@ ModelScrollOnMiddleClick
|
||||||
Some mice can generate unwanted high-resolution scroll events when the wheel
|
Some mice can generate unwanted high-resolution scroll events when the wheel
|
||||||
is pressed. Increases the scroll threshold required to start scrolling to
|
is pressed. Increases the scroll threshold required to start scrolling to
|
||||||
avoid accidentally scrolling when middle clicking.
|
avoid accidentally scrolling when middle clicking.
|
||||||
AttrSizeHint=NxM, AttrResolutionHint=NxM
|
AttrSizeHint=NxM, AttrResolutionHint=N
|
||||||
Hints at the width x height of the device in mm, or the resolution
|
Hints at the width x height of the device in mm, or the resolution
|
||||||
of the x and y axes in units/mm. These may only be used where they apply to
|
of the x/y axis in units/mm. These may only be used where they apply to
|
||||||
a large proportion of matching devices. They should not be used for any
|
a large proportion of matching devices. They should not be used for any
|
||||||
specific device, override ``EVDEV_ABS_*`` instead, see
|
specific device, override ``EVDEV_ABS_*`` instead, see
|
||||||
:ref:`absolute_coordinate_ranges_fix`.
|
:ref:`absolute_coordinate_ranges_fix`.
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ Hold gestures have three potential logical states:
|
||||||
- **begin**: one or more fingers are placed on the device at the same time
|
- **begin**: one or more fingers are placed on the device at the same time
|
||||||
- **end**: all fingers are removed and the device enters a neutral logical state
|
- **end**: all fingers are removed and the device enters a neutral logical state
|
||||||
- **end(cancelled)**: all fingers are part of a known interaction and the
|
- **end(cancelled)**: all fingers are part of a known interaction and the
|
||||||
current hold gesture is no longer active. This may also occur when
|
currenthold gesture is no longer active. This may also occurs when
|
||||||
switching between hold gestures with different finger counts.
|
switching between hold gestures with different finger counts.
|
||||||
|
|
||||||
.. note:: By definition, a hold gesture does not move and thus no coordinate
|
.. note:: By definition, a hold gesture does not move and thus no coordinate
|
||||||
|
|
@ -108,15 +108,14 @@ Hold gestures have three potential logical states:
|
||||||
For example, a user that puts one finger, then a second finger down and
|
For example, a user that puts one finger, then a second finger down and
|
||||||
releases them later may trigger the following event sequence:
|
releases them later may trigger the following event sequence:
|
||||||
|
|
||||||
============= ============== ============
|
============= ============ ============
|
||||||
Action Event Finger count
|
Action Event Finger count
|
||||||
============= ============== ============
|
============= ============ ============
|
||||||
Finger 1 down **begin** 1
|
Finger 1 down <no event>
|
||||||
Finger 2 down **cancel** 1
|
Finger 2 down **begin** 2
|
||||||
\ **begin** 2
|
|
||||||
Finger 2 up **end** 2
|
Finger 2 up **end** 2
|
||||||
Finger 1 up <no event>
|
Finger 1 up <no event>
|
||||||
============= ============== ============
|
============= ============ ============
|
||||||
|
|
||||||
A hold gesture may by be **cancelled**. This occurs
|
A hold gesture may by be **cancelled**. This occurs
|
||||||
when the hold gesture changes into some other interaction and should no
|
when the hold gesture changes into some other interaction and should no
|
||||||
|
|
@ -255,8 +254,7 @@ towards an interaction, see :ref:`thumb_detection` and
|
||||||
|
|
||||||
In the context of hold gestures, thumbs and palms are treated by libinput as
|
In the context of hold gestures, thumbs and palms are treated by libinput as
|
||||||
if the finger was removed from the device. Where other non-thumb/non-palm
|
if the finger was removed from the device. Where other non-thumb/non-palm
|
||||||
fingers remain on the device, the current hold gesture is cancelled and a
|
fingers remain on the device, an **hold update** event is sent. Otherwise,
|
||||||
new **hold begin** event with the updated finger count is sent. Otherwise,
|
|
||||||
the hold gesture terminates with a **hold cancel** event.
|
the hold gesture terminates with a **hold cancel** event.
|
||||||
|
|
||||||
Notably, libinput's thumb and palm detection is not a simple boolean per
|
Notably, libinput's thumb and palm detection is not a simple boolean per
|
||||||
|
|
@ -361,7 +359,7 @@ Touchpoints are assigned in sequential order and only the first two touch
|
||||||
points are trackable. For libinput this produces an ambiguity where it is
|
points are trackable. For libinput this produces an ambiguity where it is
|
||||||
impossible to detect whether a gesture is a pinch gesture or a swipe gesture
|
impossible to detect whether a gesture is a pinch gesture or a swipe gesture
|
||||||
whenever a user puts the index and middle finger down first. Since the third
|
whenever a user puts the index and middle finger down first. Since the third
|
||||||
finger does not have positional information, its location cannot be
|
finger does not have positional information, it's location cannot be
|
||||||
determined.
|
determined.
|
||||||
|
|
||||||
.. figure:: gesture-2fg-ambiguity.svg
|
.. figure:: gesture-2fg-ambiguity.svg
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ input devices (see :ref:`udev_device_type`) but that should not be used by
|
||||||
libinput. It is recommended that devices that should not be handled as input
|
libinput. It is recommended that devices that should not be handled as input
|
||||||
devices at all unset the **ID_INPUT** and related properties instead. The
|
devices at all unset the **ID_INPUT** and related properties instead. The
|
||||||
**LIBINPUT_IGNORE_DEVICE** property signals that only libinput should
|
**LIBINPUT_IGNORE_DEVICE** property signals that only libinput should
|
||||||
ignore this device but other parts of the stack (if any) should continue
|
ignore this property but other parts of the stack (if any) should continue
|
||||||
treating this device normally.
|
treating this device normally.
|
||||||
|
|
||||||
Below is an example udev rule to assign **LIBINPUT_IGNORE_DEVICE** to the
|
Below is an example udev rule to assign **LIBINPUT_IGNORE_DEVICE** to the
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ the value can be crafted manually:
|
||||||
|
|
||||||
.. code-block:: lua
|
.. code-block:: lua
|
||||||
|
|
||||||
evdev_type = 0x2 -- EV_REL
|
evdev_type = 0x3 -- EV_REL
|
||||||
evdev_code = 0x1 -- REL_Y
|
evdev_code = 0x1 -- REL_Y
|
||||||
evdev_usage = (evdev_type << 16) | evdev_code
|
evdev_usage = (evdev_type << 16) | evdev_code
|
||||||
|
|
||||||
|
|
@ -485,7 +485,7 @@ methods will be noops.
|
||||||
|
|
||||||
Version 1 of the plugin API supports the following udev properties:
|
Version 1 of the plugin API supports the following udev properties:
|
||||||
|
|
||||||
- All of ``ID_INPUT_*`` that denote the device type as assigned
|
- ``ID_INPUT`` and all of ``ID_INPUT_*`` that denote the device type as assigned
|
||||||
by udev. This information is usually used by libinput to determine a
|
by udev. This information is usually used by libinput to determine a
|
||||||
device type. Note that for historical reasons these properties have
|
device type. Note that for historical reasons these properties have
|
||||||
varying rules - some properties may be mutually exclusive, others are
|
varying rules - some properties may be mutually exclusive, others are
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ one can be enabled at a time. As a general overview:
|
||||||
- touchpad devices with physical buttons below the touchpad support edge and
|
- touchpad devices with physical buttons below the touchpad support edge and
|
||||||
two-finger scrolling
|
two-finger scrolling
|
||||||
- touchpad devices without physical buttons (:ref:`ClickPads <clickpad_softbuttons>`)
|
- touchpad devices without physical buttons (:ref:`ClickPads <clickpad_softbuttons>`)
|
||||||
support two-finger scrolling and edge scrolling
|
support two-finger scrolling only
|
||||||
- pointing sticks provide on-button scrolling by default
|
- pointing sticks provide on-button scrolling by default
|
||||||
- mice and other pointing devices support on-button scrolling but it is not
|
- mice and other pointing devices support on-button scrolling but it is not
|
||||||
enabled by default
|
enabled by default
|
||||||
|
|
@ -124,12 +124,6 @@ button lock, the button is now considered logically held down. Pressing and
|
||||||
releasing the button a second time logically releases the button. While the
|
releasing the button a second time logically releases the button. While the
|
||||||
button is logically held down, motion events are converted to scroll events.
|
button is logically held down, motion events are converted to scroll events.
|
||||||
|
|
||||||
If the button is held and used to scroll for longer than a short grace
|
|
||||||
period, releasing the button does not engage the lock. This allows
|
|
||||||
hold-to-scroll for short, precise adjustments without accidentally toggling
|
|
||||||
the lock. A quick click or a brief scroll within the grace period still
|
|
||||||
engages the lock as normal.
|
|
||||||
|
|
||||||
.. _scroll_sources:
|
.. _scroll_sources:
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ Thus, devices "Foo" and "Bar" both reference the same struct
|
||||||
The effect of seat assignment
|
The effect of seat assignment
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
A logical seat is interpreted as a group of devices that usually belong to a
|
A logical set is interpreted as a group of devices that usually belong to a
|
||||||
single user that interacts with a computer. Thus, the devices are
|
single user that interacts with a computer. Thus, the devices are
|
||||||
semantically related. This means for devices within the same logical seat:
|
semantically related. This means for devices within the same logical seat:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ event of type **LIBINPUT_EVENT_TABLET_TOOL_TIP**, and again when the tip
|
||||||
ceases contact with the surface.
|
ceases contact with the surface.
|
||||||
|
|
||||||
Tablet tools may send button events; these are exclusively for extra buttons
|
Tablet tools may send button events; these are exclusively for extra buttons
|
||||||
unrelated to the tip. A button event is independent of the tip and can occur while
|
unrelated to the tip. A button event is independent of the tip and can while
|
||||||
the tip is down or up.
|
the tip is down or up.
|
||||||
|
|
||||||
Some tablet tools' pressure detection is too sensitive, causing phantom
|
Some tablet tools' pressure detection is too sensitive, causing phantom
|
||||||
|
|
@ -67,7 +67,7 @@ tools are capable of detecting 1 gram of pressure.
|
||||||
|
|
||||||
libinput uses a device-specific pressure threshold to determine when the tip
|
libinput uses a device-specific pressure threshold to determine when the tip
|
||||||
is considered logically down. As a result, libinput may send a nonzero
|
is considered logically down. As a result, libinput may send a nonzero
|
||||||
pressure value while the tip is logically up. Most applications can and
|
pressure value while the tip is logically up. Most application can and
|
||||||
should ignore pressure information until they receive the event of type
|
should ignore pressure information until they receive the event of type
|
||||||
**LIBINPUT_EVENT_TABLET_TOOL_TIP**. Applications that require extremely
|
**LIBINPUT_EVENT_TABLET_TOOL_TIP**. Applications that require extremely
|
||||||
fine-grained pressure sensitivity should use the pressure data instead of
|
fine-grained pressure sensitivity should use the pressure data instead of
|
||||||
|
|
@ -100,7 +100,7 @@ all pen-like tools to absolute mode.
|
||||||
|
|
||||||
If a tool in relative mode must not use pointer acceleration, callers
|
If a tool in relative mode must not use pointer acceleration, callers
|
||||||
should use the absolute coordinates returned by
|
should use the absolute coordinates returned by
|
||||||
**libinput_event_tablet_tool_get_x()** and **libinput_event_tablet_tool_get_y()**
|
**libinput_event_tablet_tool_get_x()** and libinput_event_tablet_tool_get_y()
|
||||||
and calculate the delta themselves. Callers that require exact physical
|
and calculate the delta themselves. Callers that require exact physical
|
||||||
distance should also use these functions to calculate delta movements.
|
distance should also use these functions to calculate delta movements.
|
||||||
|
|
||||||
|
|
@ -284,7 +284,7 @@ with **libinput_tablet_tool_get_tool_id()** but makes no promises about the
|
||||||
content or format of the ID.
|
content or format of the ID.
|
||||||
|
|
||||||
libinput currently supports Wacom-style tool IDs as provided on the Wacom
|
libinput currently supports Wacom-style tool IDs as provided on the Wacom
|
||||||
Intuos 3, 4, 5, Wacom Cintiq and Wacom Intuos Pro series. The tool ID can
|
Intuos 3, 4, 5, Wacon Cintiq and Wacom Intuos Pro series. The tool ID can
|
||||||
be used to distinguish between e.g. a Wacom Classic Pen or a Wacom Pro Pen.
|
be used to distinguish between e.g. a Wacom Classic Pen or a Wacom Pro Pen.
|
||||||
It is the caller's responsibility to interpret the tool ID.
|
It is the caller's responsibility to interpret the tool ID.
|
||||||
|
|
||||||
|
|
@ -357,7 +357,7 @@ tablet by 180 degrees to move the tablet pad button area to right side of
|
||||||
the tablet. When left-handed mode is enabled on a tablet device (see
|
the tablet. When left-handed mode is enabled on a tablet device (see
|
||||||
**libinput_device_config_left_handed_set()**) the tablet tool and tablet pad
|
**libinput_device_config_left_handed_set()**) the tablet tool and tablet pad
|
||||||
behavior changes. In left-handed mode, the tools' axes are adjusted
|
behavior changes. In left-handed mode, the tools' axes are adjusted
|
||||||
so that the origin of each axis remains the logical north-west of
|
so that the origin of each axis remains the logical north-east of
|
||||||
the physical tablet. For example, the x and y axes are inverted and the
|
the physical tablet. For example, the x and y axes are inverted and the
|
||||||
positive x/y coordinates are down/right of the top-left corner of the tablet
|
positive x/y coordinates are down/right of the top-left corner of the tablet
|
||||||
in its current orientation. On a tablet pad, the ring and strip are
|
in its current orientation. On a tablet pad, the ring and strip are
|
||||||
|
|
@ -401,7 +401,7 @@ caller to decide whether the mode only applies to buttons, rings and strips
|
||||||
or only to rings and strips (this is the case with the Wacom OS X and
|
or only to rings and strips (this is the case with the Wacom OS X and
|
||||||
Windows driver).
|
Windows driver).
|
||||||
|
|
||||||
The availability of modes on a tablet pad usually depends on visual feedback
|
The availability of modes on a touchpad usually depends on visual feedback
|
||||||
such as LEDs around the touch ring. If no visual feedback is available, only
|
such as LEDs around the touch ring. If no visual feedback is available, only
|
||||||
one mode may be available.
|
one mode may be available.
|
||||||
|
|
||||||
|
|
@ -509,7 +509,7 @@ tip of the tool - inverting the tool brings the eraser into proximity.
|
||||||
.. figure:: tablet-eraser-invert.svg
|
.. figure:: tablet-eraser-invert.svg
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
A pen-like tool used as pen and as eraser by inverting it
|
An pen-like tool used as pen and as eraser by inverting it
|
||||||
|
|
||||||
Having an eraser as a separate tool is beneficial in many applications as the
|
Having an eraser as a separate tool is beneficial in many applications as the
|
||||||
eraser tool can be assigned different functionality (colors, paint tools, etc.)
|
eraser tool can be assigned different functionality (colors, paint tools, etc.)
|
||||||
|
|
@ -524,7 +524,7 @@ into proximity immediately after - as if the tool was physically inverted.
|
||||||
.. figure:: tablet-eraser-button.svg
|
.. figure:: tablet-eraser-button.svg
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
A pen-like tool used as pen and as eraser by pressing the eraser button
|
An pen-like tool used as pen and as eraser by pressing the eraser button
|
||||||
|
|
||||||
Microsoft mandates this behavior (see
|
Microsoft mandates this behavior (see
|
||||||
`Windows Pen States <https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states>`_
|
`Windows Pen States <https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states>`_
|
||||||
|
|
@ -541,4 +541,4 @@ is disabled, pressing that button will generate a normal tablet tool button
|
||||||
event.
|
event.
|
||||||
|
|
||||||
This configuration is only available on pens with an eraser button, not on
|
This configuration is only available on pens with an eraser button, not on
|
||||||
pens with an invert-type eraser.
|
with an invert-type eraser.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -235,7 +235,7 @@ suites as:
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
$ meson test --no-suite=hardware # only run container-friendly tests
|
$ meson test --no-suite=machine # only run container-friendly tests
|
||||||
$ meson test --suite=valgrind --setup=valgrind # run all valgrind-compatible tests
|
$ meson test --suite=valgrind --setup=valgrind # run all valgrind-compatible tests
|
||||||
$ meson test --no-suite=root # run all tests not requiring root
|
$ meson test --no-suite=root # run all tests not requiring root
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -269,7 +269,7 @@ alphanumeric key shows up as letter "a".
|
||||||
The recording can be replayed with the ``libinput replay`` command: ::
|
The recording can be replayed with the ``libinput replay`` command: ::
|
||||||
|
|
||||||
$ sudo libinput replay touchpad.yml
|
$ sudo libinput replay touchpad.yml
|
||||||
/dev/input/event19: SynPS/2 Synaptics TouchPad
|
SynPS/2 Synaptics TouchPad: /dev/input/event19
|
||||||
Hit enter to start replaying
|
Hit enter to start replaying
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -329,13 +329,16 @@ specific bug. For example, a touchpad may not work in response to keyboard
|
||||||
events. To accurately reproduce this sequence, the timing between multiple
|
events. To accurately reproduce this sequence, the timing between multiple
|
||||||
devices must be correct and we need to record the events in one go.
|
devices must be correct and we need to record the events in one go.
|
||||||
|
|
||||||
``libinput record`` can record multiple devices by specifying them on the
|
``libinput record`` has a ``--multiple`` argument to record multiple devices at
|
||||||
commandline. Recording multiple devices requires the ``--output-file``
|
once. Unlike the normal invocation, this one requires a number of arguments: ::
|
||||||
argument: ::
|
|
||||||
|
|
||||||
$ sudo libinput record --output-file=touchpad-bug.yml /dev/input/event17 /dev/input/event3
|
$ sudo libinput record --multiple --output-file=touchpad-bug.yml /dev/input/event17 /dev/input/event3
|
||||||
recording to 'touchpad-bug.yml'
|
recording to 'touchpad-bug.yml'
|
||||||
|
|
||||||
|
As seen above, a user must specify ``--multiple`` and the ``--output-file``.
|
||||||
|
Finally, all devices to be recorded must be specified on the commandline as
|
||||||
|
well.
|
||||||
|
|
||||||
Replaying events is the same as for a single recording: ::
|
Replaying events is the same as for a single recording: ::
|
||||||
|
|
||||||
$ sudo libinput replay touchpad-bug.yml
|
$ sudo libinput replay touchpad-bug.yml
|
||||||
|
|
@ -362,7 +365,7 @@ The ``libinput analyze`` tool is a multiplexer for various sub-tools that
|
||||||
can analyze input events previously recorded from a device.
|
can analyze input events previously recorded from a device.
|
||||||
|
|
||||||
Please see the **libinput-analyze(1)** man page for information about what
|
Please see the **libinput-analyze(1)** man page for information about what
|
||||||
tools are available and the man page for each respective tool.
|
tools are available and the man page for each respective too.
|
||||||
|
|
||||||
|
|
||||||
.. _libinput-quirks:
|
.. _libinput-quirks:
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ Touchpad jitter describes random movement by a few pixels even when the
|
||||||
user's finger is unmoving.
|
user's finger is unmoving.
|
||||||
|
|
||||||
libinput has a mechanism called a **hysteresis** to avoid that jitter. When
|
libinput has a mechanism called a **hysteresis** to avoid that jitter. When
|
||||||
active, movement within the **hysteresis margin** is discarded. If the
|
active, movement with in the **hysteresis margin** is discarded. If the
|
||||||
movement delta is larger than the margin, the movement is passed on as
|
movement delta is larger than the margin, the movement is passed on as
|
||||||
pointer movement. This is a simplified summary, developers should
|
pointer movement. This is a simplified summary, developers should
|
||||||
read the implementation of the hysteresis in ``src/evdev.h``.
|
read the implementation of the hysteresis in ``src/evdev.c``.
|
||||||
|
|
||||||
libinput uses the kernel ``fuzz`` value to determine the size of the
|
libinput uses the kernel ``fuzz`` value to determine the size of the
|
||||||
hysteresis. Users should override this with a udev hwdb entry where the
|
hysteresis. Users should override this with a udev hwdb entry where the
|
||||||
|
|
|
||||||
|
|
@ -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`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ Both events have their own set of APIs to access the data within:
|
||||||
- ``LIBINPUT_EVENT_POINTER_SCROLL_WHEEL`` available since libinput 1.19.
|
- ``LIBINPUT_EVENT_POINTER_SCROLL_WHEEL`` available since libinput 1.19.
|
||||||
|
|
||||||
* ``libinput_event_pointer_get_scroll_value_v120()`` returns a value
|
* ``libinput_event_pointer_get_scroll_value_v120()`` returns a value
|
||||||
normalized into multiples of 120, see below. Any multiple of 120 should
|
normalized into the 0..120 range, see below. Any multiple of 120 should
|
||||||
be treated as one full wheel click.
|
be treated as one full wheel click.
|
||||||
|
|
||||||
.. note:: Where possible, the ``libinput_event_pointer_get_axis_value()``,
|
.. note:: Where possible, the ``libinput_event_pointer_get_axis_value()``,
|
||||||
|
|
@ -77,7 +77,7 @@ wheel:
|
||||||
| 20 | 20 | 1 | 120 |
|
| 20 | 20 | 1 | 120 |
|
||||||
+-------------+------------+---------------+------+
|
+-------------+------------+---------------+------+
|
||||||
|
|
||||||
Fast scrolling may trigger more than one detent per event and thus each
|
Fast scrolling may trigger cover than one detent per event and thus each
|
||||||
event may contain multiples of the value, discrete or v120 value:
|
event may contain multiples of the value, discrete or v120 value:
|
||||||
|
|
||||||
+-------------+------------+---------------+------+
|
+-------------+------------+---------------+------+
|
||||||
|
|
|
||||||
|
|
@ -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,15 +2,6 @@
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
||||||
# Match vid and pid as it can have other names.
|
# Match vid and pid as it can have other names.
|
||||||
[Goodix Haptic Touchpad (27C6:01E7)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x01E7
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5100:00 27C6:01E8 Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:01E8)]
|
[Goodix Haptic Touchpad (27C6:01E8)]
|
||||||
MatchBus=i2c
|
MatchBus=i2c
|
||||||
MatchVendor=0x27C6
|
MatchVendor=0x27C6
|
||||||
|
|
@ -18,42 +9,6 @@ MatchProduct=0x01E8
|
||||||
MatchUdevType=touchpad
|
MatchUdevType=touchpad
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5100:00 27C6:01E9 Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:01E9)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x01E9
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5100:00 27C6:01EA Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:01EA)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x01EA
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5100:00 27C6:01EB Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:01EB)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x01EB
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5400 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
# GXTP5400:00 27C6:0F96 Touchpad
|
|
||||||
[Goodix Haptic Touchpad (27C6:0F96)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x0F96
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
||||||
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
||||||
# GXTP5420:00 27C6:0F95 Touchpad
|
# GXTP5420:00 27C6:0F95 Touchpad
|
||||||
[Goodix Haptic Touchpad (27C6:0F95)]
|
[Goodix Haptic Touchpad (27C6:0F95)]
|
||||||
|
|
@ -62,11 +17,3 @@ MatchVendor=0x27C6
|
||||||
MatchProduct=0x0F95
|
MatchProduct=0x0F95
|
||||||
MatchUdevType=touchpad
|
MatchUdevType=touchpad
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
||||||
|
|
||||||
# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
|
|
||||||
[Goodix Haptic Touchpad (27C6:0F90)]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x27C6
|
|
||||||
MatchProduct=0x0F90
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
AttrInputProp=+INPUT_PROP_PRESSUREPAD
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# Do not edit this file, it will be overwritten on update
|
|
||||||
|
|
||||||
# Most Pixart Touchpad (093A:0255) devices don't have buttons so we remove right
|
|
||||||
# button in 30-vendor-pixart.quirks, but this one does.
|
|
||||||
[Positivo VAIO FE15 Touchpad]
|
|
||||||
MatchBus=i2c
|
|
||||||
MatchVendor=0x093A
|
|
||||||
MatchProduct=0x0255
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
MatchDMIModalias=dmi:*:svnPositivoBahia-VAIO:pnVJFE59F11X-*:*
|
|
||||||
AttrEventCode=+BTN_RIGHT
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
# Do not edit this file, it will be overwritten on update
|
|
||||||
|
|
||||||
# Clickpad that announces BTN_RIGHT
|
|
||||||
[Wareus B15 Touchpad]
|
|
||||||
MatchName=HTIX5288:00 36B6:C001 Touchpad
|
|
||||||
MatchUdevType=touchpad
|
|
||||||
MatchDMIModalias=dmi:*svnWareus:*pnB15*
|
|
||||||
AttrEventCode=-BTN_RIGHT
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -585,28 +585,8 @@ tp_gesture_handle_event_on_state_none(struct tp_dispatch *tp,
|
||||||
static void
|
static void
|
||||||
tp_gesture_set_3fg_drag_3fg_or_swipe_timer(struct tp_dispatch *tp, usec_t time)
|
tp_gesture_set_3fg_drag_3fg_or_swipe_timer(struct tp_dispatch *tp, usec_t time)
|
||||||
{
|
{
|
||||||
usec_t expire = usec_add(tp->gesture.initial_time, DRAG_3FG_OR_SWIPE_TIMEOUT);
|
libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer,
|
||||||
|
usec_add(time, DRAG_3FG_OR_SWIPE_TIMEOUT));
|
||||||
/* This is a hack to avoid the state machine getting even more complicated.
|
|
||||||
* For a slow drag/fast swipe we want the time from the *initial* touch point,
|
|
||||||
* not the time from when we realised the fingers are moving. IOW
|
|
||||||
* putting 3fg down, resting for 80ms and then moving fast must trigger
|
|
||||||
* a drag, not a swipe.
|
|
||||||
*
|
|
||||||
* In theory we should set the timer in the NONE/UNKNOWN states but that would
|
|
||||||
* require a whole parallel set of states like
|
|
||||||
* NONE_BUT_TIMEOUT_FOR_FAST_STATE_EXPIRED. Let's not do that, instead we set a
|
|
||||||
* negative timer and let the normal state proceed. Either we moved by the
|
|
||||||
* threshold already (in which case we shouldn't ever get here anyway) or
|
|
||||||
* we didn't in which case the neg timer will do the right thing too when it
|
|
||||||
* fires.
|
|
||||||
*/
|
|
||||||
if (usec_cmp(expire, time) < 0)
|
|
||||||
libinput_timer_set_flags(&tp->gesture.drag_3fg_or_swipe_timer,
|
|
||||||
expire,
|
|
||||||
TIMER_FLAG_ALLOW_NEGATIVE);
|
|
||||||
else
|
|
||||||
libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer, expire);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
|
|
@ -178,13 +178,6 @@ tp_tap_clear_timer(struct tp_dispatch *tp)
|
||||||
libinput_timer_cancel(&tp->tap.timer);
|
libinput_timer_cancel(&tp->tap.timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
tp_touch_near_any_edge(struct tp_dispatch *tp, struct tp_touch *t)
|
|
||||||
{
|
|
||||||
return (t->point.x < tp->tap.edges.left || t->point.x > tp->tap.edges.right ||
|
|
||||||
t->point.y < tp->tap.edges.top || t->point.y > tp->tap.edges.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tp_tap_move_to_dead(struct tp_dispatch *tp, struct tp_touch *t)
|
tp_tap_move_to_dead(struct tp_dispatch *tp, struct tp_touch *t)
|
||||||
{
|
{
|
||||||
|
|
@ -819,7 +812,6 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
|
||||||
usec_t time,
|
usec_t time,
|
||||||
int nfingers_tapped)
|
int nfingers_tapped)
|
||||||
{
|
{
|
||||||
bool at_edge = false;
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case TAP_EVENT_TOUCH: {
|
case TAP_EVENT_TOUCH: {
|
||||||
|
|
@ -833,8 +825,7 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TAP_EVENT_RELEASE:
|
case TAP_EVENT_RELEASE:
|
||||||
if (tp->tap.drag_lock != LIBINPUT_CONFIG_DRAG_LOCK_DISABLED ||
|
if (tp->tap.drag_lock != LIBINPUT_CONFIG_DRAG_LOCK_DISABLED) {
|
||||||
(at_edge = tp_touch_near_any_edge(tp, t))) {
|
|
||||||
enum tp_tap_state dest[3] = {
|
enum tp_tap_state dest[3] = {
|
||||||
TAP_STATE_1FGTAP_DRAGGING_WAIT,
|
TAP_STATE_1FGTAP_DRAGGING_WAIT,
|
||||||
TAP_STATE_2FGTAP_DRAGGING_WAIT,
|
TAP_STATE_2FGTAP_DRAGGING_WAIT,
|
||||||
|
|
@ -842,8 +833,7 @@ tp_tap_dragging_handle_event(struct tp_dispatch *tp,
|
||||||
};
|
};
|
||||||
assert(nfingers_tapped >= 1 && nfingers_tapped <= 3);
|
assert(nfingers_tapped >= 1 && nfingers_tapped <= 3);
|
||||||
tp->tap.state = dest[nfingers_tapped - 1];
|
tp->tap.state = dest[nfingers_tapped - 1];
|
||||||
if (at_edge ||
|
if (tp->tap.drag_lock ==
|
||||||
tp->tap.drag_lock ==
|
|
||||||
LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_TIMEOUT)
|
LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_TIMEOUT)
|
||||||
tp_tap_set_draglock_timer(tp, time);
|
tp_tap_set_draglock_timer(tp, time);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1589,20 +1579,6 @@ tp_init_tap(struct tp_dispatch *tp)
|
||||||
tp->tap.drag_enabled = tp_drag_default(tp->device);
|
tp->tap.drag_enabled = tp_drag_default(tp->device);
|
||||||
tp->tap.drag_lock = tp_drag_lock_default(tp->device);
|
tp->tap.drag_lock = tp_drag_lock_default(tp->device);
|
||||||
|
|
||||||
struct evdev_device *device = tp->device;
|
|
||||||
|
|
||||||
const struct input_absinfo *absx = device->abs.absinfo_x;
|
|
||||||
const struct input_absinfo *absy = device->abs.absinfo_y;
|
|
||||||
assert(absx && absy);
|
|
||||||
|
|
||||||
struct phys_coords mm = { 5.0, 5.0 };
|
|
||||||
struct device_coords edge_margin = evdev_device_mm_to_units(device, &mm);
|
|
||||||
|
|
||||||
tp->tap.edges.left = edge_margin.x;
|
|
||||||
tp->tap.edges.right = (absx->maximum - edge_margin.x + absx->minimum);
|
|
||||||
tp->tap.edges.top = edge_margin.y;
|
|
||||||
tp->tap.edges.bottom = (absy->maximum - edge_margin.y + absy->minimum);
|
|
||||||
|
|
||||||
snprintf(timer_name,
|
snprintf(timer_name,
|
||||||
sizeof(timer_name),
|
sizeof(timer_name),
|
||||||
"%s tap",
|
"%s tap",
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -237,11 +237,14 @@ pad_led_group_add_toggle_button(struct pad_led_group *group,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char *
|
static inline bool
|
||||||
pad_led_get_sysfs_base_path(struct evdev_device *device)
|
pad_led_get_sysfs_base_path(struct evdev_device *device,
|
||||||
|
char *path_out,
|
||||||
|
size_t path_out_sz)
|
||||||
{
|
{
|
||||||
struct udev_device *parent, *udev_device;
|
struct udev_device *parent, *udev_device;
|
||||||
const char *test_path;
|
const char *test_path;
|
||||||
|
int rc;
|
||||||
|
|
||||||
udev_device = device->udev_device;
|
udev_device = device->udev_device;
|
||||||
|
|
||||||
|
|
@ -250,18 +253,24 @@ pad_led_get_sysfs_base_path(struct evdev_device *device)
|
||||||
test_path =
|
test_path =
|
||||||
udev_device_get_property_value(udev_device,
|
udev_device_get_property_value(udev_device,
|
||||||
"LIBINPUT_TEST_TABLET_PAD_SYSFS_PATH");
|
"LIBINPUT_TEST_TABLET_PAD_SYSFS_PATH");
|
||||||
if (test_path)
|
if (test_path) {
|
||||||
return safe_strdup(test_path);
|
rc = snprintf(path_out, path_out_sz, "%s", test_path);
|
||||||
|
return rc != -1;
|
||||||
|
}
|
||||||
|
|
||||||
parent = udev_device_get_parent_with_subsystem_devtype(udev_device,
|
parent = udev_device_get_parent_with_subsystem_devtype(udev_device,
|
||||||
"input",
|
"input",
|
||||||
NULL);
|
NULL);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
return NULL;
|
return false;
|
||||||
|
|
||||||
return strdup_printf("%s/%s::wacom-",
|
rc = snprintf(path_out,
|
||||||
|
path_out_sz,
|
||||||
|
"%s/%s::wacom-",
|
||||||
udev_device_get_syspath(parent),
|
udev_device_get_syspath(parent),
|
||||||
udev_device_get_sysname(parent));
|
udev_device_get_sysname(parent));
|
||||||
|
|
||||||
|
return rc != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -279,12 +288,11 @@ pad_add_mode_group(struct pad_dispatch *pad,
|
||||||
struct libinput *li = pad_libinput_context(pad);
|
struct libinput *li = pad_libinput_context(pad);
|
||||||
struct pad_led_group *group = NULL;
|
struct pad_led_group *group = NULL;
|
||||||
int rc = -ENOMEM;
|
int rc = -ENOMEM;
|
||||||
_autofree_ char *syspath;
|
char syspath[PATH_MAX];
|
||||||
|
|
||||||
/* syspath is /sys/class/leds/input1234/input12345::wacom-" and
|
/* syspath is /sys/class/leds/input1234/input12345::wacom-" and
|
||||||
only needs the group + mode appended */
|
only needs the group + mode appended */
|
||||||
syspath = pad_led_get_sysfs_base_path(device);
|
if (!pad_led_get_sysfs_base_path(device, syspath, sizeof(syspath)))
|
||||||
if (!syspath)
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
group = pad_group_new(pad, group_index, nmodes);
|
group = pad_group_new(pad, group_index, nmodes);
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,7 @@ tablet_filter_axis_fuzz(const struct tablet_dispatch *tablet,
|
||||||
|
|
||||||
fuzz = libevdev_get_abs_fuzz(device->evdev, evdev_usage_code(e->usage));
|
fuzz = libevdev_get_abs_fuzz(device->evdev, evdev_usage_code(e->usage));
|
||||||
|
|
||||||
/* ABS_DISTANCE doesn't have fuzz set and causes continuous
|
/* ABS_DISTANCE doesn't have have fuzz set and causes continuous
|
||||||
* updates for the cursor/lens tools. Add a minimum fuzz of 2, same
|
* updates for the cursor/lens tools. Add a minimum fuzz of 2, same
|
||||||
* as the xf86-input-wacom driver
|
* as the xf86-input-wacom driver
|
||||||
*/
|
*/
|
||||||
|
|
@ -1311,6 +1311,18 @@ eraser_button_get_default_mode(struct libinput_tablet_tool *tool)
|
||||||
static enum libinput_config_status
|
static enum libinput_config_status
|
||||||
eraser_button_set_button(struct libinput_tablet_tool *tool, uint32_t button)
|
eraser_button_set_button(struct libinput_tablet_tool *tool, uint32_t button)
|
||||||
{
|
{
|
||||||
|
switch (button) {
|
||||||
|
case BTN_STYLUS:
|
||||||
|
case BTN_STYLUS2:
|
||||||
|
case BTN_STYLUS3:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log_bug_libinput(libinput_device_get_context(tool->last_device),
|
||||||
|
"Unsupported eraser button 0x%x",
|
||||||
|
button);
|
||||||
|
return LIBINPUT_CONFIG_STATUS_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
tool->eraser_button.want_button = button;
|
tool->eraser_button.want_button = button;
|
||||||
|
|
||||||
eraser_button_toggle(tool);
|
eraser_button_toggle(tool);
|
||||||
|
|
@ -1866,24 +1878,38 @@ tablet_calculate_arbitration_rect(struct tablet_dispatch *tablet)
|
||||||
{
|
{
|
||||||
struct evdev_device *device = tablet->device;
|
struct evdev_device *device = tablet->device;
|
||||||
struct phys_rect r = { 0 };
|
struct phys_rect r = { 0 };
|
||||||
const double maxdim = 600; /* 600mm covers all the way to the right/bottom */
|
struct phys_coords mm;
|
||||||
|
|
||||||
struct phys_coords mm = evdev_device_units_to_mm(device, &tablet->axes.point);
|
mm = evdev_device_units_to_mm(device, &tablet->axes.point);
|
||||||
|
|
||||||
/* The rect we disable is 20mm left of the tip, covering that whole side of the
|
/* The rect we disable is 20mm left of the tip, 100mm north of the
|
||||||
* tablet. If the stylus is tilted left (tip further right than the eraser end)
|
* tip, and 200x250mm large.
|
||||||
* assume left-handed mode.
|
* If the stylus is tilted left (tip further right than the eraser
|
||||||
|
* end) assume left-handed mode.
|
||||||
|
*
|
||||||
|
* Obviously if we'd run out of the boundaries, we clip the rect
|
||||||
|
* accordingly.
|
||||||
*/
|
*/
|
||||||
if (tablet->axes.tilt.x > 0) {
|
if (tablet->axes.tilt.x > 0) {
|
||||||
r.x = mm.x - 20;
|
r.x = mm.x - 20;
|
||||||
r.w = maxdim;
|
r.w = 200;
|
||||||
} else {
|
} else {
|
||||||
r.x = 0;
|
r.x = mm.x + 20;
|
||||||
r.w = mm.x + 20;
|
r.w = 200;
|
||||||
|
r.x -= r.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r.x < 0) {
|
||||||
|
r.w += r.x;
|
||||||
|
r.x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
r.y = mm.y - 100;
|
||||||
|
r.h = 250;
|
||||||
|
if (r.y < 0) {
|
||||||
|
r.h += r.y;
|
||||||
r.y = 0;
|
r.y = 0;
|
||||||
r.h = maxdim;
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -2451,7 +2477,7 @@ tablet_setup_touch_arbitration(struct evdev_device *device,
|
||||||
struct libinput_device_group *group2 =
|
struct libinput_device_group *group2 =
|
||||||
libinput_device_get_device_group(&new_device->base);
|
libinput_device_get_device_group(&new_device->base);
|
||||||
|
|
||||||
/* same physical device? -> better, otherwise keep the one we have */
|
/* same phsical device? -> better, otherwise keep the one we have */
|
||||||
if (group1 != group2)
|
if (group1 != group2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
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
|
||||||
|
|
|
||||||
|
|
@ -562,12 +562,6 @@ libinputplugin_unregister(lua_State *L)
|
||||||
return luaL_error(L, "@@unregistering@@");
|
return luaL_error(L, "@@unregistering@@");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
readonly_newindex(lua_State *L)
|
|
||||||
{
|
|
||||||
return luaL_error(L, "attempt to modify a read-only table");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
libinputplugin_gc(lua_State *L)
|
libinputplugin_gc(lua_State *L)
|
||||||
{
|
{
|
||||||
|
|
@ -679,28 +673,7 @@ libinputplugin_log_error(lua_State *L)
|
||||||
return libinputplugin_log(L, LIBINPUT_LOG_PRIORITY_ERROR);
|
return libinputplugin_log(L, LIBINPUT_LOG_PRIORITY_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static const struct luaL_Reg libinputplugin_vtable[] = {
|
||||||
setup_vfuncs(lua_State *L,
|
|
||||||
const char *metatable_name,
|
|
||||||
const struct luaL_Reg *vfuncs,
|
|
||||||
const struct luaL_Reg *public_methods)
|
|
||||||
{
|
|
||||||
luaL_newmetatable(L, metatable_name);
|
|
||||||
luaL_setfuncs(L, vfuncs, 0);
|
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
luaL_setfuncs(L, public_methods, 0);
|
|
||||||
lua_setfield(L, -2, "__index");
|
|
||||||
|
|
||||||
/* set metatable.__metatable = false to prevent a script from getmetatable(),
|
|
||||||
which is blocked anyway but safe and sorry and whatnot */
|
|
||||||
lua_pushboolean(L, 0);
|
|
||||||
lua_setfield(L, -2, "__metatable");
|
|
||||||
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct luaL_Reg libinputplugin_methods[] = {
|
|
||||||
{ "now", libinputplugin_now },
|
{ "now", libinputplugin_now },
|
||||||
{ "version", libinputplugin_version },
|
{ "version", libinputplugin_version },
|
||||||
{ "connect", libinputplugin_connect },
|
{ "connect", libinputplugin_connect },
|
||||||
|
|
@ -712,18 +685,18 @@ static const struct luaL_Reg libinputplugin_methods[] = {
|
||||||
{ "log_debug", libinputplugin_log_debug },
|
{ "log_debug", libinputplugin_log_debug },
|
||||||
{ "log_info", libinputplugin_log_info },
|
{ "log_info", libinputplugin_log_info },
|
||||||
{ "log_error", libinputplugin_log_error },
|
{ "log_error", libinputplugin_log_error },
|
||||||
|
{ "__gc", libinputplugin_gc },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct luaL_Reg libinputplugin_meta[] = { { "__gc", libinputplugin_gc },
|
|
||||||
{ "__newindex",
|
|
||||||
readonly_newindex },
|
|
||||||
{ NULL, NULL } };
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
libinputplugin_init(lua_State *L)
|
libinputplugin_init(lua_State *L)
|
||||||
{
|
{
|
||||||
setup_vfuncs(L, PLUGIN_METATABLE, libinputplugin_meta, libinputplugin_methods);
|
luaL_newmetatable(L, PLUGIN_METATABLE);
|
||||||
|
lua_pushstring(L, "__index");
|
||||||
|
lua_pushvalue(L, -2); /* push metatable */
|
||||||
|
lua_settable(L, -3); /* metatable.__index = metatable */
|
||||||
|
luaL_setfuncs(L, libinputplugin_vtable, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -1100,7 +1073,7 @@ evdevdevice_gc(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct luaL_Reg evdevdevice_methods[] = {
|
static const struct luaL_Reg evdevdevice_vtable[] = {
|
||||||
{ "info", evdevdevice_info },
|
{ "info", evdevdevice_info },
|
||||||
{ "name", evdevdevice_name },
|
{ "name", evdevdevice_name },
|
||||||
{ "usages", evdevdevice_usages },
|
{ "usages", evdevdevice_usages },
|
||||||
|
|
@ -1114,17 +1087,18 @@ static const struct luaL_Reg evdevdevice_methods[] = {
|
||||||
{ "prepend_frame", evdevdevice_prepend_frame },
|
{ "prepend_frame", evdevdevice_prepend_frame },
|
||||||
{ "append_frame", evdevdevice_append_frame },
|
{ "append_frame", evdevdevice_append_frame },
|
||||||
{ "disable_feature", evdevdevice_disable_feature },
|
{ "disable_feature", evdevdevice_disable_feature },
|
||||||
|
{ "__gc", evdevdevice_gc },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct luaL_Reg evdevdevice_meta[] = { { "__gc", evdevdevice_gc },
|
|
||||||
{ "__newindex", readonly_newindex },
|
|
||||||
{ NULL, NULL } };
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
evdevdevice_init(lua_State *L)
|
evdevdevice_init(lua_State *L)
|
||||||
{
|
{
|
||||||
setup_vfuncs(L, EVDEV_DEVICE_METATABLE, evdevdevice_meta, evdevdevice_methods);
|
luaL_newmetatable(L, EVDEV_DEVICE_METATABLE);
|
||||||
|
lua_pushstring(L, "__index");
|
||||||
|
lua_pushvalue(L, -2); /* push metatable */
|
||||||
|
lua_settable(L, -3); /* metatable.__index = metatable */
|
||||||
|
luaL_setfuncs(L, evdevdevice_vtable, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -1362,7 +1336,7 @@ libinput_lua_plugin_new_from_path(struct libinput *libinput, const char *path)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = luaL_loadfilex(L, path, "t");
|
int ret = luaL_loadfile(L, path);
|
||||||
if (ret == LUA_OK) {
|
if (ret == LUA_OK) {
|
||||||
plugin->L = steal(&L);
|
plugin->L = steal(&L);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -726,9 +726,6 @@ plugin_has_mask(struct libinput_plugin *plugin, struct evdev_frame *frame)
|
||||||
size_t nevents;
|
size_t nevents;
|
||||||
struct evdev_event *events = evdev_frame_get_events(frame, &nevents);
|
struct evdev_event *events = evdev_frame_get_events(frame, &nevents);
|
||||||
|
|
||||||
if (nevents == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* nevents - 1 because we don't check the SYN_REPORT */
|
/* nevents - 1 because we don't check the SYN_REPORT */
|
||||||
for (size_t i = 0; i < nevents - 1; i++) {
|
for (size_t i = 0; i < nevents - 1; i++) {
|
||||||
struct evdev_event *e = &events[i];
|
struct evdev_event *e = &events[i];
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
case BTN_STYLUS2:
|
||||||
|
case BTN_STYLUS3:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!libinput_tablet_tool_has_button(tool, button))
|
||||||
return LIBINPUT_CONFIG_STATUS_INVALID;
|
return LIBINPUT_CONFIG_STATUS_INVALID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return tool->config.eraser_button.set_button(tool, button);
|
return tool->config.eraser_button.set_button(tool, button);
|
||||||
}
|
}
|
||||||
|
|
@ -5239,7 +5246,7 @@ libinput_tablet_tool_config_eraser_button_get_default_button(
|
||||||
if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
|
if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return tool->config.eraser_button.get_default_button(tool);
|
return tool->config.eraser_button.get_button(tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
|
|
|
||||||
|
|
@ -348,7 +348,7 @@ enum libinput_tablet_pad_strip_axis_source {
|
||||||
* LIBINPUT_TABLET_TOOL_TYPE_PEN.
|
* LIBINPUT_TABLET_TOOL_TYPE_PEN.
|
||||||
* Use libinput_tablet_tool_get_tool_id() to get a specific model where applicable.
|
* Use libinput_tablet_tool_get_tool_id() to get a specific model where applicable.
|
||||||
*
|
*
|
||||||
* Note that on some devices, the eraser tool is on the tail end of a pen
|
* Note that on some device, the eraser tool is on the tail end of a pen
|
||||||
* device. On other devices, e.g. MS Surface 3, the eraser is the pen tip
|
* device. On other devices, e.g. MS Surface 3, the eraser is the pen tip
|
||||||
* while a button is held down.
|
* while a button is held down.
|
||||||
*
|
*
|
||||||
|
|
@ -828,7 +828,7 @@ enum libinput_event_type {
|
||||||
LIBINPUT_EVENT_POINTER_AXIS,
|
LIBINPUT_EVENT_POINTER_AXIS,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A scroll event from a wheel. This event is sent **in
|
* A scroll event from a wheel. This event is sent is sent **in
|
||||||
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
|
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
|
||||||
* event for all events with a
|
* event for all events with a
|
||||||
* libinput_event_pointer_get_axis_source() of @ref
|
* libinput_event_pointer_get_axis_source() of @ref
|
||||||
|
|
@ -843,7 +843,7 @@ enum libinput_event_type {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A scroll event caused by the movement of one or more fingers on a
|
* A scroll event caused by the movement of one or more fingers on a
|
||||||
* device. This event is sent **in addition** to the @ref
|
* device. This event is sent is sent **in addition** to the @ref
|
||||||
* LIBINPUT_EVENT_POINTER_AXIS event for all events with a
|
* LIBINPUT_EVENT_POINTER_AXIS event for all events with a
|
||||||
* libinput_event_pointer_get_axis_source() of @ref
|
* libinput_event_pointer_get_axis_source() of @ref
|
||||||
* LIBINPUT_POINTER_AXIS_SOURCE_FINGER. Ignore @ref
|
* LIBINPUT_POINTER_AXIS_SOURCE_FINGER. Ignore @ref
|
||||||
|
|
@ -857,7 +857,7 @@ enum libinput_event_type {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A scroll event from a continuous scroll source, e.g. button
|
* A scroll event from a continuous scroll source, e.g. button
|
||||||
* scrolling. This event is sent **in
|
* scrolling. This event is sent is sent **in
|
||||||
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
|
* addition** to the @ref LIBINPUT_EVENT_POINTER_AXIS
|
||||||
* event for all events with a
|
* event for all events with a
|
||||||
* libinput_event_pointer_get_axis_source() of @ref
|
* libinput_event_pointer_get_axis_source() of @ref
|
||||||
|
|
@ -1932,7 +1932,7 @@ libinput_event_touch_get_base_event(struct libinput_event_touch *event);
|
||||||
*
|
*
|
||||||
* Gesture events are generated when a gesture is recognized on a touchpad.
|
* Gesture events are generated when a gesture is recognized on a touchpad.
|
||||||
*
|
*
|
||||||
* Gesture sequences always start with a LIBINPUT_EVENT_GESTURE_FOO_BEGIN
|
* Gesture sequences always start with a LIBINPUT_EVENT_GESTURE_FOO_START
|
||||||
* event. All following gesture events will be of the
|
* event. All following gesture events will be of the
|
||||||
* LIBINPUT_EVENT_GESTURE_FOO_UPDATE type until a
|
* LIBINPUT_EVENT_GESTURE_FOO_UPDATE type until a
|
||||||
* LIBINPUT_EVENT_GESTURE_FOO_END is generated which signals the end of the
|
* LIBINPUT_EVENT_GESTURE_FOO_END is generated which signals the end of the
|
||||||
|
|
@ -1994,14 +1994,12 @@ libinput_event_gesture_get_finger_count(struct libinput_event_gesture *event);
|
||||||
*
|
*
|
||||||
* Return if the gesture ended normally, or if it was cancelled.
|
* Return if the gesture ended normally, or if it was cancelled.
|
||||||
* For gesture events that are not of type
|
* For gesture events that are not of type
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END,
|
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END or
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END, or
|
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END, this function returns 0.
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_HOLD_END, this function returns 0.
|
|
||||||
*
|
*
|
||||||
* @note It is an application bug to call this function for events other than
|
* @note It is an application bug to call this function for events other than
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END,
|
* @ref LIBINPUT_EVENT_GESTURE_SWIPE_END or
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END, or
|
* @ref LIBINPUT_EVENT_GESTURE_PINCH_END.
|
||||||
* @ref LIBINPUT_EVENT_GESTURE_HOLD_END.
|
|
||||||
*
|
*
|
||||||
* @return 0 or 1, with 1 indicating that the gesture was cancelled.
|
* @return 0 or 1, with 1 indicating that the gesture was cancelled.
|
||||||
*/
|
*/
|
||||||
|
|
@ -2425,7 +2423,7 @@ libinput_event_tablet_tool_wheel_has_changed(struct libinput_event_tablet_tool *
|
||||||
* width of the device. See the libinput documentation for more details.
|
* width of the device. See the libinput documentation for more details.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2448,7 +2446,7 @@ libinput_event_tablet_tool_get_x(struct libinput_event_tablet_tool *event);
|
||||||
* width of the device. See the libinput documentation for more details.
|
* width of the device. See the libinput documentation for more details.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2502,7 +2500,7 @@ libinput_event_tablet_tool_get_dy(struct libinput_event_tablet_tool *event);
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2518,7 +2516,7 @@ libinput_event_tablet_tool_get_pressure(struct libinput_event_tablet_tool *event
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2558,7 +2556,7 @@ libinput_event_tablet_tool_get_tilt_x(struct libinput_event_tablet_tool *event);
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis in degrees
|
* @return The current value of the the axis in degrees
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2580,7 +2578,7 @@ libinput_event_tablet_tool_get_tilt_y(struct libinput_event_tablet_tool *event);
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2598,7 +2596,7 @@ libinput_event_tablet_tool_get_rotation(struct libinput_event_tablet_tool *event
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
|
@ -2632,7 +2630,7 @@ libinput_event_tablet_tool_get_size_major(struct libinput_event_tablet_tool *eve
|
||||||
* rotation must be taken into account.
|
* rotation must be taken into account.
|
||||||
*
|
*
|
||||||
* Where no rotation is available on a tool, or where rotation is zero, the
|
* Where no rotation is available on a tool, or where rotation is zero, the
|
||||||
* major axis aligns with the y axis and the minor axis with the x axis.
|
* minor axis aligns with the y axis and the minor axis with the x axis.
|
||||||
*
|
*
|
||||||
* If this axis does not exist on the current tool, this function returns 0.
|
* If this axis does not exist on the current tool, this function returns 0.
|
||||||
*
|
*
|
||||||
|
|
@ -2825,10 +2823,10 @@ libinput_event_tablet_tool_get_button_state(struct libinput_event_tablet_tool *e
|
||||||
* @ingroup event_tablet
|
* @ingroup event_tablet
|
||||||
*
|
*
|
||||||
* For the button of a @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON event, return the total
|
* For the button of a @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON event, return the total
|
||||||
* number of buttons pressed on all devices on the associated seat after
|
* number of buttons pressed on all devices on the associated seat after the
|
||||||
* the event was triggered.
|
* the event was triggered.
|
||||||
*
|
*
|
||||||
* @note It is an application bug to call this function for events other than
|
" @note It is an application bug to call this function for events other than
|
||||||
* @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON. For other events, this function returns 0.
|
* @ref LIBINPUT_EVENT_TABLET_TOOL_BUTTON. For other events, this function returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet tool event
|
* @param event The libinput tablet tool event
|
||||||
|
|
@ -3207,7 +3205,7 @@ libinput_event_tablet_pad_get_base_event(struct libinput_event_tablet_pad *event
|
||||||
* returns 0.
|
* returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet pad event
|
* @param event The libinput tablet pad event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
* @retval -1 The finger was lifted
|
* @retval -1 The finger was lifted
|
||||||
*
|
*
|
||||||
* @since 1.3
|
* @since 1.3
|
||||||
|
|
@ -3261,8 +3259,8 @@ libinput_event_tablet_pad_get_ring_source(struct libinput_event_tablet_pad *even
|
||||||
* logical orientation.
|
* logical orientation.
|
||||||
*
|
*
|
||||||
* If the source is @ref LIBINPUT_TABLET_PAD_STRIP_SOURCE_FINGER,
|
* If the source is @ref LIBINPUT_TABLET_PAD_STRIP_SOURCE_FINGER,
|
||||||
* libinput sends a terminating event with a strip value of -1 when the
|
* libinput sends a terminating event with a ring value of -1 when the
|
||||||
* finger is lifted from the strip. A caller may use this information to e.g.
|
* finger is lifted from the ring. A caller may use this information to e.g.
|
||||||
* determine if kinetic scrolling should be triggered.
|
* determine if kinetic scrolling should be triggered.
|
||||||
*
|
*
|
||||||
* @note It is an application bug to call this function for events other than
|
* @note It is an application bug to call this function for events other than
|
||||||
|
|
@ -3270,7 +3268,7 @@ libinput_event_tablet_pad_get_ring_source(struct libinput_event_tablet_pad *even
|
||||||
* returns 0.
|
* returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet pad event
|
* @param event The libinput tablet pad event
|
||||||
* @return The current value of the axis
|
* @return The current value of the the axis
|
||||||
* @retval -1 The finger was lifted
|
* @retval -1 The finger was lifted
|
||||||
*
|
*
|
||||||
* @since 1.3
|
* @since 1.3
|
||||||
|
|
@ -3406,7 +3404,7 @@ libinput_event_tablet_pad_get_key_state(struct libinput_event_tablet_pad *event)
|
||||||
* returns 0.
|
* returns 0.
|
||||||
*
|
*
|
||||||
* @param event The libinput tablet pad event
|
* @param event The libinput tablet pad event
|
||||||
* @return The delta of the axis
|
* @return The delta of the the axis
|
||||||
*
|
*
|
||||||
* @since 1.26
|
* @since 1.26
|
||||||
*/
|
*/
|
||||||
|
|
@ -3531,7 +3529,7 @@ libinput_event_tablet_pad_get_time_usec(struct libinput_event_tablet_pad *event)
|
||||||
* @ingroup event_switch
|
* @ingroup event_switch
|
||||||
*
|
*
|
||||||
* Return the switch that triggered this event.
|
* Return the switch that triggered this event.
|
||||||
* For switch events that are not of type @ref
|
* For pointer events that are not of type @ref
|
||||||
* LIBINPUT_EVENT_SWITCH_TOGGLE, this function returns 0.
|
* LIBINPUT_EVENT_SWITCH_TOGGLE, this function returns 0.
|
||||||
*
|
*
|
||||||
* @note It is an application bug to call this function for events other than
|
* @note It is an application bug to call this function for events other than
|
||||||
|
|
@ -3667,7 +3665,7 @@ libinput_udev_create_context(const struct libinput_interface *interface,
|
||||||
* available on this seat, or if devices are available but fail to open in
|
* available on this seat, or if devices are available but fail to open in
|
||||||
* @ref libinput_interface::open_restricted. Devices that do not have the
|
* @ref libinput_interface::open_restricted. Devices that do not have the
|
||||||
* minimum capabilities to be recognized as pointer, keyboard or touch
|
* minimum capabilities to be recognized as pointer, keyboard or touch
|
||||||
* device are ignored. Such devices and those that failed to open are
|
* device are ignored. Such devices and those that failed to open
|
||||||
* ignored until the next call to libinput_resume().
|
* ignored until the next call to libinput_resume().
|
||||||
*
|
*
|
||||||
* This function may only be called once per context.
|
* This function may only be called once per context.
|
||||||
|
|
@ -3764,7 +3762,7 @@ libinput_path_remove_device(struct libinput_device *device);
|
||||||
* Paths are not traversed recursively.
|
* Paths are not traversed recursively.
|
||||||
*
|
*
|
||||||
* Plugins that have a 0 byte size shadow any plugins with the same name
|
* Plugins that have a 0 byte size shadow any plugins with the same name
|
||||||
* but do not provide any functionality. This allows disabling a plugin
|
* but do not provide any fuctionality. This allows disabling a plugin
|
||||||
* by simply dropping an empty file in a higher-priority directory.
|
* by simply dropping an empty file in a higher-priority directory.
|
||||||
*
|
*
|
||||||
* This function must be called before libinput_plugin_system_load_plugins().
|
* This function must be called before libinput_plugin_system_load_plugins().
|
||||||
|
|
@ -5840,7 +5838,7 @@ libinput_device_config_accel_apply(struct libinput_device *device,
|
||||||
* types (e.g. scrolling) may be added in the future.
|
* types (e.g. scrolling) may be added in the future.
|
||||||
*
|
*
|
||||||
* The special type @ref LIBINPUT_ACCEL_TYPE_FALLBACK specifies the acceleration
|
* The special type @ref LIBINPUT_ACCEL_TYPE_FALLBACK specifies the acceleration
|
||||||
* function to be used for any movement produced by the device that does not
|
* function to be moved for any movement produced by the device that does not
|
||||||
* have a specific acceleration type defined.
|
* have a specific acceleration type defined.
|
||||||
*
|
*
|
||||||
* Use to specify the acceleration function type in
|
* Use to specify the acceleration function type in
|
||||||
|
|
@ -5881,7 +5879,7 @@ enum libinput_config_accel_type {
|
||||||
*
|
*
|
||||||
* Each custom acceleration function is defined by ``n`` points spaced uniformly
|
* Each custom acceleration function is defined by ``n`` points spaced uniformly
|
||||||
* along the x-axis starting from 0 and continuing in a constant step size.
|
* along the x-axis starting from 0 and continuing in a constant step size.
|
||||||
* Thereby the function is defined by the following points:
|
* There by the function is defined by the following points:
|
||||||
* (0 * step, f[0]), (1 * step, f[1]), ..., ((n - 1) * step, f[n - 1]).
|
* (0 * step, f[0]), (1 * step, f[1]), ..., ((n - 1) * step, f[n - 1]).
|
||||||
* The x-axis represents the device-speed in device units per millisecond.
|
* The x-axis represents the device-speed in device units per millisecond.
|
||||||
* The y-axis represents the pointer-speed.
|
* The y-axis represents the pointer-speed.
|
||||||
|
|
@ -6626,9 +6624,7 @@ enum libinput_config_scroll_button_lock_state {
|
||||||
* If the state is
|
* If the state is
|
||||||
* @ref LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED, the button is considered
|
* @ref LIBINPUT_CONFIG_SCROLL_BUTTON_LOCK_ENABLED, the button is considered
|
||||||
* logically down after the first press and release sequence, and logically
|
* logically down after the first press and release sequence, and logically
|
||||||
* up after the second press and release sequence. If the button is held
|
* up after the second press and release sequence.
|
||||||
* and used to scroll for longer than a short grace period, releasing the
|
|
||||||
* button does not engage the lock.
|
|
||||||
*
|
*
|
||||||
* @param device The device to configure
|
* @param device The device to configure
|
||||||
* @param state The state to set the scroll button lock to
|
* @param state The state to set the scroll button lock to
|
||||||
|
|
@ -7101,7 +7097,7 @@ libinput_device_config_rotation_get_default_angle(struct libinput_device *device
|
||||||
* Check if a tablet tool can have a custom pressure range.
|
* Check if a tablet tool can have a custom pressure range.
|
||||||
*
|
*
|
||||||
* @param tool The libinput tool
|
* @param tool The libinput tool
|
||||||
* @return Non-zero if a device has an adjustable pressure range, zero otherwise.
|
* @return Non-zero if a device has an adjustible pressure range, zero otherwise.
|
||||||
*
|
*
|
||||||
* @see libinput_tablet_tool_config_pressure_range_set
|
* @see libinput_tablet_tool_config_pressure_range_set
|
||||||
* @see libinput_tablet_tool_config_pressure_range_get_minimum
|
* @see libinput_tablet_tool_config_pressure_range_get_minimum
|
||||||
|
|
@ -7375,9 +7371,14 @@ libinput_tablet_tool_config_eraser_button_get_default_mode(
|
||||||
* the eraser mode to @ref LIBINPUT_CONFIG_ERASER_BUTTON_BUTTON via
|
* the eraser mode to @ref LIBINPUT_CONFIG_ERASER_BUTTON_BUTTON via
|
||||||
* libinput_tablet_tool_config_eraser_button_set_mode().
|
* libinput_tablet_tool_config_eraser_button_set_mode().
|
||||||
*
|
*
|
||||||
|
* The buttons BTN_STYLUS, BTN_STYLUS2 and BTN_STYLUS2 are always
|
||||||
|
* allowed, even if libinput_tablet_tool_has_button() returns zero
|
||||||
|
* for the button. Otherwise, the button must be one that
|
||||||
|
* libinput_tablet_tool_has_button() returns a nonzero value for.
|
||||||
|
*
|
||||||
* @param tool The libinput tool
|
* @param tool The libinput tool
|
||||||
* @param button The button code. Must be a valid button (e.g. BTN_STYLUS)
|
* @param button The button, usually one of BTN_STYLUS, BTN_STYLUS2 or
|
||||||
* excluding fake buttons (e.g. BTN_TOOL_*) and keys (KEY_*)
|
* BTN_STYLUS3
|
||||||
*
|
*
|
||||||
* @return A config status code
|
* @return A config status code
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,12 +65,12 @@ backtrace_print(FILE *fp,
|
||||||
child = fork();
|
child = fork();
|
||||||
|
|
||||||
if (child == 0) {
|
if (child == 0) {
|
||||||
char pid[16];
|
char pid[8];
|
||||||
|
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
dup2(pipefd[1], STDOUT_FILENO);
|
dup2(pipefd[1], STDOUT_FILENO);
|
||||||
|
|
||||||
snprintf(pid, sizeof(pid), "%d", parent);
|
sprintf(pid, "%d", parent);
|
||||||
|
|
||||||
execlp("gstack", "gstack", pid, NULL);
|
execlp("gstack", "gstack", pid, NULL);
|
||||||
exit(errno);
|
exit(errno);
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@
|
||||||
#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
|
#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
|
||||||
#define NCHARS(x) ((size_t)(((x) + 7) / 8))
|
#define NCHARS(x) ((size_t)(((x) + 7) / 8))
|
||||||
|
|
||||||
/* This bitfield helper implementation is taken from libevdev-util.h,
|
/* This bitfield helper implementation is taken from from libevdev-util.h,
|
||||||
* except that it has been modified to work with arrays of unsigned chars
|
* except that it has been modified to work with arrays of unsigned chars
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -260,8 +260,6 @@ _nonnull_(1) static inline void _infmask_ensure_size(infmask_t *mask, unsigned i
|
||||||
size_t required = _infmask_size_for_bit(bit);
|
size_t required = _infmask_size_for_bit(bit);
|
||||||
if (required > mask->nmasks) {
|
if (required > mask->nmasks) {
|
||||||
mask->mask = realloc(mask->mask, required * sizeof(bitmask_t));
|
mask->mask = realloc(mask->mask, required * sizeof(bitmask_t));
|
||||||
if (!mask->mask)
|
|
||||||
abort();
|
|
||||||
/* Zero out the new memory */
|
/* Zero out the new memory */
|
||||||
for (size_t i = mask->nmasks; i < required; i++)
|
for (size_t i = mask->nmasks; i < required; i++)
|
||||||
mask->mask[i] = bitmask_new();
|
mask->mask[i] = bitmask_new();
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ stringbuf_init(struct stringbuf *b)
|
||||||
{
|
{
|
||||||
b->len = 0;
|
b->len = 0;
|
||||||
b->sz = 64;
|
b->sz = 64;
|
||||||
b->data = zalloc(b->sz);
|
b->data = calloc(1, b->sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
|
|
@ -62,7 +62,7 @@ stringbuf_reset(struct stringbuf *b)
|
||||||
static inline struct stringbuf *
|
static inline struct stringbuf *
|
||||||
stringbuf_new(void)
|
stringbuf_new(void)
|
||||||
{
|
{
|
||||||
struct stringbuf *b = zalloc(sizeof(*b));
|
struct stringbuf *b = calloc(1, sizeof(*b));
|
||||||
stringbuf_init(b);
|
stringbuf_init(b);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
@ -121,7 +121,7 @@ stringbuf_ensure_space(struct stringbuf *b, size_t sz)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Append the data from the fd to the string buffer.
|
* Append the the data from the fd to the string buffer.
|
||||||
*/
|
*/
|
||||||
static inline int
|
static inline int
|
||||||
stringbuf_append_from_fd(struct stringbuf *b, int fd, size_t maxlen)
|
stringbuf_append_from_fd(struct stringbuf *b, int fd, size_t maxlen)
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
}, )
|
}, )
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue