libinput (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

翻译状态:本文是 Libinput翻译。上次翻译日期:2021-04-16。如果英文版本有所更改,则您可以帮助同步翻译。

来自libinput wiki 项目

libinput 是一个函数库,在 Wayland 上用来接收设备的输入,在 X.Org 上提供输入设备的驱动。它提供对设备事件的检测和接收。对输入设备信号进行处理。它提供了一些列的函数供用户使用。

需要注意的是, X.Org 输入驱动为大多数常规输入设备提供了支持,libinput 项目的目标是为触摸板和触摸屏的触摸功能(如多点触控、手势等)提供高级支持。详情请参见 libinput 文档

安装

在 Wayland 上使用 libinput 一般不需要手动安装。libinput 包是所有 Wayland 图形环境的依赖包并且已经安装,也不需要额外的驱动。

如果想要在 Xorg 上使用 libinput,需要安装 xf86-input-libinput 包。这是 libinput 的一个包装(wrapper),能够使 libinput 用于 X 上的输入设备。同时此驱动可以作为 evdev 和 synaptics 的替代品 [1]。也就是说,其他用于 X 输入的软件包(即以 xf86-input- 为前缀的软件包)都可以使用这个驱动替换

你可能还要安装 xorg-xinput 以便在程序运行时更改设置。

配置

Wayland 上, 没有关于 libinput 的配置文件。 可配置内容由你使用的桌面环境对 libinput 的支持情况决定。详情请见 #图形工具 部分。

对于 Xorg, 默认的配置文件安装在 /usr/share/X11/xorg.conf.d/40-libinput.conf。一般没有必要使用额外的配置文件来检测键盘,触摸板,指点杆(小红点)和触摸屏。

使用 xinput

首先,执行:

# libinput list-devices

这将会输出系统中的设备和它们被 libinput 支持的具体特性。

重启图形环境之后,如果没有其它驱动程序被配置为优先,设备应由具有默认配置的 libinput 管理。

参见 libinput(4) 了解可设定的常规选项和一些参数信息。xinput 工具用于查看或更改运行中的特定设备的设置。例如:

查看所有设备并确定其名称和编号:

$ xinput list

查看 device 的设置 (在下文中,device 表示要操作的设备的名称或编号):

$ xinput list-props device

修改 device 的某项设置:

$ xinput set-prop device option setting

上文中 optioin 既可以是设置项的名称,也可以是其对应编号。 例如,修改“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#libinput#设置按键映射 中列举了几个例子。

Xorg#Input devices 的替代驱动程序通常可以同时安装。如果您打算将一个设备的驱动程序切换到 libinput,请确保没有在 /etc/X11/xorg.conf.d/ 的配置文件中为其它驱动程序配置优先。

提示: 如果你同时安装了 libinput 和 synaptics 并使用其默认配置(即 /etc/X11/xorg.conf.d/ 中没有属于两者中任一的文件),synaptics 将因其在默认安装目录中拥有更高的数字顺序 70- 而获得较高优先级。为了避免这种情况,您可以将默认的 libinput 配置文件(40-libinput.conf)符号链接到目录搜索顺序优先于 70-synaptics.conf/etc/X11/xorg.conf.d/ 中去取代它:
# 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 中的详细配置以获取指导并参考 libinput(4) 手册页获取有关可用配置选项的详细说明

一个基本的配置应该遵循以下的结构:

/etc/X11/xorg.conf.d/30-touchpad.conf
Section "InputClass"
    Identifier "devname"
    Driver "libinput"
    ...
EndSection

你可以在单个配置文件中定义任意多的 Section(通常每个输入设备只配置一个 Section) 要配置你选择的设备,请指定 xorg.conf(5) § INPUTCLASS SECTION 中的一个过滤器,例如:

  • MatchIsPointer "on" (trackpoint)
  • MatchIsKeyboard "on"
  • MatchIsTouchpad "on"
  • MatchIsTouchscreen "on"

输入设备能够在 CONFIGURATION 中进行配置,详情请看 libinput(4) § CONFIGURATION。一些常用的配置选项有:

  • Option "Tapping" "on": 触摸以点击
  • Option "ClickMethod" "clickfinger": 触摸板不再拥有中右键区域的区分,与之代替的是双指代表右键,三指代表中键。 详情请看docs.
  • Option "NaturalScrolling" "true": 自然滚动(反方向滚动)
  • Option "ScrollMethod" "edge": 边缘滚动页面

注意:有的功能只在特定设备中起作用,并且你可能需要重启 “X服务” 来让功能生效。

图形工具

下面列出了一些图形工具:

  • GNOME:
  • Cinnamon:
    • 与 GNOME 界面相似,可更改选项更多。
  • KDE Plasma 5:
    • 键盘,鼠标和控制器可以通过系统设置(System Settings)配置。
  • Xfce
    • xfce4-settings 下的“鼠标和触摸板(Mouse and Touchpad)”子菜单中进行配置。
  • MATE:
    • 你可以在 MATE 的控制面板中配置鼠标相关内容,也可以使用 mate-mouse-properties

使用技巧

交换多指点击动作

本小节以交换触摸板的两指点击与三指点击动作为例进行说明。

为了使用两指点击来替代三指点击的动作,需要修改 Xorg 配置文件中 TappingButtonMap 选项。如果希望将单指、两指、三指点击对应的动作分别对应为左键、右键、中键(left/right/middle)点击,将 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 可以是 xinput list 命令返回的设备名或者设备ID。你可以随意交换按钮对应的数字并写回。例如:

$ xinput set-button-map device 1 6 3 4 5 0 7

在上面的例子中,我们将编号为6的按钮设置为了中键,并为原本的中键配置了按键0以禁用该按键。 关于按键映射的内容可以参阅libinput(4)的“ButtonMapping”部分。 也许在 Wayland 中这种修改方式同样适用,但是需要注意的是,device 的编号与 button-map 也许互不相通。因此在 Xorg 与 Wayland 的设置并不能直接交换。

提示: 你可以使用命令 xev(包含于软件包 xorg-xev)来查看物理按键对应的逻辑按键编号。

在列出设备时,某些设备可能会以相同的设备名被多次列出,但是他们往往对应着不同的按键映射,因此准确修改按键映射需要辨别真正需要修改按键映射的设备。下面是一个通过 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
...

更改触摸板灵敏度

寻找触摸板适合的灵敏度阈值的方法可以参考上游文档[2]

自定义触摸板的按压灵敏度可以通过“temporary local device quirks”实现,参见 device-quirks 文档[3]

注意:

Quirks 是一组内部API(internal API),并不保证能够在未来版本的 libinput 中正常工作。 在libinput 1.11 到 1.12 版本中,udev规则[4].quirk文件[5]取代。

禁用触摸板

禁用触摸板需要先使用命令 xinput list 获取触摸板名称,之后使用命令 xinput disable name 来禁用。

注意:
  • 使用设备ID来禁用设备是一种相对较为鲁莽的行为,因为设备ID可能被重新分配。
  • 当设备名中包含空格时,需要使用英文引号将其包含在内。

如果希望其在系统启动时生效,参见 自动启动 相关内容。

可以编写相应脚本来启用/禁用触摸板[6]

手势操作

虽然 libinput 已经提供了手势操作,比如:捏、滑。但部分桌面环境(DE)窗口管理器(WM)可能还没有支持这些功能。

libinput-gestures

对于兼容 EWMH(另见 wm-spec)的窗口管理器(WM), 可以使用 libinput-gestures 。 程序从 libinput 获取触摸板的手势 (通过 libinput debug-events) ,然后根据相关配置将其映射成相对应的行为。这个程序提供了相当多了可自定义的功能。

要使用 libinput-gestures, 请安装 libinput-gesturesAUR 。 你能使用很多系统级别的手势操作,也能自定义配置文件,详情请看 README

fusuma

Fusuma 是一个使用 Ruby 编写的多点手势识别器(multitouch gesture recognizer),可以作为 libinput-gestures 的替代品。

使用 Ruby gem 安装 fusuma

$ gem install fusuma

或者可以从 AUR 安装:ruby-fusumaAUR

除了 fusuma 模块,还需要安装Ruby模块 fusuma-plugin-sendkey 或者从 xdotool(用于X)与 ydotoolAUR 中任选其一。其他可选择的工具可以参见项目说明

提示: fusuma-plugin-sendkey 模块同时支持 X 和 Wayland.

fusuma 安装完成后可以在配置文件 ~/.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 适用的配置同上。

适当配置滑动阈值(swip threshold)可以避免在滚动时划过过多页面。

需要注意的是该配置仅适用于三指滑动,并不适用于两指滑动[7]

Gebaar

Gebaar 是另一个手势识别器(gesture recognizer)。与 Fusuma 相比,gebaar 不支持“捏”的手势(该手势支持已经被加入开发计划中)和阈值配置,但是增加了四指、五指滑动手势与斜线滑动。

gebaar的一份fork可以使用AUR安装:gebaar-libinput-gitAUR,这一版本的gebaar适配了“捏”的手势以及一些其他功能。该版本当前正处于积极开发的状态,但是配置文件与gebaar原始版本不兼容。

GnomeExtendedGestures

对于 GNOME 环境,可以尝试 GnomeExtendedGesturesgnome-shell-extension-extended-gestures-gitAUR)。 使用该工具可以将三指水平和垂直滑动对应动作配置为相关 gnome-shell actions(例如切换应用视图或在应用间切换)。

使用鼠标按键实现滚动

通过配置,在按住某个鼠标按键(例如左键或者右键,或者鼠标上的其他按键)的同时移动鼠标,可以实现滚动页面的动作,这对于轨迹球之类没有滚轮的设备十分有帮助。只需要将 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,而且你可以通过如下方法配置滚动缩放(set a scaling factor):

$ xinput --set-prop 'RAPOO Rapoo 2.4G Wireless Device' 'libinput Scroll Distance Scale' 2.5 2.5

上述命令中,RAPOO Rapoo 2.4G Wireless Device 是你的鼠标在 xinput --list 输出中展示的设备名,2.5 2.5 是缩放比例,分别对应 x 和 y 方向。

或者你可以选择安装 libinput-multiplierAUR 并重启 Xorg,之后将y轴滚动距离配置为6倍:

$ echo 6 > /tmp/libinput_discrete_deltay_multiplier

这个示例展示了如何在焦点发生变化时调整滚动缩放。

疑难解答

当遇到libinput相关问题时,可以尝试使用 libinput debug-events 来帮助你进行调试,相关内容请参考 libinput-debug-events(1)

一些输入事件需要内核支持,查看支持的输入事件可以安装软件包 evemu,使用工具 evemu-describe 进行确认。

触摸板在 GNOME 中无法工作

首先需要确认触摸板的事件倍正确的发送给了 GNOME 处理,可以执行下面的命令:

$ gsettings set org.gnome.desktop.peripherals.touchpad send-events enabled

此外,GNOME 可能会重载部分行为,例如关闭轻触点击和强制使用自然滚动(Natural Scrolling)。 如果希望进行修改,必须使用 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

参阅