私は2つの同じ(ELOブランド)タッチスクリーンを持つxorgでアプリケーションを使用しています。 USBケーブルまたはモニターケーブルを再接続しても、そのモニターに正しいタッチパネルを自動的に割り当てたいと思います。 (どのパネルがどのモニターに属しているかを確認するためにセットアップユーティリティを一度実行する必要がありましたが、問題はありませんでした。)
モニターとタッチパネルの両方にシリアル番号があるので、設定ファイルに入れて起動時にその番号を見つけ、そこから正しいxinputコマンドを実行することをお勧めします。おそらくこれが正しい方法なので、udevを介してこれを行うのが最善です。
私が以前にしたことは次のとおりです。
xinput
入力を見るには実行してください。
$ xinput
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB-PS/2 Optical Mouse id=9 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=10 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=11 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=15 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=16 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard ... etcetera
次に、Atmelパネルのデバイスを一覧表示します。
xinput --list-props 10|grep Device.Node|cut -f2 -d'"'
これは私に提供されます/dev/input/event11
(他の3つのAtmel IDでもこれを行います)。次に、udevadmを実行して、どれがタッチスクリーンであるかを確認します。そしてシリアル番号を読む:
udevadm info /dev/input/event11
私にください
N: input/event11
L: 0
S: input/by-path/pci-0000:00:14.0-usb-0:7:1.1-event
S: input/by-id/usb-Atmel_Atmel_maXTouch_Digitizer_E21R077282-event-if01
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.1/0003:03EB:8A6E.0003/input/input12/event11
E: DEVNAME=/dev/input/event11
E: MAJOR=13
E: MINOR=75
E: SUBSYSTEM=input
E: USEC_INITIALIZED=5462678
E: ID_INPUT=1
E: ID_INPUT_TOUCHSCREEN=1
E: ID_INPUT_WIDTH_MM=341
E: ID_INPUT_HEIGHT_MM=273
E: ID_VENDOR=Atmel
E: ID_VENDOR_ENC=Atmel
E: ID_VENDOR_ID=03eb
E: ID_MODEL=Atmel_maXTouch_Digitizer
E: ID_MODEL_ENC=Atmel\x20maXTouch\x20Digitizer
E: ID_MODEL_ID=8a6e
E: ID_REVISION=1034
E: ID_SERIAL=Atmel_Atmel_maXTouch_Digitizer_E21R077282
E: ID_SERIAL_SHORT=E21R077282
E: ID_TYPE=hid
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=01
E: ID_USB_DRIVER=usbhid
E: ID_PATH=pci-0000:00:14.0-usb-0:7:1.1
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_7_1_1
E: LIBINPUT_DEVICE_GROUP=3/3eb/8a6e:usb-0000:00:14.0-7
E: DEVLINKS=/dev/input/by-path/pci-0000:00:14.0-usb-0:7:1.1-event /dev/input/by-id/usb-Atmel_Atmel_maXTouch_Digitizer_E21R077282-event-if01
これでパネルのシリアル番号を取得しました。
xrandr -q --verbose
その後、モニター(ディスプレイモニターとEDIDブロック)を接続する必要があります。 edid情報は読み取り専用で変更できないため、これを固定識別子として使用できるようになりました。 (走ることはできますが、走る必要はありませんedid-decode
)。
xrandr出力からモニター名を取得するスクリプトを省略しましたが、最終的にはID_SERIAL_SHORT=E21R077282
DP-4を監視する必要があるAtmelデジタイザーを接続し、xinput --map-to-output 10 DP-4
DP-6に別のAtmelパネルを追加できます。
id=10
しかし、シリアル番号からシリアル番号まで、多くの数字を処理するように感じます/dev/input/event11
。
- udevルールを使用してこれを実行できますか?
- を区別するudevルールを作成する必要がありますか
ID_SERIAL_SHORT
? - それでは、この情報で何をすべきですか?
- つまり、udevからxorgに情報を転送する方法は何ですか?
- また、
udev
xorgからモニター情報を取得できますか?または、2つの間の接続をどのように設定する必要がありますか?
答え1
短い答え:できません(更新:あなたできる、下記参照)
udev
USBデバイス処理に関するすべてです。 USBポートに何かが接続されると、udev
udevルールでカスタムスクリプトの実行を含む多くのものに接続できるタスクが発生します。
ただし、(a)X11サーバーがその時点で実行されているという保証はなく、(b)実行中であっても他のユーザーが所有する可能性があります。 X11サーバーにアクセスするには、システムコールの特権スクリプトを使用してこれを行いますudev
。
たとえば、udevルールの一部としてコマンドを正当に呼び出すことはできず、xinput
デスクトップにログインしているユーザーが呼び出すと、同じコマンドが正しく機能しても何もできません。
ルールの提案はさまざまです(例:Wacomタッチパッド)。
ATTRS{idVendor}=="056a", ACTION=="add", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/someusername/.Xauthority", RUN+="/usr/local/sbin/wacom.sh $env{DEVNAME}"
スクリプトはwacom.sh
順番に適切なxinput
呼び出しを実行しますが、必ずしも真ではないいくつかの仮定をします。つまり、DISPLAYは実際にそうです。:0.0
あるいは、そのルートは指定された.Xauthority
ファイルにアクセスできます(ホームディレクトリの場所によっては必ずしも真ではありません)。インストール済み)またはマルチユーザーシステムでは、ユーザー名は常に同じです。
唯一の法的解決策は、ユーザーがUSBタッチデバイスを接続した後にスクリプトを手動で実行することです。パネル/デスクトップのボタンに関連付けることができますが、システムはそれを呼び出すことはできませんudev
。
以下は、並べて配置された2つの同じタッチスクリーンモニタを拡張デスクトップにマッピングするために使用した例です。 xinput / udevadm(デバイスによって検出方式が異なります)を使用し、すべての画面とデバイスにハードコードされたシリアル番号を使用して、左スタイラス/タッチスクリーンを左モニターに、右スタイラス/タッチスクリーンを右モニターにマップしました。 EDIDを解析すると、正確な検索文字列はオペレーティングシステムとEDIDデコードバージョンによって大きく異なり、状況に合わせて調整する必要があります。 EDID情報を抽出する一般的な方法がわかりませんでした。
#!/bin/bash
LEFT_USB=XXXXXXX
LEFT_HDMI=YYYYYYY
RIGHT_USB=ZZZZZZZ
RIGHT_HDMI=TTTTTTT
### all xinput devices
ids=`xinput list --id-only`
left_ids=""
right_ids=""
for i in $ids
do
node=`xinput list-props $i | grep Device\ Node | cut -f2 -d\"`
if [ ! -z "$node" ]; then
serial=`udevadm info $node | grep ID_SERIAL_SHORT | cut -f2 -d=`
touch_id=`xinput list $i | grep "TouchClass" | sed -r 's/[^0-9]*([0-9]+).*/\1/'`
pen_id=`xinput list $i | grep Pen | cut -f2 -d= | cut -f1`
if [ "$serial" == "$LEFT_USB" ]; then
left_ids+="$pen_id $touch_id "
elif [ "$serial" == "$RIGHT_USB" ]; then
right_ids+="$pen_id $touch_id "
fi
fi
done
left_ids=`echo $left_ids | uniq | xargs`
right_ids=`echo $right_ids | uniq | xargs`
### all connected displays
DISPLAYS=`xrandr | grep \ connected | cut -f1 -d\ `
for d in $DISPLAYS
do
serial=`xrandr -q --verbose | sed -n "/$d connected/,/HDCP/p" | edid-decode | grep '\ \ Serial\ Number:' | cut -f2 -d: | xargs`
if [ "$serial" == "$LEFT_HDMI" ]; then
for i in $left_ids
do
xinput map-to-output $i $d
done
elif [ "$serial" == "$RIGHT_HDMI" ]; then
for i in $right_ids
do
xinput map-to-output $i $d
done
fi
done
exit 0
編集する:
imdnは興味深い選択肢を提案しますArch Linuxシステム管理フォーラムで。デフォルトのアイデアは、ルールによって生成されたセマフォファイルを活用し、それをudev
Xinotifywait
構成(file-inotify
サービスの開始時になど~/.xprofile
)に追加してそのロックファイルの変更を監視し、xinput
変更が発生したときに適切なコマンドを実行することです。原則としては可能だと思いますが、続けることはできません。
唯一の正しい解決策は、X構成自体を変更し、新しいポインティングデバイスを構成するときに適切なオプションの設定を呼び出すことです。デバイス名が一意の場合は、/etc/X11/xorg.d/*
ベースにルールを追加できます。MatchProduct
この例は、Ubuntu 23.04、xfce4でテストされたWacom Cintiqタブレットの例です。
## this file is /etc/X11/xorg.conf.d/50-wacom.conf
# xrandr:
# DVI-0 connected primary 2560x1600+0+0 (main monitor)
# DisplayPort-0 connected 1920x1080+2560+0 (Wacom Cintiq tablet)
# Wacom tablet can be configured to be --right-of 1920x1080+2560+0 or --below 1920x1080+0+1600
# --right-of means x-shift=2560/(2560+1920)=0.571429, x-scale=1920/(2560+1920)=0.428571, yscale=1080/1600=0.675
# Option "TransformationMatrix" "0.428571 0 0.571429 0 0.675 0 0 0 1"
# --below means y-shift=1600/(1600+1080)=0.597015, y-scale=1080/(1600+1080)=0.402985, xscale=1920/2560=0.75
# Option "TransformationMatrix" "0.75 0 0 0 0.402985 0.597015 0 0 1"
# Refs:
# https://unix.stackexchange.com/questions/58117/determine-xinput-device-manufacturer-and-model
# https://askubuntu.com/questions/178140/xinput-coordinate-transformation-matrix-in-xorg-conf
# https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
#
# Can match by a common substring for all Wacom devices (as reported by xinput):
# MatchProduct "Wacom ISDv5 307 Pen stylus"
# MatchProduct "Wacom ISDv5 307 Pen eraser"
# MatchProduct "Wacom ISDv5 309 Finger touch"
Section "InputClass"
Identifier "Wacom Cintiq"
Driver "wacom"
MatchProduct "Wacom ISDv5"
Option "TransformationMatrix" "0.428571 0 0.571429 0 0.675 0 0 0 1"
EndSection
同じ製品ID(唯一の一意の識別子はシリアル番号です)を持つ2つの同じデバイスがある場合、状況はより複雑になります。残念ながら、MatchSerial
xorgにはそのオプションはありませんが、TAG
inudev
ルールを設定してからMatchTag
inで使用できますxorg
。
編集する:
最後に、これ正しいソリューション。次の例は、並んでいる2つのFlatFrogパネルの例です。この特定のソリューションの利点は、アクティブ化時にすべてのサブデバイスがこれらのサイズ変更プロパティを継承するため、タッチ/スタイラス/消しゴムを個別に追跡する必要がないことです。
### this is /etc/udev/rules.d/69-flatfrog.rules
ACTION=="remove", GOTO="flatfrog_end"
KERNEL!="event[0-9]*", GOTO="flatfrog_end"
ATTRS{idVendor}=="25b5", ATTRS{idProduct}="0082", ENV{ID_SERIAL_SHORT}=="XXXXXXXXX", ENV{ID_INPUT.tags}="FlatFrogRHS"
ATTRS{idVendor}=="25b5", ATTRS{idProduct}="0082", ENV{ID_SERIAL_SHORT}=="YYYYYYYYY", ENV{ID_INPUT.tags}="FlatFrogLHS"
LABEL="flatfrog_end"
### this is /etc/X11/xorg.conf.d/10-flatfrog.conf
Section "InputClass"
Identifier "RHstylus"
MatchTag "FlatFrogRHS"
Option "TransformationMatrix" "0.5 0 0.5 0 1 0 0 0 1"
EndSection
Section "InputClass"
Identifier "LHstylus"
MatchTag "FlatFrogLHS"
Option "TransformationMatrix" "0.5 0 0 0 1 0 0 0 1"
EndSection
引用:https://gitlab.freedesktop.org/xorg/xserver/-/issues/1592