Xinput

xinput 校準和選項

  • June 24, 2019

我在執行全新安裝的 Fedora 22 的聯想 thinkpad x220t 上。一切正常,除了我將平板電腦連接到投影儀時,由於解析度的變化,筆不再校準。我試圖xinput_calibrator調整它,但由於它“自動檢測”錯誤點擊,我無法真正讓它工作。我嘗試使用 option 將其關閉--misclick 0,但這也沒有用。該選項--precalib不會讓我到任何地方。

我認為解決這個問題的最好方法是手動設置,但我在手冊xinput中找不到選項。所以,這是我的問題:xinput

問題: 在 xinput 中,我想使用選項--set-int-prop device property format value. 我的設備名稱是"Wacom ISDv4 E6 Pen stylus".

  1. 我應該使用property什麼x_minx_max
  2. 應該是什麼format?我知道可用的格式是 8、16 和 32,但我應該選擇哪一種,它們是什麼意思?
  3. 有什麼地方可以閱讀更多關於這些選項的資訊嗎?

或者,是否有更好的方法來處理這種校準?該xinput_calibrator手冊說我可能有以下問題之一:

  1. 你不擅長點擊十字架,使用手寫筆或增加 –misclick 門檻值
  2. 核心不正確支持您的設備,它會錯誤地解釋點擊
  3. 你的螢幕有非線性變形,4點校準幫不了你

好吧,我敢肯定 1 不是這種情況。它不能是 2,因為它在原始解析度下工作正常。它可能不是 3,因為我真的可以看到它是線性變形,因為筆到達顯示器(而不是螢幕)的邊緣,指針位於螢幕邊緣並且它們匹配的中心!我相信我所需要的只是告訴 xinput 以一個常數因子縮放所有內容,我不知道如何。

任何幫助將非常感激。


更新:這裡 的指令準確地告訴我如何“​​縮放”和“移動”螢幕,但似乎我無法正確獲取數字。以下是我的一些輸出:

因為xrandr我得到了幾行,其中有:

1366x768      60.02 +
...
1024x768      60.00*
...

最上面的(帶 + 的那個)是我的顯示器支持的最高解析度,在那個解析度下,我可以讓筆正常工作。底部的(帶 * 的)是我目前的解析度。該連結建議使用的數字是:

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

c2 = 1 和 c3 = 0 對我來說,因為我對寬度沒有任何問題。對於 c0 和 c3 我使用這個數字: touch_area_width = 1366 total_width = 1024 touch_area_x_offset = -171

我從 (1366 - 1024) / 2 得到 171。

這個翻譯“幾乎”有效。有誰知道我使用的哪個參數錯誤,以及如何找到它的確切值?

從 ArchLinux 中找到了這篇 wiki 文章,它完全符合我的需要,只是數字有點偏。這個執行緒太亂了,我正在回答它,但還有最後一個,但我需要解決(見下文)。

要關注關於這最後一點的討論,請參見這篇文章

這是我所做的:

從 xrandr 我得到:

Screen 0: minimum 8 x 8, current 1024 x 768, maximum 32767 x 32767
LVDS1 connected primary 1024x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm
  1366x768      60.02 +
  1280x720      60.00  
  1024x768      60.00* 
  1024x576      60.00  
  ...

帶 + 的是我的顯示器支持的最大解析度,帶 * 的是目前解析度。所以,我總結

total_width = 1024
touch_area_width = 1366
touch_area_x_offset = (1024 - 1366) /2 = -171

這可能是我做錯了,因為最後我沒有得到我需要的東西,但幾乎就在那裡。

然後我看看 xinput list 的輸出

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Logitech M325                               id=9    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Pen stylus                   id=10    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Finger                       id=11    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                  id=13    [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                       id=14    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Pen eraser                   id=16    [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)]
   ↳ Sleep Button                                id=8    [slave  keyboard (3)]
   ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]
   ↳ ThinkPad Extra Buttons                      id=15    [slave  keyboard (3)]

第 4,5 和 8 行是我需要的,所以我的設備名稱將是“Wacom ISDv4 E6 Pen stylus”、“Wacom ISDv4 E6 Finger”和“Wacom ISDv4 E6 Pen橡皮擦”。

xinput list-props "device name" | grep Matrix應該列出目前的座標變換矩陣。預設值是按行列出的單位矩陣:

Coordinate Transformation Matrix (138): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000

變換矩陣是 矩陣是

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

該教程說要按如下方式計算矩陣:(右邊的數字是我為我的案例計算的數字)

c0 = touch_area_width / total_width = 1366/1024 = 1.333984375
c2 = touch_area_height / total_height = 768/768 = 1
c1 = touch_area_x_offset / total_width = -171/768 = -0.22265625
c3 = touch_area_y_offset / total_height = 0/768 = 0

對我來說 c2=1 和 c3=0 的原因是在我的情況下高度很好,所以我只需要縮放和移動寬度。

我現在需要做的就是將我的矩陣表示為一個行數組,即:

c0 0 c1 0 c2 c3 0 0 1

這對我來說變成了:

1.333984375 0 -0.22265625 0 1 0 0 0 1

然後下面的命令應該為我做翻譯:

xinput set-prop "DEVICE NAME" --type=float "Coordinate Transformation Matrix" 1.333984375 0 -0.22265625 0 1 0 0 0 1

這幾乎讓我到達了我想去的地方,只是它仍然有點偏離。所以,我做了一些試驗和錯誤來獲得以下數字1.345 0 -0.17 0 1 0 0 0 1

所以,這是我的問題

如何找到轉換矩陣的確切值?我需要使用不同的解析度,我無法為所有解析度重複試錯過程!

引用自:https://unix.stackexchange.com/questions/229876