这是我在学习 CPF 和 Avalonia 过程中,编写的 X11 触摸测试程序所测试到的一些行为

前置博客: dotnet 学习 CPF 框架笔记 了解 X11 里如何获取触摸信息

X11 触摸测试程序

测试程序开源代码路径: https://github.com/dotnet-campus/ManipulationDemo/tree/master/ManipulationDemoCpfX11

此测试程序基于 CPF 的源代码进行编写

XI_Leave 行为

以下是我测试到的 XI_Leave 的行为逻辑

当存在别的窗口在当前的窗口之上时,触摸先进入当前的窗口,让当前的进程收到了 X11 的 Down 事件。接着在不断移动,不断收到 Move 事件。当移动到别的窗口之上时,将可以收到 XiEventType.XI_Leave 类型的事件。接着在别的窗口移动过程中,继续收到 Move 事件。抬手时,可以收到 End 事件

本文代码放在 githubgitee 上,可以使用如下命令行拉取代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 43711cd55b54616e0d75a70d61dec5591151ad2b

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 43711cd55b54616e0d75a70d61dec5591151ad2b

获取代码之后,进入 BujeeberehemnaNurgacolarje 文件夹,即可获取到源代码

触摸宽度高度

在我的一台设备里面,使用的是统信 UOS 系统,复现出丢失触摸宽度高度信息

执行名为 CaijawhejiJoballbarwi 的测试程序,可以看到如下控制台输出。此 CaijawhejiJoballbarwi 测试程序代码可在后文获取到

WH=1920,1080
ABS_MT_TOUCH_MAJOR=282 Name=Abs MT Touch Major ABS_MT_TOUCH_MINOR=283 Name=Abs MT Touch Minor Abs_MT_Pressure=287 Name=Abs MT Pressure
XIDeviceInfo [0] 2 XIMasterPointer
XIDeviceInfo [1] 3 XIMasterKeyboard
XiValuatorClassInfo Label=140(Rel X) Value=427; Max=-1.00; Min=-1.00; Resolution=1)
XiValuatorClassInfo Label=141(Rel Y) Value=736; Max=-1.00; Min=-1.00; Resolution=1)
XiValuatorClassInfo Label=293(Rel Vert Wheel) Value=853; Max=-1.00; Min=-1.00; Resolution=1)
Can't find TouchMajorAtom 丢失触摸宽度高度

从以上的输出日志可以看到,只是拿到了 XiValuatorClassInfo 为 Rel XRel Y 等信息,而没有触摸宽度高度需要的 Abs MT Touch MajorAbs MT Touch Minor 信息

此时尝试触摸一下屏幕,从 CaijawhejiJoballbarwi 程序里面的 XNextEvent 收到的 GenericEvent 里,取出的 XIDeviceEvent 事件参数里面的 valuators 集合里面,也是只有 Rel XRel Y 等信息,没有 Abs MT Touch MajorAbs MT Touch Minor 信息

此时执行 xinput list 可见如下输出信息

$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]

在触摸没有宽度高度信息时,使用 xinput list 2 所见也是没有 Abs MT Touch MajorAbs MT Touch Minor 信息,只有 Rel XRel Y 等信息

$ xinput list 2
Virtual core pointer                            id=2    [master pointer  (3)]
        Reporting 6 classes:
                Class originated from: 18. Type: XIButtonClass
                Buttons supported: 13
                Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
                Button state:
                Class originated from: 18. Type: XIValuatorClass
                Detail for Valuator 0:
                  Label: Rel X
                  Range: -1.000000 - -1.000000
                  Resolution: 1 units/m
                  Mode: relative
                Class originated from: 18. Type: XIValuatorClass
                Detail for Valuator 1:
                  Label: Rel Y
                  Range: -1.000000 - -1.000000
                  Resolution: 1 units/m
                  Mode: relative
                Class originated from: 18. Type: XIValuatorClass
                Detail for Valuator 2:
                  Label: Rel Vert Wheel
                  Range: -1.000000 - -1.000000
                  Resolution: 1 units/m
                  Mode: relative
                Class originated from: 18. Type: XIScrollClass
                Scroll info for Valuator 2
                  type: 1 (vertical)
                  increment: -1.000000
                  flags: 0x2 ( preferred )
                Class originated from: 10. Type: XITouchClass
                Touch mode: direct
                Max number of touches: 50

如此可以证明这是从 X11 底层就没有拿到触摸的宽度高度信息,和任何上层 UI 框架都没有关系,和应用程序本身没有关系

如果此时触摸一下触摸屏,则再次执行 CaijawhejiJoballbarwi 测试程序,可以获取到触摸宽度高度信息

WH=1920,1080
ABS_MT_TOUCH_MAJOR=282 Name=Abs MT Touch Major ABS_MT_TOUCH_MINOR=283 Name=Abs MT Touch Minor Abs_MT_Pressure=287 Name=Abs MT Pressure
XIDeviceInfo [0] DeviceId=2 Name=559AACBA03D0(Virtual core pointer) Use=XIMasterPointer Attachment=3
XIDeviceInfo [1] DeviceId=3 Name=559AACBA03F0(Virtual core keyboard) Use=XIMasterKeyboard Attachment=2
XiValuatorClassInfo Label=285(Abs MT Position X) Value=7157; Max=32767.00; Min=0.00; Resolution=38000)
XiValuatorClassInfo Label=286(Abs MT Position Y) Value=19969; Max=32767.00; Min=0.00; Resolution=66000)
PressureAtom Value=1075; Max=4095.00; Min=0.00; Resolution=0
TouchMajorAtom Value=87; Max=18950.00; Min=0.00; Resolution=10000
TouchMinorAtom Value=40; Max=10660.00; Min=0.00; Resolution=10000
XiValuatorClassInfo Label=284(Abs MT Orientation) Value=-32; Max=15707.00; Min=-15707.00; Resolution=0)

再次执行 xinput list 2 命令,也是可以看到触摸宽度高度信息

$ xinput list 2
Virtual core pointer                            id=2    [master pointer  (3)]
        Reporting 8 classes:
                Class originated from: 10. Type: XIButtonClass
                Buttons supported: 13
                Button labels: "Button Unknown" "Button Unknown" "Button Unknown" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
                Button state:
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 0:
                  Label: Abs MT Position X
                  Range: 0.000000 - 32767.000000
                  Resolution: 38000 units/m
                  Mode: absolute
                  Current value: 741.000000
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 1:
                  Label: Abs MT Position Y
                  Range: 0.000000 - 32767.000000
                  Resolution: 66000 units/m
                  Mode: absolute
                  Current value: 31492.000000
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 2:
                  Label: Abs MT Pressure
                  Range: 0.000000 - 4095.000000
                  Resolution: 0 units/m
                  Mode: absolute
                  Current value: 139.000000
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 3:
                  Label: Abs MT Touch Major
                  Range: 0.000000 - 18950.000000
                  Resolution: 10000 units/m
                  Mode: absolute
                  Current value: 37.000000
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 4:
                  Label: Abs MT Touch Minor
                  Range: 0.000000 - 10660.000000
                  Resolution: 10000 units/m
                  Mode: absolute
                  Current value: 11.000000
                Class originated from: 10. Type: XIValuatorClass
                Detail for Valuator 5:
                  Label: Abs MT Orientation
                  Range: -15707.000000 - 15707.000000
                  Resolution: 0 units/m
                  Mode: absolute
                  Current value: -32.000000
                Class originated from: 10. Type: XITouchClass
                Touch mode: direct
                Max number of touches: 50

此问题复现步骤:

  1. 挂机,不要碰屏幕,等待一段时间,也许是半个小时以上
  2. 使用 SSH 远程、或键盘在终端,启动 CaijawhejiJoballbarwi 测试程序或空 Avalonia 程序。即一定不要用触摸双击打开
  3. 此时可见 CaijawhejiJoballbarwi 测试程序和 xinput 都报告没有触摸宽度高度信息

如果此时触摸了一下触摸屏,则再次启动 CaijawhejiJoballbarwi 测试程序或使用 xinput 都能拿到触摸宽度高度信息

预计是一段时间没有碰触摸屏,导致触摸进入某个状态

本文以上代码放在 githubgitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin c64e19bfab4a85720d9a0692f1de3c960d6d8ce1

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin c64e19bfab4a85720d9a0692f1de3c960d6d8ce1

获取代码之后,进入 X11/CaijawhejiJoballbarwi 文件夹,即可获取到源代码


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/%E8%AE%B0-X11-%E9%87%8C%E9%9D%A2%E8%A7%A6%E6%91%B8%E7%9A%84%E4%B8%80%E4%BA%9B%E8%A1%8C%E4%B8%BA.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利