libinput

来自 ArchWiki

来自 libinput wiki 页面

libinput 是一个用于处理 Wayland 合成器中输入设备的库,并提供通用的 X.Org 输入驱动程序。它提供设备检测、设备处理、输入设备事件处理和抽象,以最大限度地减少合成器需要提供的自定义输入代码量,从而实现用户期望的通用功能集。

X.Org 输入驱动程序支持大多数常规的输入设备。特别值得注意的是该项目的目标是为触摸板和触摸屏提供高级触摸(多点触控和手势)功能支持。有关更多信息,请参阅libinput 文档

安装

如果您安装了 XorgWayland,则 Libinput 应该已经作为依赖项安装;没有必要的额外软件包。

  • 对于 Waylandlibinput 软件包应作为您使用的任何具有 Wayland 的图形环境的依赖项安装,并且不需要额外的驱动程序。
  • 对于 Xorgxf86-input-libinput 也是一个依赖项。它是“libinput 的一个薄封装,允许在 X 中将 libinput 用于输入设备。此驱动程序可用作 evdev 和 synaptics 的替代品。” [1]。它取代了用于 X 输入的其他软件包(即,那些以 xf86-input- 为前缀的软件包)。
    • 您可能需要安装 xorg-xinput 以便能够在运行时更改设置。

配置

对于 Wayland,没有 libinput 配置文件。可配置选项取决于您的桌面环境对其支持的进度(请参阅#图形工具)或通过应用与桌面无关的 udev 规则(请参阅校准触摸屏#通过 udev 规则自动执行#通过 Udev 规则)。要配置您的桌面环境尚不支持的选项(例如,GNOME 上的触摸板滚动速度),可以使用 libinput-config-gitAUR 作为一种变通方法。该工具的可用选项记录在 libinput-config README 中。

对于 Xorg,包装器的默认配置文件安装在 /usr/share/X11/xorg.conf.d/40-libinput.conf。无需额外的配置即可自动检测键盘、触摸板、轨迹点和支持的触摸屏。

通过 Xorg 上的 xinput

首先,执行

# libinput list-devices

它将输出系统上的设备及其 libinput 支持的各自功能。

重启图形环境后,如果没有配置其他驱动程序优先,设备应由 libinput 使用默认配置进行管理。

有关要设置的常规选项和有关允许值的信息,请参阅 libinput(4)xinput 工具用于查看或更改特定设备在运行时可用的选项。例如

$ xinput list

查看所有设备并确定其名称和编号。在下文中,device 是标识要操作的设备的名称或编号。

$ xinput list-props device

查看和

$ xinput set-prop device option setting

更改设置。option 可以是选项的编号或名称。例如,要设置 libinput 点击方法启用 (303) 的两个选项,可以发出以下任一命令

$ xinput set-prop 14 303 1 1

$ xinput set-prop 14 "libinput Click Method Enabled" 1 1

通过 Xorg 配置文件

有关永久选项设置,请参阅 Xorg#使用 .conf 文件罗技轨迹球鼠标#libinput#轻击按钮重映射 说明了一些示例。

用于 Xorg#输入设备 的替代驱动程序通常可以并行安装。如果您打算切换设备的驱动程序以使用 libinput,请确保 /etc/X11/xorg.conf.d/ 中没有其他驱动程序的旧配置文件优先。

提示
  • 如果您并行安装了 libinput 和 synaptics 且使用默认配置(即 /etc/X11/xorg.conf.d 中没有任一驱动程序的文件),由于其在默认安装目录中较高的数字顺序 70-,synaptics 将优先。为了避免这种情况,您可以将默认 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#使用 .conf 文件。如果您想禁用 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 中的配置详细信息以获得指导,并参阅 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":轻击,也称为点击触摸
  • Option "ClickMethod" "clickfinger":触控板不再具有中间和右键区域,而是双指点击为上下文点击,三指点击为中键点击,请参阅 文档
  • Option "NaturalScrolling" "true":自然(反向)滚动
  • Option "ScrollMethod" "edge":边缘(垂直)滚动

请记住,其中一些可能仅适用于某些设备,您需要重启 X 才能使更改生效。

通过 Udev 规则

本文或章节需要语言、wiki 语法或样式改进。请参阅 Help:Style 以获取参考。

原因: 这看起来不像是一种通用的配置方法,实际上可以通过这种方式设置的不仅仅是 LIBINPUT_CALIBRATION_MATRIX。(在 Talk:Libinput 中讨论)

主要的 udev校准触摸屏 文章有更多详细信息,但总结如下

# libinput list-devices

记下相关输入设备的设备:名称和内核路径。例如,这可能是路径 /dev/input/event0 上的 HID 02eb:114e

为该设备创建规则。例如,将所有触摸屏输入旋转 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"
提示: 查看 Libinput 文档通过 Udev 进行静态设备配置标题,了解其他坐标变换。

然后,重新加载规则并测试以查看您的设备是否已注册该规则

# udevadm info /dev/input/event0

您应该在那里看到为设备列出的 LIBINPUT_CALIBRATION_MATRIX

最后,重启您的机器或重启您的 Wayland 桌面。

图形工具

有不同的 GUI 工具

  • GNOME:
  • Cinnamon:
    • 类似于 GNOME 用户界面,但选项更多。
  • MATE:
    • 设置面板中提供了鼠标选项。也可以使用 mate-mouse-properties 访问
  • KDE Plasma:
    • 可以在系统设置中配置键盘、鼠标和控制器设备。
  • Xfce:

技巧与诀窍

轻击按钮重映射

交换触摸板的双指和三指轻击是一个简单的示例。您可以配置双指轻击粘贴而不是默认的三指轻击粘贴,方法是在您的 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 编号及其按钮映射都将不同。因此,设置不是直接可互换的。

提示: 您可以使用 xev(来自 xorg-xev 软件包)来找出哪个物理按钮当前映射到哪个 ID。

本文或章节需要语言、wiki 语法或样式改进。请参阅 Help:Style 以获取参考。

原因: 本节的其余部分对于不同设备的参数来说过于复杂。独特的想法应分为小节,以使其更具可读性。(在 Talk:Libinput 中讨论)

某些设备在同一设备名称下出现多次,但暴露的按钮数量不同。以下是通过 xinitrc 可靠地更改罗技 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 配置文件来做到这一点。此示例中使用的轨迹球具有物理滚轮,没有滚轮的设备可能需要参考 罗技轨迹球鼠标 的配置。Kensington Slimblade 轨迹球布局中的物理按钮是

-----------
|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

更改触摸板灵敏度

[2] 上游文档中可以找到查找 libinput 何时将触摸注册为 DOWN 和再次 UP 的正确阈值的方法。

可以通过临时的本地设备怪癖设置自定义的触摸板压力值。请参阅 [3]

注意: 怪癖是一个内部 API,不能保证在未来的 libinput 版本中工作。在 1.11 和 1.12 版本之间,udev 规则 [4].quirk 文件 [5] 取代。

禁用设备

使用环境变量

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",使用来自 lsusb 的 ID。

创建文件后,udev 将自动获取更改(请参阅 Udev#加载新规则);您只需重新连接设备即可使更改生效。

使用 xinput

要禁用触摸板等设备,首先使用 xinput list 获取其名称,然后使用 xinput disable name 禁用它。

注意
  • 按名称禁用它比按 ID 编号禁用它更可靠。设备可能会重新编号。
  • 如果名称包含空格,则需要用引号引起来。

要使其永久生效,请参阅 自启动

要切换,请编写一个脚本,例如 [7]

手势

虽然 libinput 驱动程序已经包含处理高级多点触控事件(如滑动和捏合 手势)的逻辑,但 桌面环境窗口管理器 可能尚未实现所有这些手势的操作。

libinput-gestures

对于 EWMH(另请参阅 wm-spec)兼容的窗口管理器,同时可以使用 libinput-gestures 实用程序。该程序从触摸板读取 libinput 手势(通过 libinput debug-events),并根据配置文件将其映射到手势。因此,它在 libinput 内置识别的范围内提供了一定的灵活性。

要使用它,请安装 libinput-gesturesAUR 软件包。您可以使用默认的系统范围配置的滑动和捏合手势,或在个人配置文件中定义自己的手势,有关详细信息,请参阅 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 gemxdotool(用于 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)来说是冲突的,Inkscape 具有需要在按下按键时进行鼠标移动的快捷键。您可以通过将以下行添加到 /etc/X11/xorg.conf.d/30-touchpad.confInputClass 部分来禁用此功能

Section "InputClass"
    ...
    Option "DisableWhileTyping" "0"
EndSection

故障排除

首先,查看执行 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 命令行工具或您选择的图形前端来调整设置。例如,如果您希望为您的用户启用轻击并禁用自然滚动,请像下面这样调整触摸板键值

$ gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true
$ gsettings set org.gnome.desktop.peripherals.touchpad natural-scroll false

惯性滚动在 KDE 中不起作用

该功能目前尚未实现,请参阅 KDE 错误 456383。作为基于 Chromium 的浏览器的解决方法,请安装 SmoothScroll 扩展。

进入平板模式后按键卡住

在某些平板电脑(特别是联想 Yoga)上,在进入平板模式时按住键盘按键可能会导致按键卡住,直到平板模式被禁用。有时可以通过修改 libinput 怪癖文件来修复此行为。请参阅 问题 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 指令的信息,请查阅 设备怪癖。通常可以根据您的特定设备的现有怪癖条目创建覆盖文件。默认的怪癖文件可以在 /usr/share/libinput/ 中找到。

参见