介紹

最近的X.org服務器包含了一個屬性,用於設置輸入設備事件如何轉換為屏幕坐標。此屬性可用於確保觸摸屏不會在多顯示器設置中拉伸,或在旋轉物理設備時旋轉觸摸屏輸入。

打印坐標轉換矩陣

首先,我們需要確定輸入設備的名稱。運行以下命令:

 
$ xinput list


您將看到如下輸出:
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ HID 413c:8161                             id=9    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=10   [slave  keyboard (3)]
我們將使用“SynPS / 2 Synaptics TouchPad”。要打印坐標轉換矩陣(CTM),請運行以下命令:
 
$ xinput list-props 'SynPS/2 Synaptics TouchPad' | grep "Coordinate Transformation Matrix"

默認情況下,這將輸出:
 
Coordinate Transformation Matrix (137): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000

這是一個3x3坐標變換矩陣。它以行主要順序編碼,因此矩陣在教科書中看起來如下:
 
⎡ 1 0 0 ⎤
⎜ 0 1 0 ⎥
⎣ 0 0 1 ⎦
 
精明的讀者會認識到這是身份矩陣。

使用坐標轉換矩陣

默認情況下,X中每個輸入設備的CTM都是單位矩陣。 例如,假設您在屏幕上的點(400,197)觸摸觸摸屏:

 
⎡ 1 0 0 ⎤   ⎡ 400 ⎤   ⎡ 400 ⎤
⎜ 0 1 0 ⎥ · ⎜ 197 ⎥ = ⎜ 197 ⎥
⎣ 0 0 1 ⎦   ⎣  1  ⎦   ⎣  1  ⎦
 
設備事件的X和Y坐標輸入到計算的第二矩陣中。 計算結果是事件的X和Y坐標映射到屏幕的位置。 如圖所示,單位矩陣將設備坐標映射到屏幕坐標而沒有任何改變。

使用的變換矩陣稱為仿射變換矩陣。 請注意,平移值採用標準化浮點坐標。

左旋(順時針90°)

讓我們說我們將屏幕物理旋轉90°(從左)到右邊。 可以旋轉X服務器屏幕,使顯示輸出與新方向匹配:

$ xrandr -o left

警告/!\並非所有圖形驅動程序都支持旋轉

現在我們想要將觸摸屏映射到新的方向(90°(從左側)到右側)。 使用仿射變換規則,我們希望我們的變換矩陣是:
⎡ 0 -1 1 ⎤
⎜ 1  0 0 ⎥
⎣ 0  0 1 ⎦
右旋(逆時針90°)

對於90°(從右側)到左側。

$ xrandr -o right

警告/!\並非所有圖形驅動程序都支持旋轉

使用以下變換矩陣:

 
⎡  0 1 0 ⎤
⎜ -1 0 1 ⎥
⎣  0 0 1 ⎦


反轉(順時針或逆時針180°)

$ xrandr -o inverted

警告/!\並非所有圖形驅動程序都支持旋轉

使用以下變換矩陣:

 
⎡ -1  0 1 ⎤
⎜  0 -1 1 ⎥
⎣  0  0 1 ⎦


限制範圍

相反,假設我們並排有兩台顯示器,我們的觸摸屏位於右側顯示器上。 它們在X方向上具有相同的分辨率。 我們不希望我們的觸摸屏映射到兩個顯示器,因此我們需要將設備坐標映射到屏幕的右半部分。 再次,使用仿射變換規則,我們希望我們的變換矩陣是:

 
⎡ 0.5 0 1 ⎤
⎜  0  1 0 ⎥
⎣  0  0 1 ⎦
設置坐標轉換矩陣

一旦我們確定了CTM,我們就需要為輸入設備設置矩陣。 我們假設已經使用'xinput list'檢索了設備名稱,如上所述。 要設置矩陣,請運行:

 
$ xinput set-prop '<device name>' 'Coordinate Transformation Matrix' <matrix in row-order>

例如,要將CTM設置為:
 
⎡ 0.5 0 1 ⎤
⎜  0  1 0 ⎥
⎣  0  0 1 ⎦
xinput set-prop '<device name>' 'Coordinate Transformation Matrix' 0.5 0 1 0 1 0 0 0 1

 

 

 

https://wiki.ubuntu.com/X/InputCoordinateTransformation

 

 

 

 

https://wiki.ubuntu.com/X/InputCoordinateTransformation

立你斯 發表在 痞客邦 留言(0) 人氣()