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.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
。
$DISPLAY
xsetwacomがお使いのデバイスを探しています$XAUTHORITY
。Type=oneshot
接続はうまく機能しますが、コンピュータの起動時にデバイスが接続されていると実行されません。そのため、システムサービスの代わりにユーザーサービスを使用する必要があり、デバイスにもWantedBy=default.target
。Type=forking
そして、Restart=no
systemdにスクリプトの分岐プロセスが終了するのを待たないように指示することで、スクリプトが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スクリプトがxinput
wacomを認識する前に何らかの方法で実行されていることを確認できます。どんなに長く寝ても。
ここで私が提案するのは、アプレットを使用する別のソリューション/解決方法です。存在するこれはspelufoのソリューション(試していませんが)よりも簡単ですが、プログラムをインストールするだけですat
。 ( sudo apt install at
Debian ユーザーの場合).
ラッパースクリプト(Adrianの答え)を次のように変更します。
#!/usr/bin/env bash
at now -f /usr/local/bin/setupwacom-post-X11.sh
at
通常、ワンタイム注文を予約するために使用されます。たとえば、1時間前に事前に予約できますat now +1 hours -f yourscript.sh
。しかし、分/時間/日/週だけを追加できるので、now
xsetwacomスクリプト内では睡眠を使わずに依存していました。