我在笔记本电脑上使用外部键盘,并使用一个脚本来根据键盘是否插入来更改键盘布局。这工作正常,但我发现不需要手动运行脚本:它应该在任何时候自行运行外部键盘已插入或拔出。我尝试使用 udev 规则进行设置,但由于某种原因它不起作用。我的 udev 规则是:
KERNEL=="3-1.1", SUBSYSTEM=="usb", RUN+="/root/bin/udev.sh"
我已经确认,每当我插入或拔出键盘时,该脚本都会运行一次。脚本的内容是:
#!/usr/bin/bash
su - toothrot -c "/usr/local/bin/loadkb.sh" &
其内容/usr/local/bin/loadkb.sh
为:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/toothrot/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
killall xcape
if lsusb | grep HHKB
then {
setxkbmap us,gr \
-variant carpalx-plus-intl,daedalus \
-option grp:win_space_toggle \
-option lv3:rwin_switch \
-option altwin:meta_alt \
-option shift:breaks_caps \
-option lv5:lsgt_switch_lock
xmodmap ~/.xmodmap/hh
xcape -e 'Shift_L=F13;Shift_R=F14;Super_L=Prior;Hyper_L=Prior'
}
else {
setxkbmap us,gr \
-variant carpalx-plus-intl,daedalus \
-option grp:win_space_toggle \
-option lv3:ralt_switch \
-option altwin:meta_alt \
-option shift:breaks_caps -option lv5:lsgt_switch_lock
xmodmap ~/.xmodmap/apple
xcape -e 'Control_L=Escape;Shift_L=F14;Shift_R=F13;Alt_L=Escape;Alt_R=Escape'
}
fi
我已经确认/root/bin/udev.sh
以root身份运行我的toothrot X会话。仅当由 udev 规则运行时,该脚本才不起作用。我缺少什么?
或者有没有一种方法可以在不使用 udev 规则的情况下实现我想要的结果,也许是从 X 内部?
答案1
灵感来自这篇博客文章我必须xmodmap
遵守以下规则/etc/udev/rules.d/70-usb-keyboards.rules
:
ACTION=="add", ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", RUN+="/bin/sh -c 'DISPLAY=:0.0 XAUTHORITY=/home/toothrot/.Xauthority sh -c \"setxkbmap us,gr;xmodmap /home/toothrot/.xmodmap/hh\" &'"
将供应商和产品 id 替换为您设备的值,lsusb
并根据您的喜好调整脚本,然后不要忘记使用以下命令重新加载 udev 规则:
udevadm control --reload
我总是将检测留给 udev,所以这是添加键盘时的规则。要对删除进行操作,请添加另一个规则行:
ACTION=="remove"