xinput 校準和選項
我在執行全新安裝的 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"
.
- 我應該使用
property
什麼x_min
等x_max
?- 應該是什麼
format
?我知道可用的格式是 8、16 和 32,但我應該選擇哪一種,它們是什麼意思?- 有什麼地方可以閱讀更多關於這些選項的資訊嗎?
–
或者,是否有更好的方法來處理這種校準?該
xinput_calibrator
手冊說我可能有以下問題之一:
- 你不擅長點擊十字架,使用手寫筆或增加 –misclick 門檻值
- 核心不正確支持您的設備,它會錯誤地解釋點擊
- 你的螢幕有非線性變形,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
所以,這是我的問題
如何找到轉換矩陣的確切值?我需要使用不同的解析度,我無法為所有解析度重複試錯過程!