X11中XI_TouchBegin、XI_TouchUpdate、XI_TouchEnd事件对应的结构体类型及头文件查询
X11中XI_TouchBegin、XI_TouchUpdate、XI_TouchEnd事件对应的结构体类型及头文件查询
嗨,刚好我之前做X11触摸相关开发时也踩过这个坑,来给你说清楚~
和你熟悉的XI_ButtonPress对应单独的XButtonEvent不同,XInput2里的XI_TouchBegin、XI_TouchUpdate、XI_TouchEnd这三个触摸事件,统一使用XIDeviceEvent结构体来表示,并没有单独的X???Touch???Event这类专属结构体哦。
你只需要把通用事件对象转换为XIDeviceEvent,然后通过结构体里的evtype字段就能区分具体是哪一种触摸事件——这个字段的值会直接匹配XI_TouchBegin、XI_TouchUpdate、XI_TouchEnd这几个预定义常量。
关于头文件,你需要在代码里包含:
#include <X11/extensions/XInput2.h>
另外编译项目的时候别忘了链接XInput库,比如在gcc/clang命令里加上编译参数-lXi,不然会出现找不到符号的链接错误。
给你贴个简单的事件处理代码片段参考:
// 假设你已经从X11事件队列中获取到了通用XEvent对象ev if (ev.type == GenericEvent && ev.xgeneric.extension == XI_GenericEventCode) { // 将通用事件结构体转换为XIDeviceEvent类型 XIDeviceEvent *touch_event = (XIDeviceEvent *)&ev.xgeneric; switch (touch_event->evtype) { case XI_TouchBegin: // 处理触摸开始逻辑,比如记录触摸ID、初始坐标等 break; case XI_TouchUpdate: // 处理触摸移动/状态更新,比如刷新触摸点位置 break; case XI_TouchEnd: // 处理触摸结束逻辑,比如清理对应触摸点的状态 break; } }
补充个小提醒:有些比较老旧的XInput资料里可能会提到XITouchEvent,但那是XInput早期版本的产物,现在XInput2的标准实现已经统一用XIDeviceEvent来涵盖所有设备相关事件(包括触摸、手势、摇杆输入等),所以直接用XIDeviceEvent就完全没问题。
备注:内容来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

