Dopo aver armeggiato molto, questo è ciò che ho in esecuzione per ora. Forse scriverò un articolo completo e pubblicherò il codice all'interno di un repository, se sarebbe interessante.
Imposta una nuova serie di regole per udev in questo modo:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
La regola dovrebbe chiamare uno script di shell ogni volta che un'azione viene attivata da un dispositivo con la combinazione data di fornitore e ID prodotto.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Dopo aver aggiunto il nuovo set di regole, riavviare il servizio udev:
sudo service udev restart
Nota: non sono stato in grado di ottenere risultati affidabili fornendo regole di corrispondenza più specifiche in quel file. Più significativamente, l'aggiunta di una ACTION
regola di corrispondenza non ha funzionato. Per quanto ne so, la sceneggiatura è stata attivata comunque. Quando si aggiunge ACTION=="add"
, lo script verrebbe comunque richiamato alla rimozione del dispositivo. Molto strano e confuso.
Tuttavia l'azione che ha attivato la regola udev sarà disponibile per lo script chiamato come mostrato di seguito.
Successivamente, la sceneggiatura stessa. Bene, non proprio. Nota il wrapper
suffisso nel nome del file. Ciò indica che questo non è lo script reale ma un wrapper che chiama lo script ed esegue in background in modo che udev possa terminare il suo processo.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
La variabile ACTION
contiene l'azione udev che è stata attivata dal dispositivo. Produce valori come add
(dispositivo collegato) e remove
(dispositivo rimosso). Li useremo più avanti.
~/.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
Sostituisci il mio nome utente con il tuo quando imposti la HOME
variabile ( $(whoami)
non funzionerà qui, poiché non verrà chiamato dall'utente ma da root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
A scopo di test, ho aggiunto alcune righe che registrano determinati eventi in un file nella mia home directory per vedere se tutto funziona. Puoi rimuoverli facilmente.
Infine, questi script devono disporre delle autorizzazioni di esecuzione. Inoltre, potrebbe essere importante notare che questi script verranno chiamati root
dall'utente, quindi fai attenzione a ciò che fai lì.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh