Après avoir beaucoup tripoté, c'est ce que j'ai pour l'instant. Je vais peut-être écrire un article complet et publier le code dans un référentiel, si cela vous intéresse.
Configurez un nouvel ensemble de règles pour udev comme celui-ci:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
La règle est censée appeler un script shell chaque fois qu'une action est déclenchée par un appareil avec la combinaison donnée d'ID de fournisseur et de produit.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Après avoir ajouté le nouvel ensemble de règles, redémarrez le service udev:
sudo service udev restart
Remarque: Je n'ai pas pu obtenir de résultats fiables en fournissant des règles de correspondance plus spécifiques dans ce fichier. Plus important encore, l'ajout d'une ACTION
règle de correspondance n'a pas fonctionné. Autant que je sache, le script a quand même été déclenché. Lors de l'ajout ACTION=="add"
, le script sera toujours appelé lors de la suppression du périphérique. Très étrange et déroutant.
Cependant l'action qui a déclenché la règle udev sera disponible pour le script appelé comme indiqué ci-dessous.
Ensuite, le script lui-même. Enfin, pas tout à fait. Notez le wrapper
suffixe dans le nom de fichier. Cela indique qu'il ne s'agit pas du script réel mais d'un wrapper qui appelle le script et l'exécute en arrière-plan afin que udev puisse terminer son processus.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
La variable ACTION
contient l'action udev déclenchée par le périphérique. Il donne des valeurs comme add
(le périphérique a été branché) et remove
(le périphérique a été supprimé). Nous les utiliserons plus tard.
~/.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
Remplacez mon nom d'utilisateur par le vôtre lors de la définition de la HOME
variable ( $(whoami)
ne fonctionnera pas ici, car cela ne sera pas appelé par votre utilisateur mais par root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
À des fins de test, j'ai ajouté quelques lignes qui enregistrent certains événements dans un fichier de mon répertoire personnel pour voir si tout fonctionne. Vous pouvez les supprimer en toute sécurité.
Enfin, ces scripts doivent avoir des autorisations d'exécution. Il peut également être important de noter que ces scripts seront appelés par l' root
utilisateur, alors faites attention à ce que vous y faites.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh