Perché xsetwacom non funziona da udev?


8

Ho realizzato una sceneggiatura per ruotare la mia tavoletta Wacom Bamboo di 180 gradi. Funziona bene quando lo eseguo come me stesso (utente) o root, ma quando avviato da udev(cioè quando collego il tablet a una usbporta) non funzionerà.

Regole Udev :

SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"

Wacom script /usr/local/bin/red-wacom-bamboo.sh :

#!/usr/bin/env bash

exec > /tmp/red-wacom.log
exec 2>&1

# I had to do this otherwise xsetwacom would say:
# "Failed to open Display ."
# Is there a way to do this without using my username?
export XAUTHORITY=/home/redsandro/.Xauthority
export DISPLAY=:0

/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Pen stylus" Rotate half
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Finger touch" Rotate half

Risultato in /tmp/red-wacom.log :

Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.

(Si noti che l'errore nel registro indica che la regola udev non è il problema.)

Ho provato a impostare un sleepnello script, forse ha bisogno di qualche ms. Ma questo non aiuta.

  • Perché questo script non funziona quando viene chiamato direttamente da udev?
    • Come posso risolvere questo problema?
  • Posso chiamare uno script da udevcome utente specifico? (ad es. sincronizzazione /homecon unità di backup esterna - / home / è visibile solo all'utente)

Risposte:


3

C'è una soluzione abbastanza semplice, puoi aggiungere qualcosa di simile al tuo xorg.conf(o un file xorg.conf.d, come ho fatto):

anthony@Watt:/etc/X11/xorg.conf.d$ cat 55-local-wacom.conf 
Section "InputClass"
       Identifier "Wacom Left Handed"
       MatchDriver "wacom"
       Option "Rotate" "half"
EndSection

Controlla la manpage wacom (4) per i dettagli di tutte le opzioni che puoi impostare.

(In teoria, puoi usare MatchProductper configurare individualmente il touchpad, la penna, la gomma, ecc., Ma quando l'ho provato qualche tempo fa, ha causato la segfault di Xorg. Lo stesso se ho provato a farli galleggiare. Ma non stai facendo alcun di quello ... e forse il bug è stato corretto ora.)


Wow, dopo tanti googling non mi sono mai imbattuto in questo. Ho votato a favore della tua risposta. Lo proverò quando sono al lavoro. Qualche motivo specifico per 55? Uso sempre l'idea che "le voci innumerevoli vengono elaborate per ultime, quindi è meglio saltare i numeri per le voci personalizzate".
Redsandro,

@Redsandro ha /usr/share/X11/xorg.conf.d/50-wacom.conf50 anni sul mio sistema, quindi ne ho scelti 55 per seguirlo . Non sono sicuro che sia importante.
derobert,

Questa risposta fornisce informazioni utili ma non risponde alla domanda originale. Cosa succede se si collega il dispositivo Wacom USB dopo l'avvio del server X?
Lqueryvg,

1
@Lqueryvg InputClass si applica ai dispositivi hot plug, quindi dovrebbe funzionare anche in questo caso.
derobert,

@derobert, grazie per aver risposto. Non mi ero reso conto che InputClass funzionasse anche per hotplug. Ho alcuni eventi sui pulsanti che mappo usando xsetwacom e vorrei attivarli se collego a caldo il tablet dopo l'avvio di X. Ci proverò. Grazie !
Lqueryvg,

2

Quando si collega il dispositivo:

  1. Linux rileva il dispositivo e crea una voce del dispositivo in base alle regole di udev.
  2. Il server X rileva il dispositivo.

Non puoi eseguire xsetwacomprima della fase 2. Il tuo script non riesce perché lo stai eseguendo nella fase 1, quando X non conosce ancora il dispositivo.

È possibile impostare alcune impostazioni con gnome-settings-daemon. Credo che ottenga la sua notifica del nuovo dispositivo tramite D-Bus , ma non so come sia l'evento D-Bus. Prova a spiare l'autobus con dbus-monitor.


Ho votato a favore della tua risposta per i dettagli, ma non sono sicuro che sia corretto per il seguente motivo: ho provato a usarlo sleepcon un mucchio di secondi. Quando si collega, il tablet funziona dopo meno di un secondo, quindi quando i comandi vengono eseguiti, il dispositivo è già rilevato e in uso da X. Ma ancora non funziona?
Redsandro,

2

Funziona se si creano due file, uno script wrapper viene chiamato da udev, che a sua volta chiama lo script di configurazione effettivo in background. Lo script di configurazione deve essere sospeso per un breve periodo, in modo che X11 abbia il tempo di fare il suo lavoro. Ecco la configurazione che utilizzo:

Script wrapper chiamato da udev (/usr/local/bin/setupwacom.sh):

#!/usr/bin/env bash
/usr/local/bin/setupwacom-post-X11.sh &

Script di configurazione chiamato dallo script wrapper (/usr/local/bin/setupwacom-post-X11.sh):

#!/usr/bin/env bash
sleep 2
export XAUTHORITY=/home/adrian/.Xauthority
export DISPLAY=:0
# Put your xsetwacom commands here, for example: 
xsetwacom --set "Wacom Intuos S Pad pad" Button 1 "key +ctrl +shift e"

2

Nessuna delle risposte qui ha funzionato per me e le opzioni che volevo impostare non potevano essere specificate in xorg.conf:

$ xsetwacom -x get 'Wacom Intuos PT S Pad pad' button 1 
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.

Ho finito per dover avviare lo script con un servizio systemd attivato da una regola udev:

$ cat /etc/udev/rules.d/99-wacom.rules
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="056a", ENV{ID_MODEL_ID}=="0302", TAG+="systemd"

È possibile trovare id fornitore e modello in esecuzione lsusbcon il dispositivo collegato.

Per ricaricare le regole di udev:

$ udevadm control --reload-rules
$ udevadm trigger

Il TAG+="systemd"permette altri servizi systemd (sistema o dell'utente) dipendere dal dispositivo (registra come un'unità periferica, vedere man systemd.device). Per trovare il nome dell'unità del dispositivo, esegui udevadm monitore collega il tablet. ottengo

UDEV  [2918.098423] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
...

Per verificare che systemd lo stia raccogliendo, fallo

$ systemctl status /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/
● sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device - CTH-480 [Intuos Pen & Touch (S)]
   Loaded: loaded
   Active: active (plugged) since Mon 2016-06-20 11:14:20 UYT; 29min ago
   Device: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3

Quindi l'unità dispositivo è sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.devicee può essere utilizzata nell'unità di servizio systemd

 $ cat .config/systemd/user/wacom.service    
[Service]
Type=forking
Restart=no
ExecStart=/path/to/wacom-pad-button-setup

[Install]
WantedBy=default.target
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.1.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.2.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device

Esiste un'unità dispositivo per porta USB.

Quindi abilitare e ricaricare l'unità con systemctl --user enable wacom.servicee systemctl --user daemon-reload.

Lo script deve ancora dormire un po 'perché xsetwacom possa trovare il dispositivo e impostare $DISPLAYe $XAUTHORITY. Type=oneshotfunziona bene quando lo si collega, ma non lo esegue se il dispositivo era già collegato durante l'avvio del computer. Questo è il motivo per cui avevo bisogno di utilizzare un servizio utente anziché uno di sistema e perché anche l'unità ha WantedBy=default.target. Il problema con oneshot è che stava bloccando startx. Type=forkinge Restart=nodice a systemd di non aspettare che il processo biforcato dello script termini, quindi lo script può quindi dormire in background in attesa dell'avvio di Xorg.

$ cat bin/wacom-pad-button-setup
#!/bin/rc
{
    sleep 2

    if (~ $DISPLAY ()) {
        DISPLAY=:0
        XAUTHORITY=/home/spelufo/.Xauthority
    }

    xsetwacom set 'Wacom Intuos PT S Pad pad' button 9 'button +3 -3'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 8 'button +4 -4'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 3 'button +1 -1'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 1 'button +2 -2'
} &

Non so perché non è stato il caso nel vostro scenario, ma ho dovuto scappare almeno \xper \\xnel file di servizio. Il mio WantedBy alla fine sembrava così: WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.devicee ora sono attivati ​​... prima che non lo facessero.
Jan

1

La soluzione alternativa di derobert non è adatta a tutte le situazioni (se non è possibile utilizzare xorg.conf).

L'involucro e la sleepsoluzione proposti da Adrian in qualche modo non funzionano per me (Ubuntu 16.04).

Se lo aggiungi all'inizio dello script xsetwacom:

exec > /tmp/debug-my-script.txt 2>&1
xinput --list

Dall'output puoi vedere che lo script xsetwacom è in qualche modo ancora eseguito prima che xinputsia a conoscenza del wacom. Non importa quanto a lungo dormi.

Quello che propongo qui è un'altra soluzione / soluzione usando il piccolo programma in cui è più semplice della soluzione di spelufo (che non ho provato) ma richiede solo l'installazione del atprogramma. ( sudo apt install atper utenti debian).

Ora cambia il tuo script wrapper (la risposta di Adrian) in qualcosa del genere:

#!/usr/bin/env bash
at now -f /usr/local/bin/setupwacom-post-X11.sh

atviene normalmente utilizzato per pianificare un comando una volta, ad esempio è possibile pianificare un'ora in anticipo at now +1 hours -f yourscript.sh. Ma dal momento che puoi solo aggiungere minuti / ore / giorni / settimane che ho usato nowsenza aggiunta, ma faccio affidamento sul sonno all'interno dello script xsetwacom.


Di fronte allo stesso problema con il suggerimento di Adrian e questo mi ha risolto il problema su Ubuntu 16.04. Mi sconcerta come abbia iniziato a lavorare at nowsenza alcun biforcazione. Qualche motivo per quello? In realtà con il atmetodo non ha nemmeno bisogno dello script wrapper. Puoi aggiungerlo direttamente come .., RUN+="/usr/bin/at now -f script-path":)
Gaurav

È così folle dato che non ho nemmeno dormito nella sceneggiatura e funziona senza di essa. Vorrei sapere cosa sta succedendo in background in modo che funzioni conat
BozanicJosip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.