Por que o xsetwacom não funciona no udev?

8

Eu fiz um script para girar o meu tablet Wacom Bamboo em 180 graus. Ele funciona bem quando eu o executo como eu (usuário) ou como root, mas quando iniciado a partir de udev (ou seja, ao conectar o tablet a uma porta usb ) ele não funcionará.

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

Resultado em /tmp/red-wacom.log:

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

(Note que o erro no log significa que a regra do udev em si não é o problema.)

Eu tentei definir um sleep no script, talvez ele precise de alguns ms. Mas isso não ajuda.

  • Por que esse script não funciona quando chamado diretamente de udev ?
    • Como corrijo isso?
  • Posso chamar um script de udev como um usuário específico? (por exemplo, sincronizar /home para a unidade de backup externa - / home / é visível apenas para o usuário)
por Redsandro 22.02.2013 / 18:44

5 respostas

3

Existe uma solução bastante fácil, você pode adicionar algo assim ao seu xorg.conf (ou um arquivo em xorg.conf.d , como eu fiz):

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

Verifique a página do manual wacom (4) para detalhes de todas as opções que você pode definir.

(Em teoria, você pode usar MatchProduct para configurar individualmente o touchpad, a caneta, a borracha, etc., mas quando eu tentei isso há algum tempo, isso causou uma falha no Xorg. você não está fazendo nada disso ... e talvez o bug esteja consertado agora.)

    
por 22.02.2013 / 19:26
2

Quando você conecta o dispositivo:

  1. O Linux detecta o dispositivo e cria uma entrada de dispositivo com base nas regras do udev.
  2. O servidor X detecta o dispositivo.

Você não pode executar xsetwacom antes do estágio 2. Seu script está falhando porque você o está executando no estágio 1, quando o X ainda não conhece o dispositivo.

Você pode definir algumas configurações com gnome-settings-daemon . Acredito que receba a notificação do novo dispositivo por meio do D-Bus , mas não sei o que o D Evento -Bus parece. Tente espionar o ônibus com dbus-monitor .

    
por 22.02.2013 / 19:14
2

Funciona se você criar dois arquivos, um script wrapper sendo chamado pelo udev, que, por sua vez, chama o script de configuração real em segundo plano. O script de configuração precisa dormir por um tempo curto, para que o X11 tenha tempo de fazer seu trabalho. Aqui está a configuração que eu uso:

Script Wrapper chamado pelo udev (/usr/local/bin/setupwacom.sh):

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

Script de configuração chamado pelo 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"
    
por 09.09.2014 / 11:33
1

A solução alternativa pelo derobert não é adequada para todas as situações (se você não puder usar o xorg.conf).

O wrap proposto e a solução sleep de Adrian não funcionam para mim (Ubuntu 16.04).

Se você adicionar isso ao topo do seu script xsetwacom:

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

Você pode ver na saída que o script xsetwacom é de alguma forma ainda executado antes que xinput esteja ciente da wacom. Não importa quanto tempo você faça o sono.

O que eu proponho aqui é outra solução / solução alternativa usando o pequeno programa em que é mais simples que a solução de spelufo (que eu não tentei) mas requer apenas instalar o programa at . ( sudo apt install at para usuários debian).

Agora, altere seu script de wrapper (a resposta de Adrian) para algo assim:

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

at é normalmente usado para agendar um comando uma vez; por exemplo, você pode programar uma hora à frente em at now +1 hours -f yourscript.sh . Mas como você só pode adicionar minutos / horas / dias / semanas, usei now sem adição, mas confie no sono dentro do script xsetwacom.

    
por 13.06.2017 / 16:23
0

Nenhuma das respostas aqui funcionou para mim e as opções que eu queria definir não puderam ser especificadas em 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.

Acabei tendo que iniciar o script com um serviço systemd acionado por uma regra do udev:

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

O fornecedor e o ID do modelo podem ser encontrados executando lsusb com o dispositivo conectado.

Para recarregar as regras do udev:

$ udevadm control --reload-rules
$ udevadm trigger

O TAG+="systemd" permite que outros serviços systemd (sistema ou usuário) dependam do dispositivo (registra-o como uma unidade de dispositivo, consulte man systemd.device ). Para encontrar o nome da unidade do dispositivo, execute udevadm monitor e conecte o tablet. Eu recebo

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

Para verificar se o systemd está pegando,

$ 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

Portanto, a unidade do dispositivo é sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device e pode ser usada na unidade de serviço do 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

Existe uma unidade de dispositivo por porta usb.

Em seguida, ative e recarregue a unidade com systemctl --user enable wacom.service e systemctl --user daemon-reload .

O script ainda precisa dormir um pouco para o xsetwacom para encontrar o dispositivo e definir $DISPLAY e $XAUTHORITY . Type=oneshot funciona bem ao conectá-lo, mas não o executa se o dispositivo já estiver conectado ao inicializar o computador. É por isso que precisei usar um serviço de usuário em vez de um sistema e por que a unidade também possui WantedBy=default.target . O problema com oneshot é que ele estava bloqueando o startx. Type=forking e Restart=no informam ao systemd para não esperar que o processo bifurcado do script seja encerrado, para que o script possa, então, dormir em segundo plano esperando que o Xorg seja iniciado.

$ 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'
} &
    
por 20.06.2016 / 17:19