Ubuntu 22.04下适配libinput的触摸屏校准脚本修改问题
嘿,我来帮你搞定这个触摸屏校准适配的问题!首先得明确:Ubuntu 22.04已经全面用libinput替代了老的evdev驱动,两者的校准逻辑和配置方式差异不小,咱们得针对性修改原来的bash1脚本和校准流程。
先回顾下你原来的evdev校准流程:
- 运行bash1脚本
- bash1调用
setup程序输出evdev格式的校准参数(MinX/MaxX这些) - 解析输出生成bash2脚本
- 用户每次登录运行bash2维持校准
现在要把这套逻辑转换成libinput兼容的方式,具体步骤如下:
1. 先确认libinput相关工具已安装
首先确保系统有必要的工具,打开终端跑这条命令:
sudo apt install libinput-tools xinput-calibrator
2. 理解libinput的校准逻辑
libinput不像evdev那样直接用Min/Max这类硬参数,它靠坐标变换矩阵来实现校准,配置一般保存在Xorg的系统配置文件里(持久生效),或者通过xinput命令临时设置(重启后失效)。咱们要把setup输出的evdev参数转换成这个矩阵,或者直接生成持久化的配置文件。
3. 修改bash1脚本的核心逻辑
原来的bash1是解析setup输出生成bash2,现在要改成解析参数后生成libinput兼容的配置,具体分三步:
第一步:解析setup的输出参数
从setup的输出里提取关键值:
Matchproduct "Fujitsu Component USB Touch Panel"
Option "MinX" "2197"
Option "MaxX" "62185"
Option "MinY" "6421"
Option "MaxY" "2197"
你可以在bash1里用grep+awk来提取这些值,比如:
# 提取设备名称 DEVICE_NAME=$(setup | grep "Matchproduct" | awk -F'"' '{print $2}') # 提取MinX/MaxX等参数 MIN_X=$(setup | grep "MinX" | awk -F'"' '{print $2}') MAX_X=$(setup | grep "MaxX" | awk -F'"' '{print $2}') MIN_Y=$(setup | grep "MinY" | awk -F'"' '{print $2}') MAX_Y=$(setup | grep "MaxY" | awk -F'"' '{print $2}')
第二步:计算libinput的坐标变换矩阵
根据提取的参数计算变换矩阵(注意你提供的MaxY比MinY小,说明Y轴是反转的,计算时要处理符号):
# 计算X轴范围和比例 RANGE_X=$((MAX_X - MIN_X)) SCALE_X=$(echo "scale=8; 1 / $RANGE_X" | bc) OFFSET_X=$(echo "scale=8; -$MIN_X / $RANGE_X" | bc) # 计算Y轴范围和比例(处理反转) RANGE_Y=$((MAX_Y - MIN_Y)) SCALE_Y=$(echo "scale=8; 1 / $RANGE_Y" | bc) OFFSET_Y=$(echo "scale=8; -$MIN_Y / $RANGE_Y" | bc)
最终的变换矩阵格式是:$SCALE_X 0 $OFFSET_X 0 $SCALE_Y $OFFSET_Y 0 0 1,代入你给的数值后大概是:0.00001667 0 -0.03662 0 -0.0002367 1.5201 0 0 1
第三步:生成持久化配置(替代bash2)
不用再生成bash2让用户每次登录运行了,直接生成Xorg系统配置文件,重启后永久生效:
在bash1里添加这段代码(需要sudo权限,所以运行bash1时要加sudo):
# 生成libinput校准配置文件 cat << EOF | sudo tee /usr/share/X11/xorg.conf.d/99-fujitsu-touch-calibration.conf Section "InputClass" Identifier "Fujitsu Touch Panel Calibration" MatchProduct "$DEVICE_NAME" Driver "libinput" Option "CalibrationMatrix" "$SCALE_X 0 $OFFSET_X 0 $SCALE_Y $OFFSET_Y 0 0 1" EndSection EOF
4. 验证配置是否生效
生成配置后重启系统,然后用xinput list-props "$DEVICE_NAME"查看Coordinate Transformation Matrix参数,确认是否和我们计算的一致,或者直接测试触摸屏的触摸位置是否准确。
如果不想重启,也可以临时用xinput命令设置矩阵,立即生效:
xinput set-prop "$DEVICE_NAME" "Coordinate Transformation Matrix" $SCALE_X 0 $OFFSET_X 0 $SCALE_Y $OFFSET_Y 0 0 1
备注:内容来源于stack exchange,提问作者Rich S

