Clickpad with Click-method=buttonareas doesn't emit BTN_RIGHT events
Summary
With my touchpad, when I choose to have the clickpad software buttons with the software button areas option, despite libinput recognises the finger touching on BUTTON_EVENT_IN_BOTTOM_R
(and also either of BUTTON_EVENT_IN_BOTTOM_L
, BUTTON_EVENT_IN_BOTTOM_M
), libinput emits POINTER_BUTTON/BTN_LEFT
events and not POINTER_BUTTON/BTN_RIGHT
or POINTER_BUTTON/BTN_MIDLE
when it should.
If the option is defined with the clickfinger behaviour, works as expected with 1/2/3 fingers touching anywhere on the touch area.
Not to be interpreted as a hardware model fault
My device is a bit damaged and its click button underneath doesn't work. This should be treated as a generic flat multitouch touchpad with no touch pressure, no touch size and no click button.
The second udev node that it has that exposes the physical button clicks (BTN_LEFT
and BTN_RIGHT
) has been succesfully disabled with a udev rule (removed ID_INPUT
, ID_INPUT_
* and added LIBINPUT_IGNORE_DEVICE
; libinput doesn't list this evdev device now). I also added a libinput quirk for this device to disable hardware events of BTN_LEFT
. No hardware events of BTN_*
have been observed on these two evdev nodes during my personal testing period, so these disablings are only to avoid phantom clicks that rarely seem to occur and may come from this (no one logged) and also to make the software description of the hardware more similar to the actual hardware supported events.
The bug is NOT related to my faulty hardware, BUT that libinput actually detects as seen on its verbose log a BUTTON_EVENT_IN_BOTTOM_R
but doesn't emit POINTER_BUTTON/BTN_RIGHT
events and emits POINTER_BUTTON/BTN_LEFT
.
Steps to reproduce
With a clickpad and a configuration of:
- The device has
INPUT_PROP_BUTTONPAD
- [The device doesn't emit
BTN_LEFT
hardware events] - Tap-to-click enabled
- Left-handed disabled [1]
- Click method selected as Button areas
When a finger touches on the BOTTOM RIGHT area (outside thumb detection area), libinput generates an internal event of BUTTON_EVENT_IN_BOTTOM_R
. The finger is quickly removed (just a tap) so it generates a new internal event of BUTTON_EVENT_UP
. A pair of external events POINTER_BUTTON/BTN_RIGHT/pressed
and POINTER_BUTTON/BTN_RIGHT/released
are expected; but external events POINTER_BUTTON/BTN_LEFT/pressed
and POINTER_BUTTON/BTN_LEFT/released
are actually emitted.
[1] Obviously, if left-handed enabled, the expected result should be the one expected with left/right changed accordingly. In the present case, if Left-handed is enabled, also POINTER_BUTTON/BTN_LEFT
is emited on any of BUTTON_EVENT_IN_BOTTOM_[L/M/R]
touches.
Required information
- libinput version: 1.19.1-1 (Debian Sid deb, amd64), happens the same on 1.15.5-1ubuntu0.2 (Ubuntu 20.04.3 LTS HWE)
- hardware information: Touchpad on the laptop Lenovo Yoga 720-13IKB; evdev event node name "MSFT0001:02 06CB:7F8F Touchpad", with hardware events of
BTN_LEFT
disabled. A evdev event node named "MSFT0001:02 06CB:7F8F Mouse" is disabled on udev -
libinput record
output: touchpad.yml -
libinput debug-events --verbose
output: libinput_debug-events.txt - Udev info of the active touchpad node: udevadm-info-touchpad.txt
-
/sys/class/dmi/id/modalias
: dmi:bvnLENOVO:bvr1YCN40WW(V2.07):bd05/25/2018:br2.40:efr2.40:svnLENOVO:pn81C3:pvrLenovoYOGA720-13IKB:skuLENOVO_MT_81C3_BU_idea_FM_YOGA720-13IKB:rvnLENOVO:rnLNVNB161216:rvrSDK0J40709WIN:cvnLENOVO:ct31:cvrLenovoYOGA720-13IKB: -
touchpad-edge-detector
: <5mm difference, ok
The quirks I have working to disable the non-fuctioning/malfunctioning physical button of the touchpad (no problems with them) and the udev info of that click-button udev node info:
- Udev info of disabled node: udevadm-info-touchpad-button-disabled.txt
- Evemu describe of disabled node: evemu-describe-touchpad-button-disabled.txt
- Udev rule (disabling the mal-functioning udev node that serves physical
BTN_LEFT
andBTN_RIGHT
events): 71-Touchpad-laptop-malfunctioning-Click-button-Udev-disable.rules - Libinput quirk (disabling physical
BTN_LEFT
events via this node): local-overrides.quirks