Po tym, jak dużo się bawiłem, właśnie na to teraz biegnę. Może napiszę pełny artykuł i opublikuję kod w repozytorium, jeśli byłoby to interesujące.
Skonfiguruj nowy zestaw reguł dla udev w ten sposób:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Reguła ma wywoływać skrypt powłoki za każdym razem, gdy jakieś działanie zostanie uruchomione przez urządzenie z podaną kombinacją dostawcy i identyfikatora produktu.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Po dodaniu nowego zestawu reguł uruchom ponownie usługę udev:
sudo service udev restart
Uwaga: nie byłem w stanie osiągnąć wiarygodnych wyników, podając bardziej szczegółowe reguły dopasowania w tym pliku. Co najważniejsze, dodanie ACTION
reguły dopasowania nie działało. O ile wiem, skrypt i tak został uruchomiony. Podczas dodawania ACTION=="add"
skrypt nadal będzie wywoływany po usunięciu urządzenia. Bardzo dziwne i mylące.
Jednak akcja, która uruchomiła regułę udev, będzie dostępna dla wywoływanego skryptu, jak pokazano poniżej.
Następnie sam skrypt. Cóż, niezupełnie. Zwróć uwagę na wrapper
przyrostek w nazwie pliku. Oznacza to, że nie jest to rzeczywisty skrypt, ale opakowanie, które wywołuje skrypt i wykonuje go w tle, aby udev mógł zakończyć proces.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
Zmienna ACTION
zawiera akcję udev uruchomioną przez urządzenie. Zwraca wartości takie jak add
(urządzenie zostało podłączone) i remove
(urządzenie zostało usunięte). Wykorzystamy je później.
~/.bin/switch-kb-layout.sh
:
#!/bin/sh
sleep 1
# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
udev_action=$1
log_file="$HOME/switch-kb-layout.log"
if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
echo "Other action. Aborting." >> $log_file
exit 1
fi
internal_kb_layout="de"
internal_kb_variant=""
external_kb_layout="us"
external_kb_variant="altgr-intl"
kb_layout=""
kb_variant=""
if [ "${udev_action}" = "add" ]; then
kb_layout=$external_kb_layout
kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
kb_layout=$internal_kb_layout
kb_variant=$internal_kb_variant
fi
setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
setxkbmap -variant "${kb_variant}"
echo "set variant:" "$kb_variant" >> $log_file
fi
Zastąp moją nazwę użytkownika swoją nazwą podczas ustawiania HOME
zmiennej ( $(whoami)
tutaj nie będzie działać, ponieważ nie będzie ona wywoływana przez użytkownika, ale przez root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Do celów testowych dodałem kilka wierszy rejestrujących określone zdarzenia do pliku w moim katalogu domowym, aby sprawdzić, czy wszystko działa. Możesz je łatwo usunąć.
Wreszcie skrypty te muszą mieć uprawnienia do wykonywania. Warto również pamiętać, że skrypty te będą wywoływane przez root
użytkownika, więc uważaj, co tam robisz.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh