在 X11 上,做类似的事情
xset r rate 120 240
可以设置整个键盘的重复率。
但我想知道是否可以对每个单独的密钥执行相同的操作?(即,不同的密钥具有不同的重复率。)
也许使用一些晦涩的 XKB 配置,或者 XKB C API,或者一些 evdev/ioctl hack?
如果没有,如果您可以访问键盘固件并且可以控制键盘发送的 USB HID 代码,您怎么能做到这一点呢?
我知道这一定是可能的,因为修饰键似乎具有零重复率,而其余键具有非零重复率。
我想到的一个想法是将不同的密钥组注册为不同的 USB 设备,然后为不同的设备设置不同的重复率(如果可以在 USB 级别完成)。
X11 键盘型号不支持多个按键重复率。
当按下并释放某个键时,应用程序会收到按键和释放事件。如果按住该键并且该键不是修饰键,则在释放键之前会收到多个按键事件。
修饰键的处理方式有所不同。虽然应用程序确实获得了修饰符的按键和按键释放事件(正如您所说,不重复),但通常这些事件会被忽略,而是应用程序查看附加到所有其他按键的修饰符位掩码。换句话说,修饰键状态附加到非修饰键的每个按键上。
修饰键没有不同的重复率——它们根本不支持重复。
由于应用程序获取按键事件,如果您希望应用程序中的不同按键具有不同的重复率,则可以让应用程序模拟您想要的任何速率,直到它获取按键释放事件。
不幸的是,如果不付出一些努力,这似乎是不可能的。
我不确定 PS/2 和 USB 键盘通信协议之间的所有差异,但我认为它们的操作方式可能非常相似。考虑到这一假设,您想要做的事情在硬件级别实际上是不可能的,并且在操作系统级别上很难做到。
在硬件级别,问题在于自动重复率是通过向键盘发送命令来设置的,并且该命令适用于所有重复键。没有命令可以设置各个按键的重复率。
在操作系统级别,您必须重写键盘输入处理程序,它要么是内核的直接一部分,要么是加载到内核中的驱动程序。键盘会为每次按键和释放按键发送一个中断,但也会为每次按住按键自动重复时发送一个中断。因此,驱动程序需要忽略重复的按键中断,并以该按键所需的速率人为地生成按键事件,直到收到按键释放中断。
或者,您可以对 Xorg 进行代码更改以在用户级别实现此功能。