Mar 2019 [EN||]

优化 Linux 上触摸板的使用体验

Windows 的触摸板手势可用性随着 Windows 10 的铺开愈来愈高,不仅手势的样式较前更为多样,而且顺滑度也不容置疑地有了很大的提升。相比之下,优化在桌面乏力的 Linux 在触摸板的体验,就成了生存在 Linux 用户和笔记本用户两者并集的使用者需要操心的问题了。下文主要围绕 Wayland 自带的 libinput 而不讨论 synaptics 等替代方案。另外,本人对 libinput 的 Archwiki 中文词条 做了一些微小的贡献,可以配合食用。

编辑触摸板相关 Xorg 配置文件

Linux 的输入设备的配置文件都存储在 /etc/X11/xorg.conf.d/30-touchpad.conf 顾名思义为触摸板的配置信息。将其复制到 /usr/share/X11/xorg.conf.d/ 进行修改。此时可以引用 40-libinput.conf 的基本框架,按照以下配置格式

Section "InputClass"
    Identifier "touchpad"
    Driver "libinput"
    Option "Tapping" "on"
    Option "NaturalScrolling" "true"
    Option "ClickMethod" "clickfinger"
EndSection

其中 Option "Tapping" "on" 开启了触摸板的触摸点按操作。不用再按下触摸板;Option "NaturalScrolling" "true" 则还原了更为 Natural 的滚动方向,让你得以梦回 Windows;Option "ClickMethod" "clickfinger" 就开启「双指点按即右键单击,三指点按即中键单击」的选项。

除此之外 libinput 提供了更多关于「点按」、「滚动」、「触摸板指针加速度」等较为丰富的选项,其它的配置选项可参见 libinput 的 man page

关于 libinput 的各种点按滚动操作,在其 文档 中有友好形象的图例帮助理解。同时,你也可以在里面看到对于其它如「小红点」、「触摸屏幕」等输入设备的配置与支持,不在本文「触摸板」的讨论范围之内,所以不议。

安装 xdotool

xdotool 是一个可以模拟键盘鼠标输入的工具。与下文提到的 libinput-gestures 包配合使用,便可以将触摸板手势绑定相应的热键或是鼠标操作,从而达到添加并优化触摸板手势的目的。

ArchWiki 中对于 Xorg 中模拟键鼠输入的推荐中,xdotool 被描述为「Very Buggy」,然而简单使用下来,我认为 xdotool 的使用十分简单且没有什么毛病(也许是我只是使用了它对键盘输入处理的部分 😂)以下是 xdotool 的基本操作

xdotool click 1
xdotool key Ctrl+L
xdotool mousemove x y
xdotool type 'string'

这可以说是非常明了的语法了。值得注意的是,对于几个特殊的按键,xdotool 是这么称呼的:「1」鼠标左键、「2」鼠标中键、「3」鼠标右键,「Left」方向左键、「Right」方向右键、「Super」Windows 徽标键、「plus」加号、「minus」减号。

xdotool 还支持窗口检索、获取窗口焦点等功能,可以实现大部分键鼠自动化的需求。

使用 libinput-gestures

安装 libinput-gestures 并将当前用户添加到 input 组,将配置文件模板 /etc/libinput-gestures.conf 复制到 ~/.config/ 下进行修改。启动 libinput-gestures-setup 进行初始化

libinput-gestures-setup start

其中 gestures 在 libinput-gestures 的认知中有 swipepinch 两种,分别对应手指在触摸板上滑动和捏合操作。众所周知,这 Ctrl+「+」Ctrl+「-」 两个热键基本可以实现大多数软件视图上的放大和缩小,习惯上我们把双指张开作放大操作,双指捏合作缩小操作,所以先添加到 ~/.config/libinput-gestures.conf

gesture pinch in 2 xdotool key Ctrl+minus
gesture pinch out 2 xdotool key Ctrl+plus

关于 pinch,你可以指定 inout 和参与动作的手指数量。同理,对于 swipe,参与动作的手指数量和滑动的四个方向(分为 Left、Right、Up、Down)也可以被指定,以下则是一个左右滑动实现在 Chrome 中切换标签页的例子

gesture swipe right 3 xdotool key Ctrl+Tab
gesture swipe left 3 xdotool key Ctrl+Alt+Tab

向右三指滑动进入下一个标签页,向左三指滑动进入上一个标签页。虽然没有相应动画反馈,但也用得顺手。

通过阅读 libinput-gestures 相关章节 对于原理的介绍得知,触摸板对于参与动作手指数量相同的 swipe 和 pinch 的区分判断并不是完全准确,所以不要配置出同手指数量的两种不同动作共存,后期体验会比较差,较大概率发生误判。特别是同手指数量滑动但是不同方向的时候,如配置双指左右滑动切换应用,很可能与双指上下滑动,也就是滚动的动作产生冲突。

更多可能性

当然,libinput-gestures 和 xdotool 并非必须配合使用,也可以使用支持键鼠输入的如 xtexvkbd,而它们的操作与 xdotool 大体上也是相同的。

以下是 xvkbd 分别实现了 鼠标左键点击Ctrl+Tab 的例子

xvkbd -no-jump-pointer -xsendevent -text '\m1'
xvkbd -no-jump-pointer -xsendevent -text '\Ct'

xte 对组合键的操作是使用 keydownkeyup 实现的。以下是 xte 实现了 Ctrl+Tab 的例子

xte keydown Control_L
xte key Tab
xte keyup Control_L

同样,你也可以直接给 libinput-gestures 绑定启动一个应用,如四指上滑呼出应用快捷入口。

遇到触摸板指针跳跃闪烁,或者手势严重误判的时候,可以尝试用以下命令重启 libinput-gestures

libinput-gestures-setup restart

感谢阅读 💗