当我插入 USB 键盘但我的 udev 规则不起作用时,我试图加载新的键盘布局。
SUBSYSTEM=="input", ATTR{idVendor}=="062a", ATTR{idProduct}=="0201", GOTO="usb_xmodmap_auto"
标签=“usb_xmodmap_auto”
ACTION=="添加", RUN+="/usr/bin/xmodmap ~/.usbXmodmap"
ACTION=="移除", RUN+="/usr/bin/xmodmap ~/.pndXmodmap"
我已经使用以下方法重新加载了规则:
>sudo udevadm 控制 --reload-rules
并通过重新启动系统但是当我插入 USB 键盘时,原始 xmodmap 仍然加载,因此键盘布局是错误的,但是如果我在终端中运行命令
>/usr/bin/xmodmap ~/.usbXmodmap或者
>/usr/bin/xmodmap ~/.pndXmodmap
他们工作得很好。
希望有人能帮忙。
编辑:
为了提供更多帮助,我进行了一些 udevadm 测试:
>udevadm 测试 --action=add /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
输出:
运行命令:调用:测试
udevadm_test:版本 151
此程序仅用于调试,不运行任何程序,
由 RUN 键指定。它可能会显示不正确的结果,因为
某些值可能不同,或者在模拟运行时不可用。
[...]
parse_file: 读取“/etc/udev/rules.d/usb-keyboard.rules”作为规则文件
udev_rules_new:规则使用 100572 字节令牌(8381 * 12 字节),21523 字节缓冲区
udev_rules_new:临时索引使用了 35380 字节(1769 * 20 字节)
udev_device_new_from_syspath: 设备 0x3b4d8 有 devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10'
udev_rules_apply_to_event: RUN '/sbin/modprobe -b $env{MODALIAS}' /etc/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event: 运行 'socket:@/org/freedesktop/hal/udev_event' /etc/udev/rules.d/90-hal.rules:2
udev_rules_apply_to_event: RUN '/sbin/modprobe $env{MODALIAS}' /etc/udev/rules.d/local.rules:31
udev_rules_apply_to_event: 运行 'socket:/org/kernel/udev/monitor' /etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: 运行 '/usr/bin/xmodmap ~/.usbXmodmap' /etc/udev/rules.d/usb-keyboard.rules:4
udevadm_test: UDEV_LOG=6
udevadm_test: DEVPATH=/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
udevadm_test:产品=3/62a/201/110
udevadm_test: NAME="USB 兼容键盘"
udevadm_test: PHYS="usb-ehci-omap.0-2.3/input1"
udevadm_test: UNIQ=""
udevadm_test: EV==1f
udevadm_test: KEY==837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udevadm_test: REL==143
udevadm_test: ABS==1 0
udevadm_test: MSC==10
udevadm_test: MODALIAS=input:b0003v062Ap0201e0110-e0,1,2,3,4,k71,72,73,74,77,80,82,83,85,86,87,88,89,8A,8B,8C, 8E、8F、90、96、98、9B、9C、9E、9F、A1、A3、A4、A5、A6、A7、A8、A9、AB、AC、AD、AE、B1、B2、B5、CE、 CF,D0,D1,D2,D5,D9,DB,E2,EA,EB,100,101,105,106,107,108,109,10A,10B,10C,162,166,16A,16E,178,179,17A,107,1718D,17C,1818C,17F 18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r0,1,6,8,a20, m4,lsfw
udevadm_test: 行动=添加
udevadm_test: 子系统=输入
udevadm_test:运行:'/sbin/modprobe -b 输入:b0003v062Ap0201e0110-e0,1,2,3,4,k71,72,73,74,77,80,82,83,85,86,87,88,89 ,8A,8B,8C,8E,8F,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B1 ,B2,B5,CE,CF,D0,D1,D2,D5,D9,DB,E2,EA,EB,100,101,105,106,107,108,109,10A,10B,10C,162,166,16A,16E,178,17D17D ,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,71B10r ,6,8,a20,m4,lsfw'
udevadm_test: 运行: 'socket:@/org/freedesktop/hal/udev_event'
udevadm_test:运行:'/sbin/modprobe 输入:b0003v062Ap0201e0110-e0,1,2,3,4,k71,72,73,74,77,80,82,83,85,86,87,88,89,8A ,8B,8C,8E,8F,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B1,B2 ,B5,CE,CF,D0,D1,D2,D5,D9,DB,E2,EA,EB,100,101,105,106,107,108,109,10A,10B,10C,162,166,16A,16E,178,17A,17B17F178,17A,179 ,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B1,1B0,1B0,1A3 ,8,a20,m4,lsfw'
udevadm_test: 运行: 'socket:/org/kernel/udev/monitor'
udevadm_test: 运行: '/usr/bin/xmodmap ~/.usbXmodmap'
和
> udevadm test --action=remove /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
输出:
运行命令:调用:测试 udevadm_test:版本 151 此程序仅用于调试,不运行任何程序, 由 RUN 键指定。它可能会显示不正确的结果,因为 某些值可能不同,或者在模拟运行时不可用。 [...] parse_file: 读取“/etc/udev/rules.d/usb-keyboard.rules”作为规则文件 udev_rules_new:规则使用 100572 字节令牌(8381 * 12 字节),21523 字节缓冲区 udev_rules_new:临时索引使用了 35380 字节(1769 * 20 字节) udev_device_new_from_syspath: 设备 0x3b4d8 有 devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10' udev_rules_apply_to_event: 运行 'socket:@/org/freedesktop/hal/udev_event' /etc/udev/rules.d/90-hal.rules:2 udev_rules_apply_to_event: 运行 'socket:/org/kernel/udev/monitor' /etc/udev/rules.d/run.rules:2 udev_rules_apply_to_event: RUN '/usr/bin/xmodmap ~/.pndXmodmap' /etc/udev/rules.d/usb-keyboard.rules:5 udevadm_test: UDEV_LOG=6 udevadm_test: DEVPATH=/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10 udevadm_test:产品=3/62a/201/110 udevadm_test: NAME="USB 兼容键盘" udevadm_test: PHYS="usb-ehci-omap.0-2.3/input1" udevadm_test: UNIQ="" udevadm_test: EV==1f udevadm_test: KEY==837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0 udevadm_test: REL==143 udevadm_test: ABS==1 0 udevadm_test: MSC==10 udevadm_test: MODALIAS=input:b0003v062Ap0201e0110-e0,1,2,3,4,k71,72,73,74,77,80,82,83,85,86,87,88,89,8A,8B,8C, 8E、8F、90、96、98、9B、9C、9E、9F、A1、A3、A4、A5、A6、A7、A8、A9、AB、AC、AD、AE、B1、B2、B5、CE、 CF,D0,D1,D2,D5,D9,DB,E2,EA,EB,100,101,105,106,107,108,109,10A,10B,10C,162,166,16A,16E,178,179,17A,107,1718D,17C,1818C,17F 18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r0,1,6,8,a20, m4,lsfw udevadm_test: 行动=删除 udevadm_test: 子系统=输入 udevadm_test: 运行: 'socket:@/org/freedesktop/hal/udev_event' udevadm_test: 运行: 'socket:/org/kernel/udev/monitor' udevadm_test: 运行: '/usr/bin/xmodmap ~/.pndXmodmap'
这似乎表明它应该有效,但它不希望这有助于得到答案。
Tho*_*ber 20
我找到了解决此问题的方法,尽管它有点笨拙。
今天我在尝试使用 udev、setxkbmap 和 xinput --list 设置两个键盘并让它们与 USB 热插拔一起工作时达到了同样的精确点。我正在交换键,不改变布局,但它都是一样的,一旦你在热插拔上识别了你的键盘并且可以有条件地调用 setxkbmap,那么你应该能够只设置你指定的键盘的语言. 可以在此处找到键盘布局列表,ls -l /usr/share/kbd/keymaps/i386/您可以找到要使用的设备名称xinput -list。
rizumu用你的用户名替换,因为我发现没有明确的方法是不可能做到的。your键盘名称上使用 grep 。lsusb发现硬件ID,你需要设置在udev规则。我的 das 键盘是这样的Bus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.我首先通过创建 udev 规则来设置自动检测键盘的 udev 规则:
在文件中/etc/udev/rules.d/00-usb-keyboards.rules:
ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2013", RUN+="/home/rizumu/bin/kbd_udev", OWNER="rizumu"
Run Code Online (Sandbox Code Playgroud)
我有两个文件 ~/bin/kbd 和 ~/bin/kbd_udev。确保他们拥有正确的权限chmod 755 ~/bin/kbd*
该~/bin/kbd_udev脚本包含:
#!/bin/bash
/home/rizumu/bin/kbd &
Run Code Online (Sandbox Code Playgroud)
您会注意到它所做的只是~/bin/kbd在后台调用,以便 udev 可以完成其过程并激活键盘。在~/bin/kbd脚本中我们会休眠一秒钟,因为我们需要等到键盘被激活才能使用 xinput 获取设备 ID。为了实现这一目标,我将一些变量,并远销他们如此XINPUT setxkbmap可以做thier工作:DISPLAY,XAUTHORITY,HOME,和一个daskb_id为我daskeyboard的id:
#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/rizumu/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
daskb_id=`xinput -list | grep -i 'daskeyboard' | grep -o id=[0-9]. | grep -o [0-9]. | head -1`
xset r rate 200 30
setxkbmap -layout colemak
setxkbmap -option ctrl:nocaps
if [ "${daskb_id}" ]; then
setxkbmap -device "${daskb_id}" -option altwin:swap_lalt_lwin
fi
Run Code Online (Sandbox Code Playgroud)
小智 6
根据您的发行版,您可能已经在 /lib/udev/rules.d/64-xorg-xkb.rules 中为键盘设置了 udev 规则。在 Ubuntu 上,这会导入 /etc/default/keyboard,其中的选项大致如下:
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
对于我的设置,我发现这个内置规则在我的自定义 udev 规则之后执行,并且覆盖了我的设置。相反,我将 /etc/default/keyboard 中的 XKBOPTIONS 更改为:
XKBOPTIONS="-option ctrl:nocaps"
为了在所有键盘上获得我想要的“Caps Lock is Control”行为。
| 归档时间: |
|
| 查看次数: |
22058 次 |
| 最近记录: |