介紹
最近的X.org服務器包含了一個屬性,用於設置輸入設備事件如何轉換為屏幕坐標。此屬性可用於確保觸摸屏不會在多顯示器設置中拉伸,或在旋轉物理設備時旋轉觸摸屏輸入。
打印坐標轉換矩陣
首先,我們需要確定輸入設備的名稱。運行以下命令:
您將看到如下輸出:
最近的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)]
⎜ ↳ 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),請運行以下命令:
默認情況下,這將輸出:
這是一個3x3坐標變換矩陣。它以行主要順序編碼,因此矩陣在教科書中看起來如下:
$ 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)觸摸觸摸屏:
使用坐標轉換矩陣
默認情況下,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°(從左側)到右側)。 使用仿射變換規則,我們希望我們的變換矩陣是:
使用的變換矩陣稱為仿射變換矩陣。 請注意,平移值採用標準化浮點坐標。
左旋(順時針90°)
讓我們說我們將屏幕物理旋轉90°(從左)到右邊。 可以旋轉X服務器屏幕,使顯示輸出與新方向匹配:
$ xrandr -o left
警告/!\並非所有圖形驅動程序都支持旋轉
現在我們想要將觸摸屏映射到新的方向(90°(從左側)到右側)。 使用仿射變換規則,我們希望我們的變換矩陣是:
⎡ 0 -1 1 ⎤ ⎜ 1 0 0 ⎥ ⎣ 0 0 1 ⎦
右旋(逆時針90°)
對於90°(從右側)到左側。
$ xrandr -o right
警告/!\並非所有圖形驅動程序都支持旋轉
使用以下變換矩陣:
反轉(順時針或逆時針180°)
$ xrandr -o inverted
警告/!\並非所有圖形驅動程序都支持旋轉
使用以下變換矩陣:
限制範圍
相反,假設我們並排有兩台顯示器,我們的觸摸屏位於右側顯示器上。 它們在X方向上具有相同的分辨率。 我們不希望我們的觸摸屏映射到兩個顯示器,因此我們需要將設備坐標映射到屏幕的右半部分。 再次,使用仿射變換規則,我們希望我們的變換矩陣是:
對於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'檢索了設備名稱,如上所述。 要設置矩陣,請運行:
例如,要將CTM設置為:
一旦我們確定了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
文章標籤
全站熱搜
