Udev non esegue il comando xinput all'interno dello script

Oct 03 2020

Sto cercando di fare in modo che quando collego un mouse esterno posso rimappare automaticamente i pulsanti. Posso rimappare manualmente i pulsanti conxinput set-button-map $mouse_id $button_map

Tuttavia, ho problemi a renderlo automatico. Attualmente sto cercando di fare in modo che udev esegua uno script ogni volta che il dispositivo è connesso. Ho questa regola come /etc/udev/rules.d/my_rule.rules:

ATTRS{idVendor}=="dummy", ATTRS{idProduct}=="dummy", RUN+="/bin/bash /path/to/my_script.sh"

e si my_script.shpresenta così:

#!/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

Lo script viene eseguito esattamente come previsto se lo chiamo da un terminale, ma il problema è che nell'ambiente udev bash xinput non è in esecuzione affatto. Nessuna delle tre chiamate fa nulla. Anche qualcosa di simile /usr/bin/xinput >> $out_filenon fa nulla. Tuttavia, qualcosa di simile echo foobar >> $out_fileinserisce l'output nel file out.

Ho esaminato varie cose come questa guida alle regole di udev e ho cambiato tutte le varie chiamate a percorsi assoluti come suggerito da altri post, ma non sono stato in grado di capirlo.

Risposte

1 n3wance Oct 04 2020 at 03:26

Ho continuato a cercare e ho trovato questo post sullo stackexchange del superutente che dice che xinput deve avere le variabili d'ambiente DISPLAY e XAUTHORITY impostate, sono stato in grado di modificare il mio script e ha funzionato! Tuttavia, ho anche dovuto aggiungere una sospensione e farlo funzionare in background. Ecco il mio script finale:

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

Voglio anche far notare per chiunque altro che udev chiama lo script come 18 volte quando collego il mouse, ma non sembra essere un problema.