![x输入校准和选项](https://linux22.com/image/73048/x%E8%BE%93%E5%85%A5%E6%A0%A1%E5%87%86%E5%92%8C%E9%80%89%E9%A1%B9.png)
我在一台 lenovo thinkpad x220t 上运行全新安装的 fedora 22。一切正常,除了当我将平板电脑连接到投影仪时,由于分辨率的变化,笔不再校准。我试图xinput_calibrator
调整它,但由于它“自动检测”误点击,我无法真正让它工作。我尝试使用选项将其关闭--misclick 0
,但这也不起作用。这个选项--precalib
对我没有任何帮助。
我认为解决这个问题的最佳方法是手动设置xinput
,但我找不到选项xinput
手动的。所以,这是我的问题:
问题:
在 xinput 中,我想使用选项--set-int-prop device property format value
.我的设备名称是"Wacom ISDv4 E6 Pen stylus"
。
- 至于
property
for等我应该用什么?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。
这个翻译“几乎”有效。有谁知道我使用的哪个参数是错误的,以及如何找到它的确切值?
答案1
我发现这篇来自 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 Esper”。
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
所以,这是我的问题
如何找到变换矩阵的精确值?我需要使用不同的分辨率,并且我无法对所有分辨率重复试验和错误过程!
答案2
我认为你对c1的计算是错误的。您应该得到 -171/1024 = -0.167,而不是 -171/768,这与您通过实验发现的结果相匹配。