libinput
来自 libinput wiki 页面
- libinput 是一个用于在 Wayland 合成器中处理输入设备并提供通用 X.Org 输入驱动的库。它提供设备检测、设备处理、输入设备事件处理和抽象,以最大限度地减少合成器需要提供的自定义输入代码量,以提供用户期望的常见功能集。
X.Org 输入驱动支持大多数常规的 输入设备。特别值得注意的是,该项目旨在为触摸屏和触摸板提供高级触摸(多点触控和手势)功能支持。有关更多信息,请参阅 libinput 文档。
安装
如果您安装了 Xorg 或 Wayland,那么 Libinput 应该作为依赖项已安装;无需其他额外的软件包。
- 对于 Wayland,libinput 包应该作为您使用的任何具有 Wayland 的图形环境的依赖项安装,无需额外的驱动程序。
- 对于 Xorg,xf86-input-libinput 也是一个依赖项。它“是 libinput 的一个薄包装器,允许 libinput 用于 X 中的输入设备。此驱动程序可以作为 evdev 和 synaptics 的直接替代品。” [1]。它取代了其他用于 X 输入的软件包(即以
xf86-input-开头的软件包)。- 您可能希望安装 xorg-xinput 以便在运行时更改设置。
配置
对于 Wayland,没有 libinput 配置文件。可配置选项取决于您的桌面环境对它们的支持进度(请参阅 #图形化工具)或通过应用桌面无关的 udev 规则(请参阅 Calibrating Touchscreen#Do it automatically via a udev rule 和 #Via a udev rule)。要配置您的桌面环境尚不支持的选项(例如,GNOME 上的触摸板滚动速度),可以使用 libinput-config-gitAUR 作为一种变通方法。该工具可用的选项记录在 libinput-config README 中。
对于 Xorg,包装器的默认配置文件安装在 /usr/share/X11/xorg.conf.d/40-libinput.conf。无需额外配置即可自动检测键盘、触摸板、轨迹指针和支持的触摸屏。
通过 xinput 在 Xorg 上
首先,执行
# libinput list-devices
它将输出系统上的设备以及 libinput 支持的相应功能。
在图形环境重启后,如果没有任何其他驱动程序配置优先,设备应该由 libinput 和默认配置进行管理。
请参阅 libinput(4) 获取要设置的通用选项以及有关允许值的信息。xinput 工具用于查看或更改运行时特定设备可用的选项。例如
$ xinput list
查看所有设备并确定它们的名称和编号。在以下内容中,device 是识别要操作的设备的名称或编号。
$ xinput list-props device
查看和
$ xinput set-prop device option setting
更改设置。option 可以是选项的编号或名称。例如,要设置 libinput Click Method Enabled (303) 的两个选项,可以执行以下任一命令
$ xinput set-prop 14 303 1 1
或者
$ xinput set-prop 14 "libinput Click Method Enabled" 1 1
通过 Xorg 配置文件
请参阅 Xorg#Using .conf files 以获取永久选项设置。Logitech Marble Mouse#X11 和 #Tapping button re-mapping 提供了示例。
Xorg 输入设备的替代驱动程序通常可以并行安装。如果您打算为设备切换驱动程序以使用 libinput,请确保没有用于其他驱动程序的旧配置文件 /etc/X11/xorg.conf.d/ 具有优先权。
- 如果您并行安装了 libinput 和 synaptics 并使用默认配置(即,在
/etc/X11/xorg.conf.d中没有任一驱动程序的配置文件),synaptics 将因其在默认安装目录中较高的数字顺序70-而具有优先权。为避免这种情况,您可以将默认的 libinput 配置(40-libinput.conf)符号链接到/etc/X11/xorg.conf.d/,这样目录搜索顺序将优先于70-synaptics.conf
# ln -s /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/40-libinput.conf
- 如果您确实同时拥有两个驱动程序的
/etc/X11/xorg.conf.d/配置文件,则 libinput 文件必须排在第二位;请参阅 Xorg#Using .conf files。如果您想禁用 libinput(并回退到旧驱动程序),只需删除/etc/X11/xorg.conf.d/中先前创建的符号链接即可。
- 如果配置文件似乎没有任何效果,请检查它是否可被非特权用户读取。
检查哪些设备由 libinput 管理的一种方法是查看 xorg 日志文件。例如,以下内容
$ grep -e "Using input driver 'libinput'" /path/to/Xorg.0.log
[ 28.799] (II) Using input driver 'libinput' for 'Power Button' [ 28.847] (II) Using input driver 'libinput' for 'Video Bus' [ 28.853] (II) Using input driver 'libinput' for 'Power Button' [ 28.860] (II) Using input driver 'libinput' for 'Sleep Button' [ 28.872] (II) Using input driver 'libinput' for 'AT Translated Set 2 keyboard' [ 28.878] (II) Using input driver 'libinput' for 'SynPS/2 Synaptics TouchPad' [ 28.886] (II) Using input driver 'libinput' for 'TPPS/2 IBM TrackPoint' [ 28.895] (II) Using input driver 'libinput' for 'ThinkPad Extra Buttons'
是没有在 /etc/X11/xorg.conf.d/ 中进行任何配置文件的笔记本电脑,即设备是自动检测的。
当然,您可以选择为其中一个设备使用替代驱动程序,为其他设备使用 libinput。许多因素可能会影响使用哪个驱动程序。例如,与 Touchpad Synaptics 相比,libinput 驱动程序提供的自定义触摸板行为的选项更少,但它有更多的程序逻辑来处理多点触控事件(例如,掌部检测)。因此,如果您在硬件上遇到一个或另一个驱动程序的问题,尝试替代方案是明智的。
自定义配置文件应放置在 /etc/X11/xorg.conf.d/ 中,并遵循广泛使用的命名约定 30-touchpad.conf 通常被选作文件名。
/usr/share/X11/xorg.conf.d/40-libinput.conf 中的 CONFIGURATION DETAILS 以获取指导,并参考 libinput(4) 手册页以详细了解可用的配置选项。一个基本的配置应该具有以下结构
/etc/X11/xorg.conf.d/30-touchpad.conf
Section "InputClass"
Identifier "devname"
Driver "libinput"
...
EndSection
您可以在单个配置文件中定义任意数量的节(通常每个输入设备一个)。要配置您选择的设备,请使用 xorg.conf(5) § INPUTCLASS_SECTION 中的可用过滤器之一来指定过滤器,例如
MatchIsPointer "on"(轨迹指针)MatchIsKeyboard "on"MatchIsTouchpad "on"MatchIsTouchscreen "on"
然后可以使用 libinput(4) § CONFIGURATION_DETAILS 中的任何一行来配置输入设备。常见选项包括
Option "Tapping" "on": 点击,又名 tap-to-clickOption "ClickMethod" "clickfinger": 触摸板不再具有中间和右按钮区域,而是两指点击作为上下文点击,三指点击作为中间点击,请参阅 文档。Option "NaturalScrolling" "true": 自然(反向)滚动Option "ScrollMethod" "edge": 边缘(垂直)滚动
请注意,其中一些可能只适用于特定设备,您需要重新启动 X 才能使更改生效。
通过 udev 规则
主要的 udev 和 Calibrating Touchscreen 文章有更多细节,但总而言之
# libinput list-devices
记下相关输入设备的 Device: 名称和 Kernel 路径。例如,这可能是 HID 02eb:114e,路径为 /dev/input/event0。
为该设备创建一条规则。例如,要将所有触摸屏输入旋转 270 度
/etc/udev/rules.d/99-mytouchscreen-calibration.rules
# Do a 270 degree rotation on the input
ENV{ID_USB_SERIAL}=="02eb_114e", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"
然后,重新加载规则并测试以查看您的设备是否已注册该规则
# udevadm info /dev/input/event0
您应该在此处看到您的 LIBINPUT_CALIBRATION_MATRIX 列出了该设备。
最后,重启您的机器或重启您的 Wayland 桌面。
图形工具
有不同的 GUI 工具
- GNOME:
- 控制中心有一个基本 UI。请参阅 GNOME#Mouse and touchpad。
- gnome-tweaks 提供了一些额外的设置。
- Cinnamon:
- 类似于 GNOME UI,但选项更多。
- MATE:
- 设置面板中提供了鼠标选项。也可以通过
mate-mouse-properties访问
- 设置面板中提供了鼠标选项。也可以通过
- KDE Plasma:
- 可以从系统设置中配置键盘、鼠标和控制器设备。
- Xfce:
- 在 xfce4-settings 的鼠标和触摸板子菜单中配置。
技巧与提示
点击按钮重新映射
交换触摸板的两指和三指点击是一个直接的例子。而不是默认的三指点击用于粘贴,您可以通过在您的 Xorg 配置文件中设置 TappingButtonMap 选项来配置两指点击粘贴。要将 1/2/3 指点击设置为左/右/中,请将 TappingButtonMap 设置为 lrm,对于左/中/右,请将其设置为 lmr。
/etc/X11/xorg.conf.d/30-touchpad.conf
Section "InputClass"
Identifier "touchpad"
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
Option "TappingButtonMap" "lmr"
EndSection
请记住,如果您的设备不是触摸板,则删除 MatchIsTouchpad "on" 并相应地调整 Identifier。
手动按钮重新映射
对于某些设备,改变按钮映射是可取的。一个常见的例子是使用鼠标上的拇指按钮而不是中间按钮(在 X11 中用于粘贴),因为中间按钮是鼠标滚轮的一部分。您可以通过以下命令查询当前的按钮映射
$ xinput get-button-map device
其中 device 是设备名称或设备 ID,由 xinput list 返回。您可以自由地排列按钮编号并将其写回。例如
$ xinput set-button-map device 1 6 3 4 5 0 7
在此示例中,我们将按钮 6 映射为中间按钮,并通过将其分配给按钮 0 来禁用原始中间按钮。有关更多信息,请阅读 libinput(4) 中关于“ButtonMapping”的部分。这也可以用于 Wayland,但请注意,device 编号及其按钮映射都会有所不同。因此,设置不能直接互换。
有些设备在同一设备名称下出现多次,具有不同数量的暴露按钮。以下是通过 xinitrc 可靠地更改 Logitech Revolution MX 鼠标按钮映射的示例
~/.xinitrc
... for i in $(xinput list | grep "Logitech USB Receiver" | perl -n -e'/id=(\d+)/ && print "$1\n"') do if xinput get-button-map "$i" 2>/dev/null| grep -q 20; then xinput set-button-map "$i" 1 17 3 4 5 8 7 6 9 10 11 12 13 14 15 16 2 18 19 20 fi done ...
您也可以使用 Xorg 配置文件来执行此操作。此示例中使用的轨迹球有一个物理滚轮,没有滚轮的设备可能需要参考 Logitech Marble Mouse 的配置。Kensington Slimblade Trackball 布局中的物理按钮是
----------- |2(M)|8(S)| ----------- |1(L)|3(R)| -----------
所以,对于左手用户,您可以使用下面的配置。尽管设备没有向上滚动和向下滚动按钮,但您不能在配置文件中禁用它们,否则某些应用程序将不对滚轮的操作做出响应。
----------- |2(N)|8(M)| ----------- |1(R)|3(L)| -----------
/etc/X11/xorg.conf
Section "InputClass"
Identifier "Trackball"
MatchProduct "Kensington Kensington Slimblade Trackball"
MatchProduct "Trackball"
Driver "libinput"
Option "ButtonMapping" "3 0 1 4 5 6 7 8 2"
EndSection
更改触摸板灵敏度
在 libinput 注册触摸按下和抬起的确切阈值的方法可以在 [2] 的上游文档中找到。
可以通过临时本地设备 quirks 设置自定义触摸板压力值。请参阅 [3]。
禁用设备
使用环境变量
LIBINPUT_IGNORE_DEVICE 环境变量可用于阻止初始化特定设备。[6] 最好使用 udev 规则进行设置
/etc/udev/rules.d/99-libinput-ignore.rules
ACTION=="add|change", device_delineation, ENV{LIBINPUT_IGNORE_DEVICE}="1"
其中 device_delineation 使用 udev 语法来界定特定设备。例如,对于您想让 libinput 忽略的整个 USB 设备,您可以使用 SUBSYSTEMS=="usb", ATTRS{idVendor}=="vendor_id", ATTRS{idProduct}=="product_id",其中 ID 来自 lsusb。
创建文件后,udev 会自动识别更改(请参阅 Udev#Loading new rules);您只需重新连接设备即可使更改生效。
使用 xinput
要禁用触摸板等设备,首先使用 xinput list 获取其名称,然后使用 xinput disable name 禁用它。
- 通过名称禁用比通过 ID 号禁用更可靠。设备可能会被重新编号。
- 如果名称包含空格,则需要引用该名称。
要使其永久生效,请参阅 Autostarting。
要切换,请编写一个脚本,例如 [7]。
手势
虽然 libinput 驱动程序已经包含处理高级多点触控事件(如滑动和捏合 手势)的逻辑,但 桌面环境或 窗口管理器可能尚未为所有这些手势实现操作。
libinput-gestures
对于符合 EWMH(另请参阅 wm-spec)的窗口管理器,可以暂时使用 libinput-gestures 工具。该程序通过 libinput debug-events 读取触摸板的 libinput 手势,并根据配置文件将它们映射到手势。因此,它在 libinput 内置识别的范围内提供了一些灵活性。
要使用它,请安装 libinput-gesturesAUR 包。
libinput-gestures 需要访问触摸板设备。传统上,您可以将自己添加到 input 组来设置此项,但更现代、更安全的方法是使用 udev、logind 和 acls 动态管理访问。要使其工作,请创建一个文件
/etc/udev/rules.d/71-touchpad.rules
ACTION!="remove", ENV{ID_INPUT_TOUCHPAD}=="1", TAG+="uaccess"
文件开头的数字很重要:在索引 70 处,设备属性 ENV{ID_INPUT_TOUCHPAD} 可能会被取消设置,并且对于 systemd-logind(8),需要在索引 73 之前添加 uaccess 标签。
您可以使用默认的系统范围配置的滑动和捏合手势,或者在个人配置文件中定义自己的手势,有关详细信息,请参阅 README。
如果您使用 touchegg,请卸载 libinput-gesturesAUR 包以避免冲突(请参阅 [8])。
fusuma
Fusuma 是一个用 Ruby 编写的多点触控手势识别器,可用作 libinput-gestures 的替代品。
安装 fusuma Ruby gem
$ gem install fusuma
或者,还有 ruby-fusumaAUR。
除了 fusuma Ruby gem,您还需要安装 fusuma-plugin-sendkey Ruby gem 或者 xdotool(用于 X)和 ydotool(通用:Wayland、X11 等)之间的其中一个。其他替代方案列在 此处。
fusuma-plugin-sendkey Ruby gem 支持 X 和 Wayland然后,在 ~/.config/fusuma/config.yml 中,您需要设置类似以下内容
~/.config/fusuma/config.yml
swipe:
3:
left:
sendkey: 'LEFTALT+RIGHT'
right:
sendkey: 'LEFTALT+LEFT'
up:
sendkey: 'LEFTALT+LEFTSHIFT+TAB'
down:
sendkey: 'LEFTALT+TAB'
pinch:
in:
sendkey: 'LEFTALT+LEFTSHIFT+TAB'
out:
sendkey: 'LEFTALT+TAB'
threshold:
swipe: 0.5
pinch: 0.2
interval:
swipe: 0.2
pinch: 0.2
或者对于 xdotool
~/.config/fusuma/config.yml
swipe:
3:
left:
command: 'xdotool key alt+Right'
right:
command: 'xdotool key alt+Left'
up:
command: 'xdotool key ctrl+shift+plus'
down:
command: 'xdotool key ctrl+minus'
pinch:
in:
command: 'xdotool key ctrl+shift+plus'
out:
command: 'xdotool key ctrl+minus'
threshold:
swipe: 0.5
pinch: 0.2
interval:
swipe: 0.2
pinch: 0.2
对于 ydotool 也是如此。
滑动阈值对于避免滑动过多页面很重要。
请注意,配置是针对三指滑动的。不支持两指滑动 [9]。
Gebaar
Gebaar 是另一个手势识别器。与 Fusuma 不同,它不支持捏合(但计划在未来支持),也不支持阈值,但除了用 3/4 指向左、右、上和下滑动外,它还支持对角线滑动,而 Fusuma 不支持。
有一个 gebaar 的分支位于 Gebaar,可以通过 gebaar-libinput-gitAUR 安装,它支持捏合手势并为原始 gebaar 添加了其他功能。请注意,此版本目前正在积极开发中,并且引入了配置更改,这使其与原始 Gebaar 不兼容。
GnomeExtendedGestures
为了更深入地集成 GNOME,有 GnomeExtendedGestures(gnome-shell-extension-extended-gestures-gitAUR)。三指水平和垂直手势可以配置为执行 gnome-shell 操作(例如切换应用程序概览或在它们之间循环)。
按住按钮通过鼠标滚动
有一个很好的技巧,可以通过按住鼠标按钮(例如右键或中键,或鼠标有更多按钮时的其他按钮)并移动鼠标来优化鼠标或轨迹球的滚动。在鼠标没有鼠标滚轮(轨迹球通常是这种情况)的情况下非常有用。为此,必须为操作将 ScrollMethod 设置为 button 并指定 ScrollButton 选项中的鼠标按钮。以下是实现此目的的配置示例
/etc/X11/xorg.conf.d/00-mouse.conf
Section "InputClass"
Identifier "system-mouse"
MatchIsPointer "on"
Option "ScrollMethod" "button"
Option "ScrollButton" "3"
EndSection
鼠标滚轮滚动速度缩放
对于某些鼠标,尤其是在 HiDPI 桌面使用时,滚轮滚动太慢。已经向 libinput 提交了一个 补丁,但尚未被接受。有一个第三方 xf86-input-libinput 包含了这个补丁。
这个补丁为鼠标引入了一个新属性 libinput Scroll Distance Scale,您可以设置一个缩放因子,例如
$ xinput --set-prop 'device_name' 'libinput Scroll Distance Scale' 2.5 2.5
其中 device_name 是您的鼠标设备名称,在 xinput --list 中列出。2.5 2.5 分别是 x 和 y 轴的缩放因子。
或者,安装 libinput-multiplierAUR 并重启 Xorg,然后将 y 轴滚动距离增加到 6 倍,方法是
$ echo 6 > /tmp/libinput_discrete_deltay_multiplier
这里有一个 示例,用于在焦点改变时修改缩放因子。
打字时启用触摸板
默认情况下,libinput 会在打字时禁用触摸板。这与某些软件(如 Inkscape)冲突,后者有需要在按下按键时移动鼠标的快捷键。一种在打字时启用触摸板的方法是,在 /etc/X11/xorg.conf.d/30-touchpad.conf 的 InputClass 部分添加以下行
Section "InputClass"
...
Option "DisableWhileTyping" "0"
EndSection
使用 xinput 也可以实现相同的效果。该属性可能名为 libinput Disable While Typing Enabled。
故障排除
首先,检查执行 libinput debug-events 是否能帮助您调试问题,请参阅 libinput-debug-events(1) 获取选项。
某些输入需要内核支持。来自 evemu 包的工具 evemu-describe 可用于检查
将其输出(例如)与 支持的触摸板进行比较。即,有几个 ABS_ 轴,几个 ABS_MT 轴,没有 REL_X/Y 轴。对于点击板,还应设置 INPUT_PROP_BUTTONPAD 属性,如果支持的话。
GNOME 中触摸板不工作
通过运行以下命令,确保触摸板事件被发送到 GNOME 桌面
$ gsettings set org.gnome.desktop.peripherals.touchpad send-events enabled
此外,GNOME 可能会覆盖某些行为,例如关闭点击并强制启用自然滚动。在这种情况下,必须使用 GNOME 的 gsettings 命令行工具或您选择的图形前端来调整设置。例如,如果您希望为您的用户启用 Tapping 并禁用 Natural Scrolling,请像下面这样调整触摸板键值
$ gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true $ gsettings set org.gnome.desktop.peripherals.touchpad natural-scroll false
KDE 中惯性滚动不工作
该功能目前尚未实现,请参阅 KDE bug 456383。作为 Chromium 浏览器的一个变通方法,安装 SmoothScroll 扩展。
进入平板模式后按键卡住
在某些平板电脑(尤其是联想 Yoga)上,在进入平板模式时按住键盘按键可能会导致按键卡住,直到禁用平板模式。有时可以通过修改 libinput quirks 文件来修复此行为。请参阅 Issue 914。
例如,找到键盘设备的名称
# libinput list-devices
... Device: AT Translated Set 2 keyboard Kernel: /dev/input/event3 Capabilities: keyboard ...
然后,创建一个覆盖文件
/etc/libinput/local-overrides.quirks
[Lenovo Thinkpad Yoga] MatchName=AT Translated Set 2 keyboard ModelTabletModeNoSuspend=0
ModelTabletModeNoSuspend=0 禁用导致该错误的行为。有关配置格式和选择要配置的设备的 Match 指令的信息,请参阅 Device quirks。通常可以根据您特定设备的现有 quirks 条目创建覆盖文件。默认 quirks 文件位于 /usr/share/libinput/。
参见
- libinput Wayland 文档
- FOSDEM 2015 - libinput - Hans de Goede 讲述该项目的目标和计划
- Peter Hutterer's Blog - 项目黑客关于 libinput 的大量帖子
- 主要 libinput 维护者的演讲概述了 Linux 输入设备处理的历史和现状(截至 2020 年)
- libinput 维护者撰写的博客文章,概述了 libinput 的基本原理