2022-03-28 10:14:24 +10:00
|
|
|
.. _clickpads_with_right_buttons:
|
|
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
|
Clickpads with a fake right button
|
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
|
|
libinput relies on the kernel to label :ref:`Clickpads <touchpads_buttons_clickpads>`
|
|
|
|
|
with the ``INPUT_PROP_BUTTONPAD`` property so it can enable the correct
|
|
|
|
|
:ref:`clickpad_softbuttons`. Clickpads are not expected to have a right button
|
|
|
|
|
since the whole surface can be depressed.
|
|
|
|
|
|
|
|
|
|
A common bug encountered with :ref:`Clickpads <touchpads_buttons_clickpads>`
|
|
|
|
|
is that the device advertises a physical right button where no such button
|
|
|
|
|
exists. This is usually a bug in the firmware of the device and causes the
|
|
|
|
|
following warning to be emitted by libinput::
|
|
|
|
|
|
|
|
|
|
"<device name> clickpad advertising right button"
|
|
|
|
|
|
|
|
|
|
The user-visible effect of this is usually negligible since these devices
|
|
|
|
|
cannot actually trigger a right click and libinput's default behaviors for
|
|
|
|
|
clickpads work as expected.
|
|
|
|
|
|
|
|
|
|
However, we should nonetheless correct the device to get rid of this warning
|
|
|
|
|
and avoid potential issues with future features. The :ref:`device-quirks`
|
|
|
|
|
provide a simple way to disable the fake right button on the device. The
|
|
|
|
|
following quirk disables the right button on the MyModel laptop from the
|
|
|
|
|
MyVendor OEM::
|
|
|
|
|
|
|
|
|
|
[MyVendor MyModel Touchpad]
|
|
|
|
|
MatchName=Foo Bar Touchpad
|
|
|
|
|
MatchUdevtype=touchpad
|
|
|
|
|
MatchDMIModAlias=dmi:*svnMyVendor:pnMyModel:*
|
quirks: allow overriding of AttrEventCode and AttrInputProp
This switches the quirk from AttrEventCodeEnable/Disable to just
AttrEventCode with a +/- prefix for each entry.
This switches the quirk from AttrInputPropEnable/Disable to just
AttrInputProp with a +/- prefix for each entry.
Previously, both event codes and input props would only apply the
last-matching section entry for a device. Furthermore, an earlier Disable entry
would take precedence over a later Enable entry. For example, a set of
sections with these lines *should* enable left, right and middle:
[first]
AttrEventCodeEnable=BTN_LEFT;BTN_RIGHT;BTN_MIDDLE
[second]
AttrEventCodeDisable=BTN_RIGHT
[third]
AttrEventCodeEnable=BTN_LEFT;BTN_RIGHT;
Alas: the first line was effectively ignored (quirks only returned the
last-matching one, i.e. the one from "third"). And due to implementation
details in evdev.c, the Disable attribute was processed after Enable,
i.e. the device was enabled for left + right and then disabled for
right. As a result, the device only had BTN_LEFT enabled.
Fix this by changing the attribute to carry both enable/disable
information and merging the commands together.
Internally, all quirks matching a device are simply ref'd into an array
in the struct quirks. The applied value is simply the last entry in the
array corresponding to our quirk.
For AttrEventCode and AttrInputProp instead do this:
- switch them to a tuple with the code as first entry and a boolean
enable/disable as second entry
- if the struct quirk already has an entry for either, append the more
recent one to the existing entry (instead of creating a new entry in
the array). This way we have all entries that match and in-order of
precedence - i.e. we can process them left-to-right to end up
with the right state.
Fixes: https://gitlab.freedesktop.org/libinput/libinput/-/issues/821
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-11-15 13:53:43 +10:00
|
|
|
AttrEventCode=-BTN_RIGHT
|
2022-03-28 10:14:24 +10:00
|
|
|
|
|
|
|
|
The name of the device can be obtained using :ref:`libinput record <libinput-record>`,
|
|
|
|
|
the modalias match is a shell-style glob against the value of ``/sys/class/dmi/id/modalias``.
|
|
|
|
|
In most cases, matching should be against ``svn`` (system vendor) and one of
|
|
|
|
|
``pn`` (product name) or ``pvr`` (product version), whichever provides a
|
|
|
|
|
useful description of the individual laptop model. See the
|
|
|
|
|
:ref:`device-quirks` documentation for details on testing local quirks.
|
|
|
|
|
|
|
|
|
|
For reference, some example commits that add such a quirk are:
|
|
|
|
|
|
|
|
|
|
- `bf61ab9bb0694d0ac3d60a7f815779abfe4886e6 <https://gitlab.freedesktop.org/libinput/libinput/-/commit/bf61ab9bb0694d0ac3d60a7f815779abfe4886e6>`__
|
|
|
|
|
- `74fac6d040ac62048882dfb6f73da567ace6a6f5 <https://gitlab.freedesktop.org/libinput/libinput/-/commit/74fac6d040ac62048882dfb6f73da567ace6a6f5>`__
|
|
|
|
|
- `89cd0f990e3bee9906754d6ca8484ed5aa392249 <https://gitlab.freedesktop.org/libinput/libinput/-/commit/89cd0f990e3bee9906754d6ca8484ed5aa392249>`__
|