增强 Linux 触摸板手势:实现“三指拖拽”
内容提要
作者用 Rust 开发了 ferstar/gestures 工具,在 Linux 上实现 macOS 式三指拖拽。它直接调用 libinput API 以避免外部命令延迟,并自动识别 X11/Wayland:X11 使用 libxdo,Wayland 使用 ydotool。实测 CPU 占用低于 1%,内存不足 5MB。文章还介绍了依赖安装、KDL 配置、systemd 服务及权限设置。
延伸解读
实现路径的权衡
文章对比了两种实现方式:解析 libinput debug-events 后调用外部命令,或直接调用 libinput API。前者开发快但拖拽时延迟高,因为每个移动事件都需通过 shell 转发;后者延迟低、资源占用少,但实现更复杂。作者选择 Rust 直接调用 API,以换取更流畅的拖拽体验。
资源占用与性能表现
在持续拖拽窗口的测试中,该实现 CPU 占用约 1%,内存不足 5MB,二进制小于 2MB。相比原实现 5%~10% 的 CPU 占用,以及部分 Python/Ruby 方案超过 20% 的情况,资源消耗显著降低。对于常驻后台的桌面辅助工具,这种低开销意味着几乎不影响系统性能。
配置与权限要点
配置使用 KDL 格式,可设置加速度和 mouse_up_delay 等参数。mouse_up_delay 控制抬手后延迟释放鼠标,避免轻微抬手导致窗口掉落。安装为 systemd 用户服务后,若遇权限错误,需将用户加入 input 组并重新登录,以便读取输入设备。
Q&A
如何在 Linux 上实现类似 macOS 的三指拖拽功能?
可以使用 ferstar/gestures 工具。它基于 Rust 开发,直接调用 libinput API 处理手势,在 X11 下通过 libxdo 模拟鼠标事件,在 Wayland 下通过 ydotool 实现拖拽。安装后配置 KDL 文件并作为 systemd 用户服务运行即可。
ferstar/gestures 相比其他 Linux 手势工具有什么优势?
主要优势是低延迟和低资源占用。它直接调用 libinput API,避免了通过外部命令转发事件带来的延迟;在 X11 上直接使用 libxdo API,在 Wayland 上集成 ydotool 并限制为 60 FPS。实测 CPU 占用低于 1%,内存不足 5MB,二进制小于 2MB。
ferstar/gestures 的安装步骤是什么?
首先安装依赖:Ubuntu/Debian 需安装 libudev-dev、libinput-dev、libxdo-dev、xdotool,Wayland 还需 ydotool;Arch Linux 安装 libinput、xdotool,Wayland 安装 ydotool。然后下载预编译二进制或从源码安装(cargo install --git https://github.com/ferstar/gestures.git)。最后配置并作为 systemd 用户服务运行。
如何配置 ferstar/gestures 实现三指拖拽和四指切换工作区?
配置文件使用 KDL 格式。三指拖拽配置示例:gesture "drag" swipe any { fingers 3 acceleration 1.0 mouse_up_delay 500 }。四指上滑切换工作区:gesture "switch-workspace-up" swipe up { fingers 4 exec "xdotool" "key" "super+Page_Up" }。
运行 ferstar/gestures 时遇到权限错误怎么办?
权限错误通常是因为用户无法读取输入设备。将用户加入 input 组:sudo usermod -aG input $USER,然后注销并重新登录即可。
ferstar/gestures 在 X11 和 Wayland 下分别如何工作?
工具会自动检测显示服务器类型。在 X11 下,它直接调用 libxdo API 来模拟鼠标和键盘事件;在 Wayland 下,它通过 ydotool 守护进程实现,并进行了 60 FPS 节流以优化性能。