xsetwacom이 udev에서 작동하지 않는 이유는 무엇입니까?

xsetwacom이 udev에서 작동하지 않는 이유는 무엇입니까?

Wacom Bamboo 타블렛을 180도 회전시키는 스크립트를 작성했습니다. 나 자신(사용자) 또는 루트로 실행하면 제대로 작동하지만 부팅하면 udev(즉, 태블릿이 usb포트에 연결되어 있을 때) 작동하지 않습니다.

Udev 규칙:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"

와콤 스크립트/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

결과는 /tmp/red-wacom.log에 있습니다.:

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

(로그의 오류는 udev 규칙 자체가 문제가 아니라는 것을 의미합니다.)

스크립트에서 설정을 시도했는데 sleep아마도 몇 밀리초 정도 걸릴 것입니다. 그러나 이것은 도움이 되지 않습니다.

  • 이 스크립트에서 직접 호출하면 왜 작동하지 않습니까 udev?
    • 어떻게 해결할 수 있나요?
  • udev특정 사용자로 스크립트를 호출할 수 있나요? (예: 외부 백업 드라이브에 동기화 /home- /home/은 해당 사용자에게만 표시됩니다.)

답변1

udev가 래퍼 스크립트를 호출하여 뒤에서 실제 구성 스크립트를 호출하는 두 개의 파일을 생성하면 작동합니다. X11이 작업을 완료할 시간을 주기 위해 구성 스크립트는 잠시 동안 대기해야 합니다. 내가 사용하는 설정은 다음과 같습니다.

udev(/usr/local/bin/setupwacom.sh)가 호출하는 래퍼 스크립트:

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

래퍼 스크립트(/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"

답변2

매우 간단한 해결 방법이 있습니다. 다음과 같은 것을 귀하의 파일 (또는 제가 한 것처럼 의 xorg.conf파일 )에 추가할 수 있습니다.xorg.conf.d

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

조사하다wacom(4) 맨페이지설정할 수 있는 모든 옵션에 대한 세부정보입니다.

(이론적으로는 이것을 이용 MatchProduct해서 터치패드, 펜, 지우개 등을 개별적으로 구성할 수 있는데, 얼마 전 그렇게 하려고 했더니 Xorg에서 세그폴트가 발생하더군요. 플로팅하려고 해도 마찬가지였습니다. 그런데 당신은 그런 건 없었는데... 아마도 이 버그는 지금은 수정되었을 것입니다.)

답변3

여기에 있는 답변 중 어느 것도 나에게 도움이 되지 않았으며 다음에서 설정하려는 옵션을 지정할 수 없었습니다 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.

결국 스크립트를 시작하기 위해 udev 규칙에 의해 트리거된 systemd 서비스를 사용해야 했습니다.

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

lsusb연결 시 실행 중인 장치의 공급업체 및 모델 ID를 확인할 수 있습니다 .

udev 규칙을 다시 로드합니다.

$ udevadm control --reload-rules
$ udevadm trigger

이를 TAG+="systemd"통해 다른 시스템 서비스(시스템 또는 사용자)가 장치에 종속될 수 있습니다(장치 단위로 등록, 리소스 참조 man systemd.device). 장치 이름을 찾으려면 udevadm monitor태블릿을 실행하고 연결하십시오. 알겠어요

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

systemd가 이를 인식하는지 확인하려면 다음을 수행하십시오.

$ 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

따라서 장치 단위는 sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device이며 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

USB 포트당 하나의 장치 장치가 있습니다.

systemctl --user enable wacom.service그런 다음 장치를 사용하고 활성화하고 다시 로드하십시오 systemctl --user daemon-reload.

$DISPLAYxsetwacom이 장치 를 찾고 $XAUTHORITY. Type=oneshot연결하면 잘 작동하지만 컴퓨터를 시작할 때 장치가 연결되어 있으면 실행되지 않습니다. 그렇기 때문에 시스템 서비스 대신 사용자 서비스를 사용해야 하며 장치에도 WantedBy=default.target. Type=forking그리고 Restart=nosystemd에 스크립트의 분기 프로세스가 종료될 때까지 기다리지 않도록 지시하여 스크립트가 백그라운드에서 잠자기 상태로 Xorg가 시작될 때까지 기다릴 수 있습니다.

$ 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'
} &

답변4

derobert의 솔루션은 모든 경우에 적합하지 않습니다(xorg.conf를 사용할 수 없는 경우).

Adrian이 제안한 패키지와 솔루션이 sleep어떻게 든 작동하지 않습니다 (우분투 16.04).

이것을 xsetwacom 스크립트 상단에 추가하면:

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

출력에서 xsetwacom 스크립트가 xinputwacom을 인식하기 전에 어떻게든 실행되고 있음을 확인할 수 있습니다. 아무리 오래 자더라도.

여기서 제가 제안하는 것은 애플릿을 사용하는 또 다른 솔루션/해결 방법입니다.존재하다이것은 spelufo의 솔루션(시도하지는 않았지만)보다 간단하지만 프로그램만 at설치하면 됩니다. ( sudo apt install at데비안 사용자의 경우).

이제 래퍼 스크립트(Adrian의 답변)를 다음과 같이 변경하세요.

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

at일반적으로 일회성 주문을 예약하는 데 사용됩니다. 예를 들어 한 시간 전에 미리 예약할 수 있습니다 at now +1 hours -f yourscript.sh. 그러나 분/시간/일/주만 추가할 수 있으므로 nowxsetwacom 스크립트 내에서는 수면을 사용하지 않고 의존했습니다.

관련 정보