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


8

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スクリプトでa を設定してみましたが、おそらく数ミリ秒かかります。しかし、それは役に立ちません。

  • から直接呼び出されたときにこのスクリプトが機能しないのはなぜudevですか?
    • どうすれば修正できますか?
  • udev特定のユーザーからスクリプトを呼び出すことはできますか?(例:/home外部バックアップドライブへの同期-/ home /はそのユーザーにのみ表示されます)

回答:


3

かなり簡単な回避策があります。次のようなものを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がセグメンテーション違反を引き起こしました。フロートしようとした場合と同じです。しかし、あなたは何もしていませんその...そしておそらくバグは今修正されています。)


うわー、たくさんググった後、私はこれに遭遇したことはありません。私はあなたの答えを賛成した。仕事中に試してみます。の具体的な理由は55?「無数のエントリは最後に処理されるため、カスタムエントリの場合は番号をスキップすることをお勧めします。」
Redsandro 2013

/usr/share/X11/xorg.conf.d/50-wacom.conf私のシステムでは@Redsandro は50 なので、55を選択しました。それも重要なことはわかりません。
derobert 2013

この回答は有用な情報を提供しますが、元の質問には回答しません。Xサーバーの起動後に USB Wacomデバイスを接続するとどうなりますか?
Lqueryvg

1
@Lqueryvg InputClassはホットプラグされたデバイスに適用されるので、それでも機能するはずです。
derobert

@derobert、返信ありがとうございます。InputClassがhotplugでも機能することを知りませんでした。xsetwacomを使用してマップするいくつかのボタンイベントがあり、Xの起動後にタブレットをホットプラグした場合にそれらをトリガーしたい。これをやってみます。よろしくお願いします!
Lqueryvg '26

2

デバイスを接続すると:

  1. Linuxはデバイスを検出し、udevルールに基づいてデバイスエントリを作成します。
  2. Xサーバーがデバイスを検出します。

xsetwacomステージ2の前に実行することはできません。Xがまだデバイスを認識していないステージ1でスクリプトを実行しているため、スクリプトが失敗しています。

一部の設定はで設定できますgnome-settings-daemonD-Busを介して新しいデバイスの通知を受け取ると思いますが、D-Busイベントがどのようなものかわかりません。でバスをスパイしてみてくださいdbus-monitor


詳細についてはあなたの回答に賛成しましたが、次の理由により、これが正しいかわかりません:sleep数秒で使用してみました。プラグインすると、タブレットは1秒足らずで動作するため、コマンドが実行されるときまでに、デバイスはすでに検出され、によって使用されていXます。しかし、それでもうまくいきませんか?
Redsandro 2013

2

2つのファイルを作成すると機能します。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

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

ベンダーとモデルIDはlsusb、デバイスが接続された状態で実行されていることがわかります。

udevルールをリロードするには:

$ udevadm control --reload-rules
$ udevadm trigger

TAG+="systemd"、他の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ポートごとに1つのデバイスユニットがあります。

そして、有効にしてユニットをリロードsystemctl --user enable wacom.serviceしてsystemctl --user daemon-reload

スクリプトは、xsetwacomがデバイスを見つけて、およびを設定するために、少しスリープする必要が$DISPLAYあり$XAUTHORITYます。Type=oneshotプラグインすると正常に動作しますが、コンピュータの起動時にデバイスがすでにプラグインされている場合は動作しません。そのため、システムサービスではなくユーザーサービスを使用する必要があり、ユニットにもがありWantedBy=default.targetます。oneshotの問題は、startxをブロックしていたことです。Type=forkingそしてRestart=noスクリプトは、その後のXorgの背景待機中のスリープを開始することができるように、出口のスクリプトのフォークプロセスを待つ必要はないsystemdに伝えます。

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

なぜそうならないのかはわかりませんが、サービスファイルでは少なくともtoをエスケープする必要があり\xまし\\xた。私のWantedByは、最終的には次のようになりましたWantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device。トリガーされる前に、トリガーされます。
Jan

1

derobertによる回避策は、すべての状況に適しているわけではありません(xorg.confを使用できない場合)。

sleepエイドリアンによって提案されたラップとソリューションは、どういうわけか私のために機能していません(ubuntu 16.04)。

これをxsetwacomスクリプトの先頭に追加した場合:

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

出力から、wacomをxinput認識する前に、xsetwacomスクリプトが何らかの形でまだ実行されていることがわかります。どれだけ寝ても。

ここで提案するのは、spelufoによるソリューションよりも簡単な小さなプログラム使用した別のソリューション/回避策(私は試していません)ですが、atプログラムをインストールするだけで済みます。(sudo apt install atdebianユーザー向け)。

次に、ラッパースクリプト(エイドリアンの答え)を次のように変更します。

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

at通常、コマンドを1回スケジュールするために使用されat now +1 hours -f yourscript.shます。たとえば、1時間先にをスケジュールできます。ただし、追加できるのは分/時間/日/週のみなのでnow、xsetwacomスクリプト内のスリープに依存しています。


エイドリアンの提案で同じ問題に直面し、これは16.04 Ubuntuで私のためにそれを修正しました。私はそれがat nowフォークなしでどのように機能し始めたかについて私を困惑させます。その理由は?実際、このatメソッドでは、ラッパースクリプトも必要ありません。次のように直接追加できます.., RUN+="/usr/bin/at now -f script-path":)
Gaurav 2018

私はスクリプトでスリープさえしていなかったし、それなしで動作しているので、これはとてもクレイジーです。バックグラウンドで何が起こっているのかを理解して、それが動作するようにしたいと思いますat
BozanicJosip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.