Hice un guión para rotar mi tableta Wacom Bamboo 180 grados. Funciona bien cuando lo ejecuto como yo mismo (usuario) o root, pero cuando se inicia desde udev
(es decir, al conectar la tableta a un usb
puerto) no funcionará.
Reglas de Udev :
SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"
Script de 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
Resultado en /tmp/red-wacom.log :
Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.
(Tenga en cuenta que el error en el registro significa que la regla udev en sí no es el problema).
Traté de establecer un sleep
en el script, tal vez necesite algunos ms. Pero eso no ayuda.
- ¿Por qué no funciona este script cuando se llama directamente desde
udev
?- ¿Cómo puedo solucionar esto?
- ¿Puedo llamar a un script desde
udev
un usuario específico? (p. ej., sincronización/home
con una unidad de respaldo externa - / home / solo es visible para su usuario)
55
? Siempre uso la idea de que "las entradas innumerables se procesan en último lugar, por lo que es mejor omitir números para entradas personalizadas"./usr/share/X11/xorg.conf.d/50-wacom.conf
tiene 50 en mi sistema, así que elegí 55 para seguirlo . No estoy seguro de que incluso importe.Cuando conectas el dispositivo:
No puede ejecutarse
xsetwacom
antes de la etapa 2. Su script está fallando porque lo está ejecutando en la etapa 1, cuando X aún no conoce el dispositivo.Puede establecer algunas configuraciones con
gnome-settings-daemon
. Creo que recibe su notificación del nuevo dispositivo a través de D-Bus , pero no sé cómo es el evento D-Bus. Intenta espiar en el autobús condbus-monitor
.fuente
sleep
con unos segundos. Cuando se conecta, la tableta funciona después de menos de un segundo, por lo que cuando se ejecutan los comandos, el dispositivo ya está detectado y en usoX
. ¿Pero todavía no funciona?Funciona si crea dos archivos, udev llama a un script de contenedor, que a su vez llama al script de configuración real en segundo plano. La secuencia de comandos de configuración necesita dormir un poco, para que X11 tenga tiempo para hacer su trabajo. Aquí está la configuración que uso:
Script de envoltorio llamado por udev (/usr/local/bin/setupwacom.sh):
Script de configuración llamado por el script de reiniciador (/usr/local/bin/setupwacom-post-X11.sh):
fuente
Ninguna de las respuestas aquí funcionó para mí, y las opciones que quería establecer no podían especificarse en
xorg.conf
:Terminé teniendo que iniciar el script con un servicio systemd activado por una regla udev:
El proveedor y la identificación del modelo se pueden encontrar ejecutándose
lsusb
con el dispositivo enchufado.Para recargar las reglas de udev:
Esto
TAG+="systemd"
permite que otros servicios systemd (sistema o usuario) dependan del dispositivo (lo registra como una unidad de dispositivo, verman systemd.device
). Para encontrar el nombre de la unidad del dispositivo, ejecuteudevadm monitor
y conecte la tableta. yo obtengoPara comprobar que systemd lo está recogiendo, haga
Por lo tanto, la unidad del dispositivo es
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device
, y se puede usar en la unidad de servicio systemdHay una unidad de dispositivo por puerto usb.
Luego habilite y vuelva a cargar la unidad con
systemctl --user enable wacom.service
ysystemctl --user daemon-reload
.El script aún necesita dormir un poco para que xsetwacom encuentre el dispositivo y configure
$DISPLAY
y$XAUTHORITY
.Type=oneshot
funciona bien al enchufarlo, pero no lo ejecuta si el dispositivo ya estaba enchufado al arrancar la computadora. Es por eso que necesitaba usar un servicio de usuario en lugar de uno de sistema, y por qué la unidad también lo ha hechoWantedBy=default.target
. El problema con oneshot es que estaba bloqueando startx.Type=forking
yRestart=no
le dice a systemd que no espere a que salga el proceso bifurcado del script, para que el script pueda dormir en segundo plano esperando que Xorg comience.fuente
\x
que\\x
en el archivo de servicio. My WantedBy se veía así al final:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
y ahora se activan ... antes que no.La solución alternativa de derobert no es adecuada para todas las situaciones (si no puede usar xorg.conf).
El ajuste y la
sleep
solución propuestos por Adrian de alguna manera no funcionan para mí (ubuntu 16.04).Si agrega esto a la parte superior de su script xsetwacom:
Puede ver en el resultado que el script xsetwacom todavía se ejecuta de alguna manera antes de que
xinput
se dé cuenta del wacom. No importa cuánto tiempo duermas.Lo que propongo aquí es otra solución / solución usando el pequeño programa en el que es más simple que la solución de spelufo (que no probé) pero que solo requiere instalar el
at
programa. (sudo apt install at
para usuarios de debian).Ahora cambie su script de envoltura (la respuesta de Adrian) a algo como esto:
at
normalmente se usa para programar un comando una vez, por ejemplo, puede programar una hora por adelantadoat now +1 hours -f yourscript.sh
. Pero como solo puede agregar minutos / horas / días / semanas, los utilicénow
sin agregarlos, pero confío en el sueño dentro del script xsetwacom.fuente
at now
sin bifurcación. ¿Alguna razón para eso? En realidad, con elat
método ni siquiera necesita el script de envoltura. Puede agregarlo directamente como.., RUN+="/usr/bin/at now -f script-path"
:)at