xsetwacomがudevで機能しないのはなぜですか?

xsetwacomがudevで機能しないのはなぜですか?

Wacom Bambooタブレットを180度回転させるスクリプトを作成しました。私自身(ユーザー)またはrootとして実行すると正常に動作しますが、起動するとudev(つまり、タブレットがusbポートに接続されているとき)動作しません。

Udevルール:

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

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

結果は/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 がラッパースクリプトを呼び出して、後から実際の設定スクリプトを呼び出す 2 つのファイルを生成すると、動作します。 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.devicesystemd サービス単位で使用できます。

 $ 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ポートごとに1つのデバイスデバイスがあります。

systemctl --user enable wacom.serviceその後、デバイスを使用して有効にして再ロードしますsystemctl --user daemon-reload

$DISPLAYxsetwacomがお使いのデバイスを探しています$XAUTHORITYType=oneshot接続はうまく機能しますが、コンピュータの起動時にデバイスが接続されていると実行されません。そのため、システムサービスの代わりにユーザーサービスを使用する必要があり、デバイスにもWantedBy=default.targetType=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何とか動作しません(Ubuntu 16.04)。

これをxsetwacomスクリプトの上部に追加すると:

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

出力で、xsetwacomスクリプトがxinputwacomを認識する前に何らかの方法で実行されていることを確認できます。どんなに長く寝ても。

ここで私が提案するのは、アプレットを使用する別のソリューション/解決方法です。存在するこれはspelufoのソリューション(試していませんが)よりも簡単ですが、プログラムをインストールするだけですat。 ( sudo apt install atDebian ユーザーの場合).

ラッパースクリプト(Adrianの答え)を次のように変更します。

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

at通常、ワンタイム注文を予約するために使用されます。たとえば、1時間前に事前に予約できますat now +1 hours -f yourscript.sh。しかし、分/時間/日/週だけを追加できるので、nowxsetwacomスクリプト内では睡眠を使わずに依存していました。

関連情報