Raspberry Pi OS:udev 规则 xset 未设置键盘重复率

Raspberry Pi OS:udev 规则 xset 未设置键盘重复率

我创建了一个带有相应 shell 脚本的 udev 规则,以设置我的 USB 键盘连接到 Raspberry Pi 时的键盘重复率。

脚本包含此行

xset r rate 250 50

还有一些其他行将调试文本打印到文件中,我已使用该文件来确保脚本由 udev 运行。(换句话说,我已经验证了脚本可以运行,但它确实不是设置键盘重复率 - 就好像上面引用的 shell 脚本行不在文件中一样。)

我不明白为什么这xset条线没有效果。

我在调试输出文件中观察到一些奇怪的行为。似乎 udev 运行了脚本两次当键盘连接时。

以下是 udev 规则文件的内容

# cat /etc/udev/rules.d/00-keyboard.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="<whatever>", ATTRS{idProduct}=="<whatever>", RUN+="/home/pi/udev/script.sh"

我的想法是也许正在运行其他东西(也许是其他脚本?)udev 脚本已运行,并且这将取消xset脚本中包含的命令。

插入键盘/鼠标设备后可能会加载哪些其他脚本/配置文件?

编辑:xset从终端运行命令按预期工作

答案1

所以,在网上搜索了一年之后,今天我终于让它工作了。

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

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

基本上,解决方法是在后台运行脚本并稍作延迟。这样 udev 就可以在您 xset 键盘之前激活键盘。在上述解决方案中,udev 调用一个脚本,该脚本又在后台调用第二个脚本,然后调用xset。实际上,这可以缩短为一个脚本。

/home/pi/udev/script.sh

#!/usr/bin/env bash

(
    sleep 1

    DISPLAY=":0.0"
    XAUTHORITY="/home/codekandis/.Xauthority"
    export DISPLAY XAUTHORITY

    xset r rate 250 50
) &

相关内容