Udev n'exécute pas la commande xinput dans le script
J'essaie de faire en sorte que lorsque je connecte une souris externe, je puisse automatiquement remapper les boutons. Je peux remapper les boutons manuellement avecxinput set-button-map $mouse_id $button_map
Cependant, j'ai du mal à rendre cela automatique. J'essaie actuellement de faire exécuter un script par udev chaque fois que l'appareil est connecté. J'ai cette règle comme /etc/udev/rules.d/my_rule.rules:
ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", RUN+="/bin/bash /path/to/my_script.sh"
et my_script.shressemble à ceci:
#!/bin/bash
out_file=/path/to/out.txt
mouse_id=dummy
button_map=dummy
# button map before
/usr/bin/xinput get-button-map $mouse_id >> $out_file
/usr/bin/xinput set-button-map $mouse_id $button_map
# button map after
/usr/bin/xinput get-button-map $mouse_id >> $out_file
Le script s'exécute exactement comme prévu si je l'appelle depuis un terminal, mais le problème est que dans l'environnement udev bash, xinput ne fonctionne pas du tout. Aucun des trois appels ne fait quoi que ce soit. Même quelque chose comme /usr/bin/xinput >> $out_filene fait rien. Cependant, quelque chose comme echo foobar >> $out_filemet la sortie dans le fichier out.
J'ai regardé diverses choses comme ce guide d'écriture des règles udev et j'ai changé tous les différents appels à des chemins absolus comme certains autres articles l'ont suggéré, mais je n'ai pas été en mesure de le comprendre.
Réponses
J'ai continué à chercher et j'ai trouvé ce post sur le stackexchange du superutilisateur qui dit que xinput doit avoir les variables d'environnement DISPLAY et XAUTHORITY définies, j'ai pu modifier mon script et cela a fonctionné! Cependant, j'ai également dû ajouter un sommeil et le faire fonctionner en arrière-plan. Voici mon dernier script:
my_rule.rules:
ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", ACTION=="add", RUN+="/path/to/my_sript.sh"
my_script.sh:
#!/usr/bin/bash
out_file=/path/to/out.txt
# run normal if given argument, start new in background else
if [[ $1 ]] then sleep 1 mouse_id="my_mouse's_id" xenv="env DISPLAY=:0 XAUTHORITY=/home/my_name/.Xauthority" # button map before $xenv /usr/bin/xinput get-button-map "$mouse_id" >> $out_file
$xenv /usr/bin/xinput set-button-map "$mouse_id" 2 3 2 4 5 6 7 1 9
# button map after
$xenv /usr/bin/xinput get-button-map "$mouse_id" >> $out_file echo finished >> $out_file
else
echo running > $out_file
# run it, but detached in the background
/path/to/my_script.sh run_normal &
fi
Je tiens également à noter pour quiconque que udev appelle le script 18 fois lorsque je branche la souris, mais cela ne semble pas être un problème.