¿Por qué xsetwacom no funciona desde udev?

8

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 usbpuerto) 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 sleepen 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 udevun usuario específico? (p. ej., sincronización /homecon una unidad de respaldo externa - / home / solo es visible para su usuario)
Redsandro
fuente

Respuestas:

3

Hay una solución bastante fácil, puede agregar algo como esto a su xorg.conf(o un archivo xorg.conf.d, como he hecho):

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

Consulte la página de manual de wacom (4) para obtener detalles sobre todas las opciones que puede configurar.

(En teoría, puede usar MatchProductpara configurar individualmente el panel táctil, el bolígrafo, el borrador, etc., pero cuando lo intenté hace un tiempo, causó que Xorg se desconectara. Lo mismo si intentara flotarlos. Pero no está haciendo nada de eso ... y tal vez el error está solucionado ahora.)

derobert
fuente
Wow, después de tantos googlear nunca me encontré con esto. Voté tu respuesta. Lo intentaré cuando esté en el trabajo. ¿Alguna razón específica para 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".
Redsandro
@Redsandro /usr/share/X11/xorg.conf.d/50-wacom.conftiene 50 en mi sistema, así que elegí 55 para seguirlo . No estoy seguro de que incluso importe.
derobert
Esta respuesta proporciona información útil pero no responde la pregunta original. ¿Qué sucede si conecta su dispositivo USB Wacom después de que se haya iniciado el servidor X?
Lqueryvg
1
@Lqueryvg InputClass se aplica a dispositivos conectados en caliente, por lo que también debería funcionar.
derobert
@derobert, gracias por responder. No me di cuenta de que InputClass también funcionaba para hotplug. Tengo algunos eventos de botones que mapeo usando xsetwacom y me gustaría activarlos si conecto mi tableta después de que X haya comenzado. Voy a intentar esto. Gracias !
Lqueryvg
2

Cuando conectas el dispositivo:

  1. Linux detecta el dispositivo y crea una entrada de dispositivo basada en las reglas de udev.
  2. El servidor X detecta el dispositivo.

No puede ejecutarse xsetwacomantes 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 con dbus-monitor.

Gilles 'SO- deja de ser malvado'
fuente
Voté su respuesta por los detalles, pero no estoy seguro de que esto sea correcto por la siguiente razón: intenté usarlo sleepcon 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 uso X. ¿Pero todavía no funciona?
Redsandro
2

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):

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

Script de configuración llamado por el script de reiniciador (/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"
Adrian
fuente
2

Ninguna de las respuestas aquí funcionó para mí, y las opciones que quería establecer no podían especificarse en 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.

Terminé teniendo que iniciar el script con un servicio systemd activado por una regla udev:

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

El proveedor y la identificación del modelo se pueden encontrar ejecutándose lsusbcon el dispositivo enchufado.

Para recargar las reglas de udev:

$ udevadm control --reload-rules
$ udevadm trigger

Esto TAG+="systemd"permite que otros servicios systemd (sistema o usuario) dependan del dispositivo (lo registra como una unidad de dispositivo, ver man systemd.device). Para encontrar el nombre de la unidad del dispositivo, ejecute udevadm monitory conecte la tableta. yo obtengo

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

Para comprobar que systemd lo está recogiendo, haga

$ 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

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 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

Hay una unidad de dispositivo por puerto usb.

Luego habilite y vuelva a cargar la unidad con systemctl --user enable wacom.servicey systemctl --user daemon-reload.

El script aún necesita dormir un poco para que xsetwacom encuentre el dispositivo y configure $DISPLAYy $XAUTHORITY. Type=oneshotfunciona 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 hecho WantedBy=default.target. El problema con oneshot es que estaba bloqueando startx. Type=forkingy Restart=nole 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.

$ 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'
} &
spelufo
fuente
No sé por qué no fue el caso en su escenario, pero tenía que escapar, al menos, la \xque \\xen el archivo de servicio. My WantedBy se veía así al final: WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.devicey ahora se activan ... antes que no.
Jan
1

La solución alternativa de derobert no es adecuada para todas las situaciones (si no puede usar xorg.conf).

El ajuste y la sleepsolució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:

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

Puede ver en el resultado que el script xsetwacom todavía se ejecuta de alguna manera antes de que xinputse 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 atprograma. ( sudo apt install atpara usuarios de debian).

Ahora cambie su script de envoltura (la respuesta de Adrian) a algo como esto:

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

atnormalmente se usa para programar un comando una vez, por ejemplo, puede programar una hora por adelantado at now +1 hours -f yourscript.sh. Pero como solo puede agregar minutos / horas / días / semanas, los utilicé nowsin agregarlos, pero confío en el sueño dentro del script xsetwacom.

Sebastian
fuente
Enfrenté el mismo problema con la sugerencia de Adrian y esto me lo solucionó en Ubuntu 16.04. Me desconcierta cómo comenzó a funcionar at nowsin bifurcación. ¿Alguna razón para eso? En realidad, con el atmétodo ni siquiera necesita el script de envoltura. Puede agregarlo directamente como .., RUN+="/usr/bin/at now -f script-path":)
Gaurav
Esto es una locura ya que ni siquiera dormí en el guión y funciona sin él. Desearía saber qué está sucediendo en segundo plano para que funcioneat
BozanicJosip