自动设置USB键盘的重复率

自动设置USB键盘的重复率

我经常将 USB 键盘连接到我的笔记本电脑,当我插入它时,默认的重复率不是我想要的。我尝试udev通过添加规则使用脚本更改它

`ACTION=="add", ATTRS{name}=="Dell Dell Multimedia Pro Keyboard", RUN+="set-keyboard.sh"`

set-keyboard.sh脚本调用

xset -display :0 r rate 500 50; xset -display :0 b off

问题是,这会设置笔记本电脑内置键盘的重复速率和蜂鸣声,而不是 USB 键盘的重复速率和蜂鸣声。(也就是说,如果我xset q在内置键盘上打字,它会显示正确的设置,但如果我xset q在 USB 键盘上打字,它仍然设置为错误的速率。)

有没有办法让xset知道要设置哪个键盘,或者有其他方法来解决这个问题?

答案1

经过一番探索后,我发现https://bugzilla.redhat.com/show_bug.cgi?id=601853问题可能是 xorg 在 udev 运行后重置键盘速率,因此即使我的 udev 脚本肯定正在执行,它的操作也会立即被 xorg 撤消。

但是,该页面也有修复:如果我使用 options 运行 startx startx -- -ardelay 500 -arinterval 20,那么即使插入新键盘,我的设置也会保留。

答案2

您可以尝试此命令来确定 USB 键盘的 udev ID。运行此命令,然后插入键盘:

$ udevadm monitor --udev --subsystem-match=usb

示例 - 监视器

我有一个旧的 Sun Microsystems USB 键盘。当我拔下插头并重新插入时,我收到以下 udev 消息:

$ udevadm monitor --udev --subsystem-match=usb
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing

UDEV  [1375655040.466080] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655040.557791] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV  [1375655044.586242] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV  [1375655044.589087] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655049.880514] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655049.905175] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)

因此,您可以放入规则中的 udev ID 将利用上述输出的这一部分/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2

示例 - 导出

您还可以导出整个 udev DB 并手动扫描它:

$ udevadm info --export-db
...
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
N: bus/usb/002/009
S: char/189:136
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
E: SUBSYSTEM=usb
E: DEVNAME=bus/usb/002/009
E: ID_VENDOR=0430
E: ID_VENDOR_ENC=0430
E: ID_VENDOR_ID=0430
E: ID_MODEL=0005
E: ID_MODEL_ENC=0005
E: ID_MODEL_ID=0005
E: ID_REVISION=0102
E: ID_SERIAL=0430_0005
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030101:
E: MAJOR=189
E: MINOR=136
E: DEVTYPE=usb_device
E: DRIVER=usb
E: DEVICE=/proc/bus/usb/002/009
E: PRODUCT=430/5/102
E: TYPE=0/0/0
E: BUSNUM=002
E: DEVNUM=009
E: DEVLINKS=/dev/char/189:136
...

并在您的 udev 规则中利用上述输出中的一些其他独特特征。

参考

答案3

为了解决这个问题,我创建了https://github.com/SFTtech/xautocfg

当新键盘连接到它时,它会从 X 服务器获取一个事件 - 然后它可以将配置应用于键盘,例如设置按键重复率和延迟。

您不需要 root 权限,编辑启动选项-ardelay 200 -arinterval 20或使用 hacky udev 规则。xautocfg仅以您的用户身份运行(最好作为 systemd 用户服务)并更新设备配置。

答案4

因此,在网上挖掘了一年之后,我今天终于让它工作了。

来源:https://newbedev.com/udev-rule-to-auto-load-keyboard-layout-when-usb-keyboard-plugged-in

正如 @TomYan 已经提到的,xset这是一个 X11 程序。因此,您必须对DISPLAYXAUTHORITYenv 变量进行硬编码。

基本上,解决方法是在后台短暂延迟运行脚本。因此 udev 可以在 xset 键盘之前激活键盘。在上面提到的解决方案中,udev 调用一个脚本,该脚本又在后台调用第二个脚本,然后该脚本调用xset.事实上,这可以缩短为一个脚本。

设置键盘.sh

#!/usr/bin/env bash

(
    sleep 1

    DISPLAY=":0.0"
    XAUTHORITY="/home/your-profile/.Xauthority"
    export DISPLAY XAUTHORITY

    xset r rate 250 50
) &

相关内容