校准触摸屏
要使用多个显示器(其中一些是触摸屏),你需要告诉 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列出了所有输入设备。这对于识别输入设备的名称和可能的属性很有用。使用此命令,你还可以验证变换矩阵是否已正确应用。