2015-03-25 317 views
2

我们有我们校准使用xinput_calibrator,然后在我们的应用程序的启动脚本应用设置触摸屏设备,沿XINPUT触摸屏校准不一致

xinput set-int-prop "Microchip Technology Inc. AR1100 HID-MOUSE" "Evdev Axis Calibration" 32 109 3841 161 3973 
xinput set-int-prop "Microchip Technology Inc. AR1100 HID-MOUSE" "Evdev Axes Swap" 8 1 
xinput set-int-prop "Microchip Technology Inc. AR1100 HID-MOUSE" "Evdev Axis Calibration" 32 3852 112 3970 159 

行这种运作良好 - 有时。在其他时间,在重新上电后,校准将不会生效 - 轴交换,特别是缩放似乎关闭,尽管这很难说。再过几次电源循环,它会再次工作,然后不会。

我们是X11的新手,不确定为什么会发生这种情况。就好像我们的xinput语句有时会被处理并且被其他时候忽略,尽管除了重新启动以外没有任何改变。

有关如何解决这个问题的任何想法,赞赏。

+0

你的脚本是如何准确启动的(在启动时或手动启动时,在X11服务器启动之前还是之后)?在没有应用校准/交换的重新启动时,是否有助于再次运行脚本?真的需要完全重启吗,或者重新运行脚本并重新启动X11服务器就足够了? – 2015-03-25 10:12:45

+0

脚本在初始化期间启动,在x服务器启动后显式启动。我还没有尝试第二次运行脚本;这是在一个嵌入式系统上,很难停止我们的应用程序以重新启动它,因为一切都设置为在启动时自动启动。 – SixDegrees 2015-03-25 10:24:18

+0

那么,你可以在你的脚本中加入一个'sleep 60',以确保在你运行它之前一切都安定下来。您也可以两次运行“轴交换”行(间隔很小),以说明第一次不考虑命令的情况。最后,您可以记录'xinput --list --long'的输出和脚本的结尾,并比较与成功和失败配置相对应的日志。 – 2015-03-25 10:40:00

回答

1

由于X11服务器启动过程和xinput调用之间似乎存在争用条件,因此您必须等待启动过程完成。我建议你检查this answer提示如何检测X服务器是否正常运行。

如果这不起作用,您应该尝试检查返回代码xinput并等待配置触摸屏前成功。例如:

ts_dev="Microchip Technology Inc. AR1100 HID-MOUSE" 
ts_calibrate="Evdev Axis Calibration" 
ts_swap="Evdev Axes Swap" 

# repeat until xinput returns success for the first time 
while ! xinput set-int-prop "$ts_dev" "$ts_calibrate" 32 109 3841 161 3973 
do 
    sleep 1 
done 
xinput set-int-prop "$ts_dev" "$ts_swap" 8 1 
xinput set-int-prop "$ts_dev" "$ts_calibrate" 32 3852 112 3970 159 

您可能需要适应脚本的价值观,你的系统上xinput回报。

+0

试过这个,它似乎工作得很好。我添加了一个循环计数器,发现它在命令成功之前需要0到2秒之间 - 这仍然看起来很奇怪,但是我还没有看到任何使用这种方法的失败。谢谢。 – SixDegrees 2015-03-26 13:02:38