校准触摸屏
要使用多个显示器(其中一些是触摸屏),您需要告诉 Xorg 触摸表面和屏幕之间的映射。这可以使用 xinput
来设置触摸屏的坐标变换矩阵。
这是一个以老式方法执行此操作的指南,适用于 xrandr 不知道您的单独屏幕的情况,因为它们已合并为一个(例如,使用 TwinView 时)。其他人,请转到 触摸屏 以轻松的方式进行操作。
每次连接显示器或登录时,您都需要运行 xinput
命令。 当然,您可以将命令添加到您的会话自动启动中。 您还可以使用 Udev 来自动化此操作。
使用 nVidia's 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 源代码上失败,但该错误至少在一个系统上存在。)
使用 libinput
libinput 软件包提供了一些实用程序来调试输入事件
libinput debug-events
命令提供了由所有设备(包括触摸屏驱动程序)发出的事件列表。您可以使用--verbose
选项获取更多信息。libinput debug-gui
提供了图形调试环境。这对于直观地验证变换矩阵是否具有正确的值很有用。libinput list-devices
列出了所有输入设备。这对于识别输入设备的名称和最终属性很有用。使用此命令,您还可以验证变换矩阵是否已正确应用。
有关更多信息,请参阅 libinput 页面的故障排除部分。