前言/废话
在 GNU/Linux 中, 无论是 wayland 还是 x11, 都会出现快速点击鼠标时 (例如 DBC), 最高只能识别到约 12 CPS, 而实际 CPS 为 20 CPS 的情况
症状
evtest 能检测到所有点击
libinput debug-events 和 wev 只能检测到部分点击
根源
libinput 1.23+ 版本引入了按键去抖动功能 (button debouncing) 用于防止硬件接触抖动导致的误触, 但这个功能默认会过滤掉间隔小于 25ms 的点击事件, 从而导致 CPS 被限制在 12 左右
虽然可以通过在 ‘/etc/libinput/local-overrides.quirks’ 中配置 ‘ModelDebounceTime=0’ ‘ModuelBouncingKeys=0’, 但几乎不生效
解决方案
直接通过修改 libinput 源码来禁用按键去抖动
安装编译依赖
sudo pacman -S --noconfirm base-devel git meson ninja libevdev mtdev systemd
克隆 libinput 源码
git clone https://gitlab.freedesktop.org/libinput/libinput.git && cd libinput
签出对应版本
git tag -l | grep 1.31.1 && git checkout 1.31.1
修改 src/libinput-plugin-button-debounce.c, 这里先备份
cp src/libinput-plugin-button-debounce.c src/libinput-plugin-button-debounce.c.bak
修改插件初始化函数
sed -i '855,864c\void\nlibinput_debounce_plugin(struct libinput *libinput)\n{\n\t/* Button debounce disabled permanently - no CPS limit! */\n\treturn;\n}' src/libinput-plugin-button-debounce.c
编译
meson setup builddir -Ddocumentation=false -Dtests=false && cd builddir && meson compile
安装
sudo meson install
编译默认安装到 /usr/local/lib, 由于我是 Archlinux, 默认从 /usr/lib/ 加载, 所以我们把安装好的复制过去
备份原库
sudo cp /usr/lib/libinput.so.10.13.0 /usr/lib/libinput.so.10.13.0.backup
复制新库
sudo cp /usr/local/lib/libinput.so.10.13.0 /usr/lib/
执行完上一步后系统应该会直接重新加载不需要手动重启, 现在直接打开浏览器 CPS 测试网站或者在游戏中开启 CPS 显示验证即可
预防措施
防止系统更新覆盖修改好的 libinput, 这边手动将其添加到 pacman 的 IgnorePkg
sudo nano /etc/pacman.conf
IgnorePkg = libinput