Udev no ejecuta el comando xinput dentro del script
Estoy intentando que cuando conecto un mouse externo pueda reasignar automáticamente los botones. Puedo reasignar botones manualmente conxinput set-button-map $mouse_id $button_map
Sin embargo, tengo problemas para hacer esto automático. Actualmente estoy tratando de que udev ejecute un script cada vez que el dispositivo esté conectado. Tengo esta regla como /etc/udev/rules.d/my_rule.rules:
ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", RUN+="/bin/bash /path/to/my_script.sh"
y se my_script.shve así:
#!/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
El script se ejecuta exactamente como se esperaba si lo llamo desde una terminal, pero el problema es que en el entorno de bash udev xinput no se está ejecutando en absoluto. Ninguna de las tres llamadas hace nada. Incluso algo como /usr/bin/xinput >> $out_fileno hace nada. Sin embargo, algo como echo foobar >> $out_filepone la salida en el archivo de salida.
He estado mirando varias cosas como esta guía de reglas de escritura de udev y he cambiado todas las llamadas a rutas absolutas como sugirieron otras publicaciones, pero no he podido resolverlo.
Respuestas
Seguí buscando y encontré esta publicación en el stackexchange de superusuario que dice que xinput necesita tener configuradas las variables de entorno DISPLAY y XAUTHORITY, ¡pude modificar mi script y funcionó! Sin embargo, también tuve que agregar un sueño y hacerlo funcionar en segundo plano. Aquí está mi guión final:
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
También quiero señalar para cualquier otra persona que udev llama al script como 18 veces cuando conecto el mouse, pero no parece ser un problema.