通过 xinput 校准笔和触摸

通过 xinput 校准笔和触摸

介绍

这是我之前问题的后续这里

当我将平板电脑连接到投影仪时,由于分辨率的变化,笔不再校准。我发现这篇来自 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

所以,这是我的问题

如何找到变换矩阵的精确值?我需要使用不同的分辨率,并且我无法对所有分辨率重复试验和错误过程!

相关内容