我使用一个外部键盘与我的笔记本电脑和脚本,以改变键盘布局取决于键盘是否插入。这很好,但我发现手动运行脚本是不必要的:只要插入或退出外部键盘,脚本就应该自行运行。我尝试过用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作为根用户运行对于我的toothrot X会话是有效的。只有在由udev规则运行时,脚本才不能工作。我遗漏了什么?
或者,是否有一种方法可以在不使用udev规则的情况下实现我想要的结果,也许是在X内部?
发布于 2019-12-27 14:04:50
在这篇博客文章的启发下,我让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\" &'"用lsusb中的设备值替换供应商和产品id,并根据您的喜好调整脚本,然后不要忘记用以下方式重新加载udev规则:
udevadm control --reload我总是把检测留给udev,所以这是键盘添加时的规则。若要对删除采取行动,请添加另一条规则行:
ACTION=="remove"https://unix.stackexchange.com/questions/354363
复制相似问题