转用 Linux 后一直都比较怀念 macOS 上丝滑的三指拖拽效果,鉴于近几年出的 Windows 本子触控板面积以及跟手性肉眼可见的改善了很多,我觉得是时候在 Linux 上折腾下触控板手势了。
说干就干,放狗搜了一下,发现类似的实现还不少,小罗列下:
- https://github.com/riley-martin/gestures
- https://github.com/bulletmark/libinput-gestures
- https://github.com/Coffee2CodeNL/gebaar-libinput
- https://github.com/osleg/gebaar-libinput-fork
- https://github.com/iberianpig/fusuma
- https://github.com/marsqing/libinput-three-finger-drag
基本上就是两种实现思路:
- 解析
libinput debug-events
输出,判断手势进而借用类似xdotool
之类的工具发送具体的键盘组合或者鼠标点击或位移指令 - 直接调用
libinput
API,明显此方法性能最优
我最在意的手势莫过于三指拖拽,实现这个功能有两个注意的点:
- 拖拽起止会有持续不断的位移指令发出,所以通过 fork shell 不间断发送位移指令的操作是非常低效的,见这个讨论。
- 为了媲美 macOS 的丝滑拖拽效果,必须使用尽可能高效的实现。
于是乎我选择了一个 Rust 实现开抄,负责实现 API 级别的触控手势识别,然后缝合了另一个 Rust 实现,负责实现 API 级别的拖拽效果。
终极缝合以后的产物效果还不错,基本符合预期:
- CPU 占用极低(极限情况:疯狂三指拖拽某窗口,本 fork 实现 CPU 占用不到1%;原实现5~10%;Python、Ruby等实现20%+)内存占用不到5MB,程序体积不到2MB,无多余依赖
- 拖拽体验丝滑(如果觉得不够滑,那一定是你本子的触控板太渣,逃~)
- 重放手指后支持继续拖动(延迟时间
mouse_up_delay
可配) - 拖拽速度
acceleration
可配置
编译好的二进制和示例配置文件见:点我直达,选最新发布的就行 理论上支持所有使用libinput触摸板驱动的 Linux 桌面环境。
除X11「三指拖拽」以外,其他功能与原作一致。
Enjoy!
# NOTE: I am not responsible for any expired content.
create@2023-01-29T02:08:34+08:00
update@2023-02-19T00:59:19+08:00
comment@https://github.com/ferstar/blog/issues/73