接続または切断するときのキーボードレイアウトの変更

接続または切断するときのキーボードレイアウトの変更

私はラップトップに外部キーボードを使用しており、スクリプトを使用してキーボードを接続するかどうかに応じてキーボードレイアウトを変更しています。これはうまくいきますが、スクリプトを手動で実行する必要はありません。外部キーボードを接続または切断するたびにスクリプトを自動的に実行する必要があります。 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.shToothrot 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をデバイス値に置き換えて、必要に応じてスクリプトを調整してから、次のようにlsusbudevルールを再ロードすることを忘れないでください。

udevadm control --reload

私は常に検出を​​udevに任せるので、キーボードを追加するときのルールです。削除操作を実行するには、別のルール行を追加してください。

ACTION=="remove"

関連情報