探索Syngestures:Linux多触控协议用户空间守护程序
Syngestures是一个强大的工具,为采用Linux Multi-Touch Protocol的触摸板/触摸条驱动(如xf86-input-synaptics
)提供多手势支持。这个项目的灵感来源于对Linux上更流畅、自然的多点触控体验的追求,它在X11和Wayland生态中的位置至关重要。深入了解开发背景和其在X11/Wayland环境中的作用。
目的与设计
Syngestures是一个后台应用程序,监听来自你的触摸板或触摸条的输入事件,检测并识别出执行的多触控手势。你可以全局或按用户配置,当特定手势被识别时执行预定义的动作,并且针对每个设备都可以设置独特的配置(如果你有多个触摸板的话)。
它可以单独使用,但更常见的是配合桌面环境/显示服务器集成/驱动一起使用,特别是与xf86-input-synaptics
在X11下结合,以实现最响应和“自然”的光标移动和加速。
依赖性
预编译的Syngestures二进制文件是静态编译的,没有运行时依赖。从源码构建通常会产生对libevdev
的依赖,这在任何现代Linux发行版中应该已经安装好了。
安全注意事项
根据你的系统配置,你可能需要添加udev规则或者确保你的用户账户属于某个特定组,才能无root权限运行syngestures
。不建议以root权限或使用sudo
运行Syngestures,因为它允许在响应触摸手势时执行任意命令。
查看“故障排除”部分获取更多详细信息。
安装
对于带有标记的Syngestures版本,可以从中获取预构建的二进制包(见右侧栏)。它是用Rust语言编写,需要一个有效的Rust工具链和功能齐全的C编译器来从源码构建:
git clone https://github.com/mqudsi/syngesture.git
cd syngesture
cargo install --path .
或者直接通过cargo下载、构建并安装:
cargo install syngestures
若要构建用于调试的日志记录版本,需要使用cargo install syngestures --features logging
(如果克隆了git仓库,则进入目录后使用cargo install --path . --features logging
代替)。
配置
Syngestures通过一个或多个TOML配置文件进行配置,示例文件已包含在这个存储库中。配置文件可以在机器级别安装到/usr/local/etc/syngestures.toml
,或者在/usr/local/etc/syngestures.d/*.toml
下使用多个设备配置文件,也可以在用户级别使用一个配置文件在$HOME/.config/syngestures.toml
,或在$HOME/.config/syngestures.d/*.toml
下使用多个设备配置文件。支持多个文件合并,相同输入设备的用户配置文件会覆盖系统配置文件。
请注意,如果你作为系统服务或root运行syngestures
,你只能使用全局配置路径(而不是以$HOME
开头的那些)。
配置文件的基本格式如下,每输入设备有一个[[device]]
节点:
[[device]]
device = "/dev/input/by-path/pci-0000:00:15.0-platform-i2c_designware.0-event-mouse"
gestures = [
# 导航下一个
{ type = "swipe", direction = "right", fingers = 3, execute = "xdotool key alt+Right" },
# 导航前一个
{ type = "swipe", direction = "left", fingers = 3, execute = "xdotool key alt+Left" },
# 切换至下一个工作区
{ type = "swipe", direction = "right", fingers = 4, execute = "xdotool key Super_L+Right" },
# 切换至上一个工作区
{ type = "swipe", direction = "left", fingers = 4, execute = "xdotool key Super_L+Left" },
]
设备的device
值应为稳定的设备路径,常常可以从dmesg
输出中找到。如果你使用Wayland,可以将xdotool
替换为支持你所用的显示服务器/合成器/窗口管理器的替代品。
每个手势的type
可设为swipe
或tap
,都需要一个数字参数fingers
(范围1到5),swipe
类型还需一个额外的方向参数(右、左、上、下)。
故障排除
如果你遇到类似以下错误(设备路径取决于你在syngestures.toml
中设置的路径):
/dev/input/by-path/pci-0000:00:15.0-platform-i2c_designware.0-event-mouse: Permission denied (os error 13)
则你的账户没有足够的权限打开输入设备并监听事件。以root权限运行syngestures
(sudo syngestures
)可以避免这个问题,但这不是一个推荐的解决方案,因为syngestures
可以响应手势执行任意命令,你不希望这些命令以root权限运行。
通常正确解决这个问题只需将你的账户添加到input
组并重启,但我们可以通过检查输入设备的所有权来确定这一点(输入设备就是你在syngestures.toml
中或错误消息中的路径)。
首先,使用realpath
针对syngestures.toml
或错误消息中的原始路径做转换,比如从上述错误消息中:
$ realpath /dev/input/by-path/pci-0000:00:15.0-platform-i2c_designware.0-event-mouse
/dev/input/event4
如你所见,在这个例子中,我们的/dev/input/by-path/...
设备实际上是一个指向另一个设备的符号链接,所以/dev/input/event4
是我们需要检查所有权的真实路径。我们将使用ls -al
来找出它是由谁所有:
$ ls -al /dev/input/event4
crw-rw---- 1 root input 13, 68 Feb 11 16:16 /dev/input/event4
(你可以一次完成这个操作,如果喜欢的话,用ls -al $(realpath <original path>)
)
这里的第三列是拥有者(root
),第四列是拥有组(input
)——我们正在寻找的。我们需要把我们的账户添加到这个组,以赋予我们打开输入设备并监听手势的权限,将下面代码中的input
替换为你ls -al
输出中的拥有组名(如果有不同的话):
$ sudo usermod -aG input $(whoami)
必须重启后该更改才会生效。然后你可以再次尝试运行syngestures
看会发生什么。
许可证
Syngestures由Mahmoud Al-Qudsi开发并维护,作为开源软件发布,受MIT许可证保护,版权Mahmoud Al-Qudsi(c)2020-2023。
通过以上简要介绍,你应该对Syngestures有了全面了解。它的强大在于能够自定义多种手势操作,让Linux用户体验到现代化的多触控交互方式。无论是日常办公还是娱乐,都能感受到这一工具带来的便利性。快来尝试使用这个强大的开源项目,提升你的Linux触控体验吧!