Linux触控板手势增强之「三指拖拽」

转用 Linux 后一直都比较怀念 macOS 上丝滑的三指拖拽效果,鉴于近几年出的 Windows 本子触控板面积以及跟手性肉眼可见的改善了很多,我觉得是时候在 Linux 上折腾下触控板手势了。

说干就干,放狗搜了一下,发现类似的实现还不少,小罗列下:

  1. https://github.com/riley-martin/gestures
  2. https://github.com/bulletmark/libinput-gestures
  3. https://github.com/Coffee2CodeNL/gebaar-libinput
  4. https://github.com/osleg/gebaar-libinput-fork
  5. https://github.com/iberianpig/fusuma
  6. https://github.com/marsqing/libinput-three-finger-drag

基本上就是两种实现思路:

  1. 解析libinput debug-events输出,判断手势进而借用类似xdotool之类的工具发送具体的键盘组合或者鼠标点击或位移指令
  2. 直接调用libinput API,明显此方法性能最优

我最在意的手势莫过于三指拖拽,实现这个功能有两个注意的点:

  1. 拖拽起止会有持续不断的位移指令发出,所以通过 fork shell 不间断发送位移指令的操作是非常低效的,见这个讨论
  2. 为了媲美 macOS 的丝滑拖拽效果,必须使用尽可能高效的实现。

于是乎我选择了一个 Rust 实现开抄,负责实现 API 级别的触控手势识别,然后缝合了另一个 Rust 实现,负责实现 API 级别的拖拽效果。

终极缝合以后的产物效果还不错,基本符合预期:

  1. CPU 占用极低(极限情况:疯狂三指拖拽某窗口,本 fork 实现 CPU 占用不到1%;原实现5~10%;Python、Ruby等实现20%+)内存占用不到5MB,程序体积不到2MB,无多余依赖
  2. 拖拽体验丝滑(如果觉得不够滑,那一定是你本子的触控板太渣,逃~)
  3. 重放手指后支持继续拖动(延迟时间mouse_up_delay可配)
  4. 拖拽速度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
加载评论