私はラップトップに外部キーボードを使用しており、スクリプトを使用してキーボードを接続するかどうかに応じてキーボードレイアウトを変更しています。これはうまくいきますが、スクリプトを手動で実行する必要はありません。外部キーボードを接続または切断するたびにスクリプトを自動的に実行する必要があります。 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セッションがrootとして実行されていることを確認しました。このスクリプトは、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"