记 X11 里面触摸的一些行为

news/2024/10/23 13:31:22

前置博客: 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 事件

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

先创建一个空文件夹,接着使用命令行 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: XIButtonClassButtons supported: 13Button 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: XIValuatorClassDetail for Valuator 0:Label: Rel XRange: -1.000000 - -1.000000Resolution: 1 units/mMode: relativeClass originated from: 18. Type: XIValuatorClassDetail for Valuator 1:Label: Rel YRange: -1.000000 - -1.000000Resolution: 1 units/mMode: relativeClass originated from: 18. Type: XIValuatorClassDetail for Valuator 2:Label: Rel Vert WheelRange: -1.000000 - -1.000000Resolution: 1 units/mMode: relativeClass originated from: 18. Type: XIScrollClassScroll info for Valuator 2type: 1 (vertical)increment: -1.000000flags: 0x2 ( preferred )Class originated from: 10. Type: XITouchClassTouch mode: directMax 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: XIButtonClassButtons supported: 13Button 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: XIValuatorClassDetail for Valuator 0:Label: Abs MT Position XRange: 0.000000 - 32767.000000Resolution: 38000 units/mMode: absoluteCurrent value: 741.000000Class originated from: 10. Type: XIValuatorClassDetail for Valuator 1:Label: Abs MT Position YRange: 0.000000 - 32767.000000Resolution: 66000 units/mMode: absoluteCurrent value: 31492.000000Class originated from: 10. Type: XIValuatorClassDetail for Valuator 2:Label: Abs MT PressureRange: 0.000000 - 4095.000000Resolution: 0 units/mMode: absoluteCurrent value: 139.000000Class originated from: 10. Type: XIValuatorClassDetail for Valuator 3:Label: Abs MT Touch MajorRange: 0.000000 - 18950.000000Resolution: 10000 units/mMode: absoluteCurrent value: 37.000000Class originated from: 10. Type: XIValuatorClassDetail for Valuator 4:Label: Abs MT Touch MinorRange: 0.000000 - 10660.000000Resolution: 10000 units/mMode: absoluteCurrent value: 11.000000Class originated from: 10. Type: XIValuatorClassDetail for Valuator 5:Label: Abs MT OrientationRange: -15707.000000 - 15707.000000Resolution: 0 units/mMode: absoluteCurrent value: -32.000000Class originated from: 10. Type: XITouchClassTouch mode: directMax number of touches: 50

此问题复现步骤:

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

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

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

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

先创建一个空文件夹,接着使用命令行 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 文件夹,即可获取到源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72108.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

怎么利用 OBS 推送 webrtc 流 ( whip/whep ) 到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link: h…

关于蜂窝模组天线的一些大白话常识

​ 蜂窝模组这个产品形态存在的最大意义,从产业链分工上来说,是提升社会效率。 毕竟让每个需要蜂窝通信的公司自建一个团队重复造轮子,既不经济,也不聪明,就像做衣服的绝大部份公司也没必要自己做拉链一样。 蜂窝模组产品本身最大的特点之一——就是标准化。 无论软件的标…

AT开发HTTP应用:Air780EP低功耗4G模组

​已经写了一篇基于Air780EP模组AT开发的FOTA远程升级指南,有客户朋友询问能否讲讲HTTP应用部分?本期特别安排——涵盖HTTP基本应用流程、GET/POST/SSL请求示例、断点续传、常见问题等内容。 Air780EP是一款低功耗4G全网通模组,兼容模组行业1618经典封装,支持OpenCPU开发及…

MQTT应用:Air780EP低功耗4G模组AT开发

​终于要讲一讲MQTT应用! 本文应各位大佬邀请,详细讲解Air780EP模组MQTT应用的多个AT命令。 Air780EP是低功耗4G模组之一,支持全系列的AT指令以及LuatOS脚本二次开发。 一、准备工作 ​1.1 硬件准备合宙EVB_Air780EP开发板一套,包括天线、SIM卡;USB线PC电脑1.2 软件准备串…

读数据工程之道:设计和构建健壮的数据系统10技术选择

技术选择1. 选择技术 1.1. 架构第一,技术第二 1.2. 现如今数据工程师因技术种类过于繁杂丰富而感到选择困难 1.3. 许多完整并可立即使用的数据技术触手可得1.3.1. 开源代码1.3.2. 托管开源1.3.3. 软件专利1.3.4.…

Pyenv 安装 使用

目录简介如何安装1. 获取Pyenv2. 设置环境变量3. 重启 shell使用指南安装一个 Python 版本。切换 Python 版本。卸载 Python 版本。更新 PyenvPyenv-virtualenv安装创建虚拟环境激活虚拟环境删除虚拟环境 简介 Pyenv 是一款 Python 的版本管理工具,是使用纯 Shell 脚本编写的。…

ROS通信方式(保姆级教程)

目录ROS通信方式主题前言发布器编程实例:小海龟速度控制步骤如下注意:以下是拿小海龟的矩形来写,圆形也一样实现效果订阅器编程实例:小乌龟速度接收 ROS通信方式 主题 前言 工作空间: catkin_ws1 ROS功能包: xhgpfk c++文件: xhgfk.cpp和sudujieshou.cpp 定义一个可执行文件…

我在大厂做 CR——为什么建议使用枚举来替换布尔值

使用枚举替换布尔值主要基于以下几个原因 ● 可读性 ● 可拓展性 ● 安全防控可读性我们会定义 boolean 类型(true 或 false)作为方法参数,虽然比较简洁,但有时候参数的含义往往不够清晰,造成阅读上的障碍,比如:参数可能表示“是否开启某个功能”,但仅凭 true 和 false…