部分设备的触摸屏不准确,需要校准后才能正常使用。校准其实就是在Xorg中配置设备的属性。具体的属性名与驱动有关,后面会介绍。注:本文所有操作均在deepin上完成。如果包名不同,请自行查找。下面开始介绍校准方法:准备安装需要的工具:xinput-calibrator:触摸屏校准工具xinput:屏幕映射工具,多屏使用校准执行xinput_calibrator--list查看触摸设备列表,校准设备xinput_calibrator-v--device<设备名称或id>设备名称或id是从上面的列表中获取的。此时会出现校正界面,根据提示点击,成功后程序会输出校正后的数据。然后根据不同的驱动选择不同的设置方式,通过/var/log/Xorg.0.log文件查看设备使用的驱动。evdev使用evedev驱动时,可以直接使用xinput_calibrator输出的数据,无需其他设置。测试时使用xinput设置EvdevAxisCalibration属性。libinput在使用libinput驱动时,需要计算xinput_calibrator输出的数据后才能使用。计算方法见:libinputbreaksxinput_calibrator在这里把计算方法写成脚本,内容如下:#!/usr/bin/envpython3#-*-coding:UTF-8-*-importsysdefusage():info="Usage:"+sys.argv[0]info+=""info+=""info+=""print(info)print("\tScreenwidth/hightbythecommand'xrandr|grepscreen'got")print("\tClickx/ybythecommand'xinput_calibrator-v'got")sys.exit(0)defconvert(screen_x,screen_y,c0_x,c0_y,c3_x,c3_y):a=(screen_x*6/8)/(c3_x-c0_x)c=((screen_x/8)-(a*c0_x))/screen_xe=(screen_y*6/8)/(c3_y-c0_y)f=((screen_y/8)-(e*c0_y))/screen_yprint("尝试将'libinput校准矩阵'设置为'%.1f,0.0,%.1f,0.0,%.1f,%.1f,0.0,0.0,1.0'"%(a,c,e,f))if__name__=="__main__":iflen(sys.argv)!=7:u圣人()转换(int(sys.argv[1]),int(sys.argv[2]),int(sys.argv[3]),int(sys.argv[4]),int(sys.argv[5]),int(sys.argv[6]))在测试时使用xinput设置libinputCalibrationMatrix属性。如果设置上面计算的值后还是有问题,可以尝试计算方法CalculatetheCoordinateTransformationMatrix。如果不行,切换到evdev驱动,即安装xserver-xorg-input-evdev然后在/etc/X11/xorg.conf.d目录下添加99-touchscreen-evdev.conf,内容如下:Section"InputClass"Identifier"calibration"Driver"evdev"MatchProduct""EndSection触摸屏产品可以从/var/log/Xorg.0.log中获取。例如在华为上执行校正操作的输出如下:deepin@deepin-PC:~$xinput_calibrator-vDEBUG:XInputExtensionversionis2.3DEBUG:Skippingvirtualmasterdevicesanddeviceswithoutaxisvaluators.DEBUG:Skippingdevice'VirtualcoreXTESTpointer'id=4,不报告绝对事件。调试:跳过设备'SYNA1D31:0006CB:CD48Touchpad'id=12,不报告绝对事件。调试:所选设备:SYNA2393:0006CB:19ACDEBUG:不是usbtouchscreen校准器:不是USB触摸屏设备调试:Evdev轴校准未设置,设置为轴评估器以确保。设置校准数据:0、3000、0、2000DEBUG:成功应用轴校准。DEBUG:读取轴交换值0。DEBUG:读取InvertX=0,InvertY=0。为“SYNA2393:0006CB:19AC”id校准EVDEV驱动程序=11个当前校准值(来自XInput):min_x=0,max_x=3000andmin_y=0,max_y=2000DEBUG:Foundthat'SYNA2393:0006CB:19AC'isasysfsname.DEBUG:Addingclick0(X=382,Y=246)调试:添加点击1(X=2647,Y=246)调试:添加点击2(X=376,Y=1761)调试:添加点击3(X=2640,Y=1764)做动态重新校准:设置校准数据:2,3021,-7,2015DEBUG:成功应用轴校准。-->使校准永久化<--DEBUG:发现'SYNA2393:0006CB:19AC'是一个sysfs名称。将下面的代码片段复制到“/etc/X11/xorg.conf.d/99-calibration.conf”(在某些发行版中为/usr/share/X11/xorg.conf.d/)部分“InputClass”标识符“校准”MatchProduct"SYNA2393:0006CB:19AC"Option"Calibration""23021-72015"Option"SwapAxes""0"EndSectionXorg.0.log中设备驱动相关的日志如下:[7221.421](II)config/udev:Adding输入设备SYNA2393:0006CB:19AC(/dev/input/event7)[7221.421](**)SYNA2393:0006CB:19AC:ApplyingInputClass"evdevtouchscreencatchall"[7221.421](**)SYNA2393:0006CB:19AC:应用InputClass“libinputtouchscreencatchall”[7221.421](**)SYNA2393:0006CB:19AC:ApplyingInputClass"calibration"[7221.421](II)LoadModule:"evdev"[7221.421](II)Loading/usr/lib/xorg/modules/input/evdev_drv.so[7221.421](II)模块evdev:vendor="X.OrgFoundation"[7221.421]为1.19.1编译,模块版本=2.10.5[7221.421]模块类:X.OrgXInputDriver[7221.421]ABI类:X.orgXInputdriver,version24.1[7221.421](II)Usinginputdriver'evdev'for'SYNA2393:0006CB:19AC'evdev执行命令xinputset-prop11EvdevAxisCalibration23021-72015上面使用libinput的测试结果点击0和点击3的值以及xrandr得到的屏幕宽/高计算如下:$python3./touchscreen_calibration_convert.py3441933822463761761Tryset'libinputCalibrationMatrix'to'-43.0,0.0,47.9,0.0,0.1,0.0,0.0,0.0,1.0'执行命令xinputset-prop11libinputCalibrationMatrix-43.00.047.90.00.10.00.00.01.0测试结果的其他问题有些设备根据设置后还是有一些问题对于上面的步骤,这里罗列一些遇到的。一旦出现以下情况,请将驱动切换为evdev再进行设置。如果点击左上角但反馈在左下角,将OptionInvertY"true"添加到90-touchscreen-calibrator.conf。左右相反,比如点击左上角但反馈在右下角,在90-touchscreen-calibrator.conf中添加OptionInvertX"true"。对于边缘偏移,如果你点击最右边的区域,但反馈在旁边,你可以调整OptionCalibration的值,其中包含:“min-xmax-xmin-ymax-y”。在所有四个边缘上尝试一下,并调整相应的值。反之,如果点击左上角但反馈在右上角,则在90-touchscreen-calibrator.conf中添加OptionSwapAxes"true"。上面的持久化测试无误后,会集成到系统中,每次启动都会自动执行。通过xorg.conf.d挂钩自动执行,将90-touchscreen-calibrator.conf添加到/etc/X11/xorg.conf.d/目录。evdev示例内容如下:Section"InputClass"Identifier"calibration"MatchProduct"SYNA2393:0006CB:19AC"Option"Calibration""23021-72015"Option"SwapAxes""0"EndSectionlibinput示例内容如下:Section"InputClass"Identifier"calibration"MatchProduct"SYNA2393:0006CB:19AC"Option"CalibrationMatrix""-43.00.047.90.00.10.00.00.01.0"EndSectiondevicemapping如果有多个屏幕,需要指定对应的设备到触摸屏,使用xinput--map-output-to。设备名称就是上面获取的id,输出名称可以通过xrandr命令获取。为了持久化,可以在/etc/X11/xinit/xinitrc.d目录下添加90-touchscreen-map,内容就是上面的命令。参考文档man4evdev:需要安装xserver-xorg-input-evdevman4libinput:需要安装xserver-xorg-input-libinput