xorg:モニターにタッチスクリーンを割り当てる - シリアル番号を使用する

xorg:モニターにタッチスクリーンを割り当てる - シリアル番号を使用する

私は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=E21R077282DP-4を監視する必要があるAtmelデジタイザーを接続し、xinput --map-to-output 10 DP-4DP-6に別のAtmelパネルを追加できます。

id=10しかし、シリアル番号からシリアル番号まで、多くの数字を処理するように感じます/dev/input/event11

  • udevルールを使用してこれを実行できますか?
  • を区別するudevルールを作成する必要がありますかID_SERIAL_SHORT
  • それでは、この情報で何をすべきですか?
  • つまり、udevからxorgに情報を転送する方法は何ですか?
  • また、udevxorgからモニター情報を取得できますか?または、2つの間の接続をどのように設定する必要がありますか?

答え1

短い答え:できません(更新:あなたできる、下記参照)

udevUSBデバイス処理に関するすべてです。 USBポートに何かが接続されると、udevudevルールでカスタムスクリプトの実行を含む多くのものに接続できるタスクが発生します。

ただし、(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システム管理フォーラムで。デフォルトのアイデアは、ルールによって生成されたセマフォファイルを活用し、それをudevXinotifywait構成(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つの同じデバイスがある場合、状況はより複雑になります。残念ながら、MatchSerialxorgにはそのオプションはありませんが、TAGinudevルールを設定してからMatchTaginで使用できます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

関連情報