You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:34:32