ディスプレイよりも物理的に大きなタッチ面を使用するようにXを設定しますか?

ディスプレイよりも物理的に大きなタッチ面を使用するようにXを設定しますか?

スマートミラー(双方向ミラーの後ろから監視)を作成しています。私は27インチの赤外線タッチフレームを持っていますが、22インチのモニターと一緒に使いたいです。サイズが合わない理由の1つは、カメラをミラーの後ろに配置したことです。ミラーがディスプレイとタッチフレームの間にあるため、タッチフレームもミラーサイズと同じでなければなりません。

タッチボックスをキャリブレーションするためにxinput_calibratorツールを使用していますが、Xはタッチボックスとモニターのサイズが同じであると仮定しているため、キャリブレーションは画面の中央(タッチボックスの中央とモニターの中央)でのみ正確です。モニターオーバーラップ)。それ以外の場合、タッチ入力は画面の中央に偏ります。

下の画像では、黒い長方形内のすべてが赤外線タッチ領域内にあります。モニターは緑の長方形です。

タッチボックスとディスプレイモデル

実際のディスプレイよりも大きなタッチサーフェスを使用するようにXを設定するにはどうすればよいですか?

私はRaspberry Pi 4でRaspbian 10(buster)を使用しています。

答え1

xinput は、タッチ入力デバイスの座標変換行列を設定するために使用できます。これはArch Linux Wikiの手順に基づいています。https://wiki.archlinux.org/index.php/Calibration_Touchscreen

まず、X11で認識される入力デバイスのリストを取得します。

$ xinput list

結果の1つはタッチボックスでなければなりません。次に、現在の設定を取得します。

$ xinput list-props "Device Name"

更新する必要がある「座標変換行列」という属性があります。

考慮すべき2つのことがあります。

  1. タッチフレームはディスプレイよりも物理的に大きいため、ピクセルサイズも大きくなります。
  2. タッチ領域は、ディスプレイに基づいて水平および垂直にオフセットされる。

次の変数を収集します。文字を使用して物理的に測定しましたが、すべてが同じ基準(ピクセル解像度など)である限り、最終的に数学は正しく機能します。

Screen width        52cm
Screen height       32.5cm

Touch area width        60.5cm
Touch area height       34cm
Touch area x offset     -4cm (note the negative because the touch area begins beyond the left edge of the display)
Touch area y offset     0 (in my case the top of the touch frame aligned with the top of the display)

次に、座標変換行列を作成します。行列には、計算する必要がある4つの値があります。

マトリックスは

[ c0 0  c1 ]
[ 0  c2 c3 ]
[ 0  0  1  ]

これは行ごとの配列として表示されます。

c0 0 c1 0 c2 c3 0 0 1

c0 = touch_area_width / total_width
c1 = touch_area_x_offset / total_width
c2 = touch_area_height / total_height
c3 = touch_area_y_offset / total_height

私の測定結果は次のとおりです。

c0  1.163461538
c1  -0.076923077
c2  1.046153846
c3  0

ここで xinput を使用して新しい値を設定します。

xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" c0 0 c1 0 c2 c3 0 0 1

計算された値を次のように置き換えます。

xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" 1.16346 0 -0.0769 0 1.046150 0 0 1

これは現在のセッションに対してのみ設定されます。デバイスが接続または起動したときに変更するには、udevルールを作成します。ベンダーIDとデバイスモデルIDを見つける必要があります。私のデバイスの場合は「aaec」と「c021」です。

/etc/udev/rules.d/99-touch-frame.rules

ENV{ID_VENDOR_ID}=="aaec",ENV{ID_MODEL_ID}=="c021",ENV{WL_OUTPUT}="DVI1",ENV{LIBINPUT_CALIBRATION_MATRIX}="1.16346 0 -0.0769 0 1.046150 0 0 1"

これで、デバイスを接続するとすぐに校正行列が自動的に設定されます。

関連情報