J'ai fait un script pour faire pivoter ma tablette Wacom Bamboo de 180 degrés. Cela fonctionne bien lorsque je l'exécute en tant que moi-même (utilisateur) ou root, mais lorsqu'il est démarré à partir de udev
(c'est-à-dire lorsque vous branchez la tablette sur un usb
port), cela ne fonctionnera pas.
Règles Udev :
SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"
Script Wacom /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
Résultat dans /tmp/red-wacom.log :
Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.
(Notez que l'erreur dans le journal signifie que la règle udev elle-même n'est pas le problème.)
J'ai essayé de mettre un sleep
dans le script, peut-être qu'il a besoin de quelques ms. Mais ça n'aide pas.
- Pourquoi ce script ne fonctionne-t-il pas lorsqu'il est appelé directement depuis
udev
?- Comment puis-je réparer ça?
- Puis-je appeler un script à partir
udev
d'un utilisateur spécifique? (par exemple, la synchronisation/home
avec le lecteur de sauvegarde externe - / home / n'est visible que par son utilisateur)
55
? J'utilise toujours l'idée que "les entrées sans nombre sont traitées en dernier, il est donc préférable d'ignorer les numéros pour les entrées personnalisées"./usr/share/X11/xorg.conf.d/50-wacom.conf
50 ans sur mon système, j'ai donc choisi 55 pour venir après. Pas sûr que ça compte.Lorsque vous branchez l'appareil:
Vous ne pouvez pas exécuter
xsetwacom
avant l'étape 2. Votre script échoue car vous l'exécutez à l'étape 1, lorsque X ne connaît pas encore le périphérique.Vous pouvez définir certains paramètres avec
gnome-settings-daemon
. Je pense qu'il reçoit sa notification du nouvel appareil via D-Bus , mais je ne sais pas à quoi ressemble l'événement D-Bus. Essayez d'espionner le bus avecdbus-monitor
.la source
sleep
avec un tas de secondes. Lors de la connexion, la tablette fonctionne après moins d'une seconde, donc au moment où les commandes sont exécutées, l'appareil est déjà détecté et utilisé parX
. Mais ça ne marche toujours pas?Cela fonctionne si vous créez deux fichiers, un script wrapper étant appelé par udev, qui à son tour appelle le script de configuration réel en arrière-plan. Le script de configuration doit être mis en veille brièvement, afin que X11 ait le temps de faire son travail. Voici la configuration que j'utilise:
Script Wrapper appelé par udev (/usr/local/bin/setupwacom.sh):
Script de configuration appelé par le script wrapper (/usr/local/bin/setupwacom-post-X11.sh):
la source
Aucune des réponses ici n'a fonctionné pour moi, et les options que je voulais définir ne pouvaient pas être spécifiées dans
xorg.conf
:J'ai fini par devoir démarrer le script avec un service systemd déclenché par une règle udev:
Le fournisseur et l'ID du modèle peuvent être trouvés en cours
lsusb
d' exécution avec l'appareil branché.Pour recharger les règles udev:
Le
TAG+="systemd"
permet aux autres services systemd (système ou utilisateur) de dépendre de l'appareil (l'enregistre comme unité d'appareil, voirman systemd.device
). Pour trouver le nom de l'appareil, exécutezudevadm monitor
et branchez la tablette. Je reçoisPour vérifier que systemd le ramasse, faites
Ainsi, l'unité de périphérique est
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device
, et elle peut être utilisée dans l'unité de service systemdIl y a une unité de périphérique par port USB.
Ensuite, activez et rechargez l'unité avec
systemctl --user enable wacom.service
etsystemctl --user daemon-reload
.Le script a encore besoin de dormir un peu pour que xsetwacom trouve le périphérique, et définisse
$DISPLAY
et$XAUTHORITY
.Type=oneshot
fonctionne bien lorsque vous le branchez, mais il ne fonctionne pas si l'appareil était déjà branché lors du démarrage de l'ordinateur. C'est pourquoi j'avais besoin d'utiliser un service utilisateur au lieu d'un service système, et pourquoi l'unité aussiWantedBy=default.target
. Le problème avec oneshot est qu'il bloquait startx.Type=forking
etRestart=no
indique à systemd de ne pas attendre la fin du processus forké du script, afin que le script puisse ensuite dormir en arrière-plan en attendant le démarrage de Xorg.la source
\x
to\\x
dans le fichier de service. Mes WantedBy ressemblaient finalement à ceci:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
et maintenant ils sont déclenchés ... avant qu'ils ne le fassent pas.La solution de contournement de derobert ne convient pas à toutes les situations (si vous ne pouvez pas utiliser le xorg.conf).
L'emballage et la
sleep
solution proposés par Adrian ne fonctionnent pas pour moi (ubuntu 16.04).Si vous ajoutez ceci en haut de votre script xsetwacom:
Vous pouvez voir à partir de la sortie que le script xsetwacom est en quelque sorte toujours exécuté avant de
xinput
connaître le wacom. Peu importe combien de temps vous dormez.Ce que je propose ici est une autre solution / solution en utilisant le petit programme à plus simple que la solution par spelufo (que je ne l' ai pas essayé) mais ne demande qu'à installer le
at
programme. (sudo apt install at
pour les utilisateurs de Debian).Maintenant, changez votre script wrapper (la réponse d'Adrian) en quelque chose comme ceci:
at
est normalement utilisé pour planifier une commande une fois, vous pouvez par exemple planifier une heure à l'avanceat now +1 hours -f yourscript.sh
. Mais comme vous ne pouvez ajouter que des minutes / heures / jours / semaines, j'ai utilisénow
sans ajout, mais comptez sur le sommeil à l'intérieur du script xsetwacom.la source
at now
sans bifurquer. Une raison pour ça? En fait, avec laat
méthode, il n'a même pas besoin du script wrapper. Vous pouvez l'ajouter directement comme.., RUN+="/usr/bin/at now -f script-path"
:)at