Fiz um roteiro para girar meu tablet Wacom Bamboo 180 graus. Funciona bem quando eu o executo como eu (usuário) ou root, mas quando iniciado udev
(por exemplo, ao conectar o tablet a uma usb
porta), não funciona.
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'.
(Observe que o erro no log significa que a regra do udev não é o problema.)
Eu tentei definir um sleep
no script, talvez precise de alguns ms. Mas isso não ajuda.
- Por que esse script não funciona quando chamado diretamente de
udev
?- Como faço para corrigir isso?
- Posso chamar um script
udev
como um usuário específico? (por exemplo, sincronizar/home
com a unidade de backup externa - / home / fica visível apenas para o usuário)
55
? Eu sempre uso a idéia de que "inúmeras entradas são processadas por último, por isso é melhor pular números para entradas personalizadas"./usr/share/X11/xorg.conf.d/50-wacom.conf
tem 50 anos no meu sistema, então escolhi 55 para ir atrás dele. Não tenho certeza se isso importa.Quando você conecta o dispositivo:
Você não pode executar
xsetwacom
antes do estágio 2. Seu script está falhando porque você 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 ele receba a notificação do novo dispositivo através do D-Bus , mas não sei como é o evento do D-Bus. Tente espionar o ônibus comdbus-monitor
.fonte
sleep
com alguns segundos. Ao conectar, o tablet funciona após menos de um segundo; portanto, quando os comandos são executados, o dispositivo já é detectado e está em uso porX
. Mas ainda não funciona?Funciona se você criar dois arquivos, um script de 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, para que o X11 tenha tempo para fazer seu trabalho. Aqui está a configuração que eu uso:
Script de wrapper chamado pelo udev (/usr/local/bin/setupwacom.sh):
Script de configuração chamado pelo script do wrapper (/usr/local/bin/setupwacom-post-X11.sh):
fonte
Nenhuma das respostas aqui funcionou para mim e as opções que eu queria definir não puderam ser especificadas em
xorg.conf
:Acabei tendo que iniciar o script com um serviço systemd acionado por uma regra do udev:
O ID do fornecedor e do modelo pode ser encontrado em execução
lsusb
com o dispositivo conectado.Para recarregar regras do udev:
O
TAG+="systemd"
permite que outros serviços Systemd (sistema ou utilizador) para dependem do dispositivo (registra-lo como um dispositivo de unidade, verman systemd.device
). Para encontrar o nome da unidade do dispositivo, executeudevadm monitor
e conecte o tablet. eu receboPara verificar se o systemd está pegando, faça
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 systemdHá uma unidade de dispositivo por porta USB.
Ative e recarregue a unidade com
systemctl --user enable wacom.service
esystemctl --user daemon-reload
.O script ainda precisa dormir um pouco para o xsetwacom 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 eu precisava usar um serviço de usuário em vez de um sistema, e por que a unidade também possuiWantedBy=default.target
. O problema com o oneshot é que ele estava bloqueando o startx.Type=forking
eRestart=no
diz ao systemd para não esperar o processo bifurcado do script sair, para que o script possa dormir em segundo plano, esperando o Xorg iniciar.fonte
\x
para\\x
o arquivo de serviço. Meu WantedBy ficou assim no final:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
e agora eles são acionados ... antes que não.A solução alternativa do derobert não é adequada para todas as situações (se você não pode usar o xorg.conf).
O envoltório e a
sleep
solução propostos por Adrian de alguma forma não estão funcionando para mim (ubuntu 16.04).Se você adicionar isso à parte superior do seu script xsetwacom:
Você pode ver na saída que o script xsetwacom de alguma forma ainda é executado antes de
xinput
conhecer o wacom. Não importa quanto tempo você durma.O que proponho aqui é outra solução / solução alternativa, usando o pequeno programa no qual é mais simples que a solução do spelufo (que eu não tentei), mas requer apenas a instalação do
at
programa. (sudo apt install at
para usuários debian).Agora mude seu script de wrapper (resposta de Adrian) para algo como isto:
at
normalmente é usado para agendar um comando uma vez, você pode, por exemplo, agendar uma hora antesat now +1 hours -f yourscript.sh
. Mas como você só pode adicionar minutos / horas / dias / semanas, useinow
sem adição, mas confio no sono dentro do script xsetwacom.fonte
at now
sem nenhum garfo. Alguma razão para isso? Na verdade, com oat
método, ele nem precisa do script do wrapper. Você pode adicioná-lo diretamente como.., RUN+="/usr/bin/at now -f script-path"
:)at