跳转至内容

校准触摸屏

来自 ArchWiki

本文档或章节是合并到 Touchscreen 的候选。

注意: 请使用模板的第二个参数提供更详细的说明。 (在 Talk:Calibrating Touchscreen 中讨论)

要使用多个显示器(其中一些是触摸屏),你需要告诉 Xorg 触摸表面与屏幕之间的映射关系。这可以通过使用 xinput 来设置触摸屏的坐标变换矩阵来完成。

这是一个关于如何以老式方式进行操作的指南,适用于 xrandr 无法识别你的独立屏幕(例如使用 TwinView 时)的情况。其他所有用户,请前往 Touchscreen 以更简单的方式进行操作。

你需要在每次连接显示器或登录时运行 xinput 命令。当然,你也可以将命令添加到会话自启动中。你还可以使用 Udev 来自动化此过程。

使用 nVidia 的 TwinView

了解你的系统

你的屏幕

使用 TwinView 时,X 会将所有屏幕视为一个大屏幕。你可以通过执行以下命令获取总高度和总宽度:

$ xrandr | grep \* # xrandr uses "*" to identify the screen being used

你应该会看到类似这样的行:

3600x1230      50.0* 

这意味着你的总宽度是 3600,总高度是 1230。

你的触摸设备

你的下一个任务是获取你的设备名称。执行:

$ xinput list

并根据名称查找它。找到包含 [slave pointer (2)] 的条目,这通常是你的设备名称。例如,如果该行看起来像这样:

⎜   ↳ Acer T230H                              	id=24	[slave  pointer  (2)]

你的设备名称是:

Acer T230H
提示 如果你的设备同时包含笔尖和触摸屏以及更多触摸设备,则在确定设备时请注意其名称。

执行

$ xinput list-props "Device Name"

并确保存在一个名为

Coordinate Transformation Matrix

如果不存在,你可能选择了错误的设备,请尝试另一个。

触摸区域

你需要将触摸区域缩小到一个小于整个屏幕的矩形。这意味着你需要知道四个值:

  • 触摸区域的高度
  • 触摸区域的宽度
  • 水平偏移(x 偏移)(从屏幕左边缘到触摸区域左边缘之间的像素数)
  • 垂直偏移(y 偏移)(从屏幕顶部边缘到触摸区域顶部边缘之间的像素数)

计算坐标变换矩阵

现在,尽可能精确地计算出:

  • c0 = 触摸区域宽度 / 总宽度
  • c2 = 触摸区域高度 / 总高度
  • c1 = 触摸区域 x 偏移 / 总宽度
  • c3 = 触摸区域 y 偏移 / 总高度

矩阵是:

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

表示为行优先的数组:

c0 0 c1 0 c2 c3 0 0 1

应用矩阵

执行

$ xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" c0 0 c1 0 c2 c3 0 0 1

例如:

$ xinput set-prop "Acer T230H" --type=float "Coordinate Transformation Matrix" 0.533333333 0 0 0 0.87804878 0.12195122 0 0 1

来校准你的触摸屏设备。现在,它应该可以正常工作了。

通过 udev 规则自动执行

创建一个类似 /etc/udev/rules.d/99-acer-touch.rules 的文件,内容如下:

/etc/udev/rules.d/99-acer-touch.rules
ENV{ID_VENDOR_ID}=="2149",ENV{ID_MODEL_ID}=="2703",ENV{WL_OUTPUT}="DVI1",ENV{LIBINPUT_CALIBRATION_MATRIX}="1 0 0  0 1 0"

替换为你自己的触摸屏的供应商 ID、型号 ID、xrandr 输出名称以及上面计算出的校准矩阵。这是基于你正在为触摸屏使用 libinput 驱动程序的假设。

Wayland

使用 libinput,你可以在 Wayland 合成器上校准你的触摸屏。请参阅 libinput 文档

如果你安装了 weston,你可以使用 weston-calibrator 工具来获取变换矩阵。然后,你可以通过 udev 规则来应用它。

故障排除

如果按照这些说明操作后,当你触摸屏幕时出现多个不同位置的点击,你需要使用 ABS 构建 xorg-server 包,并在构建包之前应用 此补丁。(此补丁在当前的 xorg 源上会失败,但该错误至少存在于 1 个系统中。)

使用 libinput

libinput 包提供了一些用于调试输入事件的实用程序。

  • libinput debug-events 命令会列出所有设备发出的事件,包括触摸屏驱动程序。你可以使用 --verbose 选项来获取更多信息。
  • libinput debug-gui 提供了一个图形化的调试环境。这对于直观地验证变换矩阵是否具有正确的值可能很有用。
  • libinput list-devices 列出了所有输入设备。这对于识别输入设备的名称和可能的属性很有用。使用此命令,你还可以验证变换矩阵是否已正确应用。

更多信息,请参阅 libinput 页面的 故障排除部分

参见