本章主要讲解libX11的开发相关使用内容主要是X11中事件响应的相关内容。用户的应用程序主要通过使用XOpenDisplay与XServerj建立的链接进行需求传递所有许多的Xlib的函数都会导致XServer产生相对应的事件例如鼠标和窗口的移动会产生异步事件然后XServer会将事件通过与客户端建立的链接传递给客户端本章主要讨论事件类型事件结构事件掩码事件处理。详细的讲解可以参考Xorg用户指导手册Events Types当调用Xlib函数时候会产生一些异步请求事件这些事件会从源窗口传递到父窗口直到客户端选择了这些事件或直接丢弃这些事件XServer会产生很多事件但是并不是所有事件都是客户端关心的所以需要在应用程序中设置有关事件掩码的窗口属性这样XServer就会通知客户端所关心的事件。设置事件掩码可以在创建窗口时设置也可以单独设置窗口属性时设置。用户也可以屏蔽一些从子窗口传递到父窗口的事件。但是MappingNotify事件(使用XMapWindow时产生)按会一直被传递无法被屏蔽。事件类型用来描述专门的事件产生的种类每一种类型都有相应的事件类型在X11/X.h中定义如下表所示。事件种类事件类型键盘事件KeyPress, KeyRelease鼠标事件ButtonPress, ButtonRelease, MotionNotify鼠标和窗口交会事件EnterNotify, LeaveNotify输入聚焦事件FocusIn, FocusOut键盘映射事件KeymapNotify显示事件Expose, GraphicsExpose, NoExpose结构控制事件CirculateRequest, ConfigureRequest, MapRequest,ResizeRequest窗口状态事件CirculateNotify, ConfigureNotify, CreateNotify, DestroyNotify, GravityNotify, MapNotify, MappingNotify, ReparentNotify, UnmapNotify, VisibilityNotify颜色映射事件ColormapNotify客户端沟通事件ClientMessage, PropertyNotify, SelectionClear, SelectionNotify,SelectionRequestEvent Structures在X11/Xlib.h中每一种事件都有相应的结构体所有的事件结构体都有以下共同的成员。typedef struct { int type; /*event type*/ unsigned long serial; /* # of last request processed by server */ Bool send_event; /* true if this came from a SendEvent request */ Display *display; /* Display the event was read from */ Window window; } XAnyEvent;在结构体中type标识了事件的类型这是唯一标识值。例如当XServer传送一个GraphicsExpose事件给客户端程序时它会发送一个XGraphicsExposeEvent结构体其中的type成员会被设置为GraphicsExposedisplay和window就会设置为已经创建的Display和Window,分别有XOpenDisplay和XCreateWindow创建如果是SendEvent协议请求send_event成员会被设置为true,serial是一个序列号从协议中获取的16位转换位32位的整形数据。XServer在等待事件回应时会储存收到的任何事件信息并将其存入队列中Xlib提供了检查事件队列的相关函数如XEventsQueued可以返回事件队列中事件的个数。除了使用单独的事件结构体通常我们使用一个联合体XEvent来包含所有的事件typedef union _XEvent { int type; /* must not be changed */ XAnyEvent xany; XKeyEvent xkey; XButtonEvent xbutton; XMotionEvent xmotion; XCrossingEvent xcrossing; XFocusChangeEvent xfocus; XExposeEvent xexpose; XGraphicsExposeEvent xgraphicsexpose; XNoExposeEvent xnoexpose; XVisibilityEvent xvisibility; XCreateWindowEvent xcreatewindow; XDestroyWindowEvent xdestroywindow; XUnmapEvent xunmap; XMapEvent xmap; XMapRequestEvent xmaprequest; XReparentEvent xreparent; XConfigureEvent xconfigure; XGravityEvent xgravity; XResizeRequestEvent xresizerequest; XConfigureRequestEvent xconfigurerequest; XCirculateEvent xcirculate; XCirculateRequestEvent xcirculaterequest; XPropertyEvent xproperty; XSelectionClearEvent xselectionclear; XSelectionRequestEvent xselectionrequest; XSelectionEvent xselection; XColormapEvent xcolormap; XClientMessageEvent xclient; XMappingEvent xmapping; XErrorEvent xerror; XKeymapEvent xkeymap; long pad[24]; } XEvent;XEvent联合体中的每一项事件都需要包含XAnyEvent结构体中的内容。Event Masks用户应用程序通过事件掩码选择需要报告的事件因为除非客户端程序特殊需要不然多数事件XServer是不会主动报告的。其中的事件SelectionClear, SelectionRequest, SelectionNotify, or ClientMessage无法被设置掩码当键盘和鼠标映射被改变后MappingNotify事件分别发送给客户端无法被屏蔽。相关事件类型和事件发生场景如下表所示。事件类型场景NoEventMask无事件发生KeyPressMask需要按键按下时响应KeyReleaseMask需要按键松开时响应ButtonPressMask需要按钮按下时响应ButtonReleaseMask需要按钮松开时响应EnterWindowMask需要鼠标进入窗口时响应LeaveWindowMask需要鼠标离开窗口时响应PointerMotionMask需要鼠标移动时响应PointerMotionHintMaskPointer需要鼠标移动提示时响应Button1MotionMask需要按钮1按下且鼠标移动时响应Button2MotionMask需要按钮2按下且鼠标移动时响应Button3MotionMask需要按钮3按下且鼠标移动时响应Button4MotionMask需要按钮4按下且鼠标移动时响应Button5MotionMask需要按钮5按下且鼠标移动时响应ButtonMotionMask需要任何按钮按下且鼠标移动时响应KeymapStateMask需要窗口进入聚焦键盘状态时响应ExposureMask需要任何显示时时响应VisibilityChangeMask需要任何可视化属性修改时响应StructureNotifyMask需要任何window结构体修改时响应ResizeRedirectMask需要resize window时响应SubstructureNotifyMaskSubstructure需要结构体通知时响应SubstructureRedirectMask需要给子窗口传递结构体需求时响应FocusChangeMask需要在任何输入设备聚焦时响应PropertyChangeMask需要在属性上的任何改变时响应ColormapChangeMask需要在颜色映射上的任何改变时响应OwnerGrabButtonMaskAutomatic需要在自动抓取会激活owner_event时响应Event Processing Overview对于很多事件来说当设置了相关的事件掩码则当事件发生时XServer会发送响应的事件变量但是设置对应的事件掩码后当该事件发生时XServer发送的事件常量可能不止一种同样多个事件发生时也可能发送同一种事件常量。如下表所示事件事件常量结构体普通结构体ButtonMotionMaskMotionNotifyXPointerMovedEventXMotionEventButton1MotionMaskMotionNotifyXPointerMovedEventXMotionEventButton2MotionMaskMotionNotifyXPointerMovedEventXMotionEventButton3MotionMaskMotionNotifyXPointerMovedEventXMotionEventButton4MotionMaskMotionNotifyXPointerMovedEventXMotionEventButton5MotionMaskMotionNotifyXPointerMovedEventXMotionEventButtonPressMaskButtonPressXButtonPressedEventXButtonEventButtonReleaseMaskButtonReleaseXButtonReleasedEventXButtonEventColormapChangeMaskColormapNotifyXColormapEventEnterWindowMaskEnterNotifyXEnterWindowEventXCrossingEventLeaveWindowMaskLeaveNotifyXLeaveWindowEventXCrossingEventExposureMaskExposeXExposeEventGCGraphicsExposures in GCGraphicsExposeNoExposeXGraphicsExposeEventXNoExposeEventFocusChangeMaskFocusInFocusOutXFocusInEventXFocusOutEventXFocusChangeEventKeymapStateMaskKeymapNotifyXKeymapEventKeyPressMaskKeyPressXKeyPressedEventXKeyEventKeyReleaseMaskKeyReleaseXKeyReleasedEventXKeyEventOwnerGrabButtonMaskN.A.N.A.PointerMotionMaskMotionNotifyXPointerMovedEventXMotionEventPointerMotionHintMaskN.A.N.A.PropertyChangeMaskPropertyNotifyXPropertyEventResizeRedirectMaskResizeRequestXResizeRequestEventStructureNotifyMaskCirculateNotify,ConfigureNotify,DestroyNotify,GravityNotify,MapNotify,ReparentNotify,UnmapNotifyXCirculateEvent,XConfigureEvent,XDestroyWindowEvent,XGravityEvent,XMapEvent,XReparentEvent,XUnmapEventSubstructureNotifyMaskCirculateNotify,ConfigureNotify,CreateNotify,DestroyNotify,GravityNotify,MapNotify,ReparentNotify,UnmapNotifyXCirculateEvent,XConfigureEvent,XCreateWindowEvent,XDestroyWindowEvent,XGravityEvent,XMapEvent,XReparentEvent,XUnmapEventSubstructureRedirectMaskCirculateReques,ConfigureRequest,MapRequestXCirculateRequestEvent,XConfigureRequestEvent,XMapRequestEventN.A.ClientMessageXClientMessageEventN.A.MappingNotifyXMappingEventN.A.SelectionClearXSelectionClearEventN.A.SelectionNotifyXSelectionEventN.A.SelectionRequestXSelectionRequestEventVisibilityChangeMaskVisibilityNotifyXVisibilityEvent
企业数字化 ERP 产品动态
相关推荐
RK3588-Camera:MIPI-CSI调试之通路解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 6:29:26
【C++上层应用】try/catch/throw 异常处理 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 6:29:26
Mem Reduct 中文界面配置:3 种切换方式 + 1 张排障表,10 秒完成汉化 Mem Reduct 中文界面配置:3 种切换方式 1 张排障表,10 秒完成汉化 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirro… · 2026/11/5 6:29:26
用MCIWnd四十行代码实现Win32 AVI播放器 简介:这是一份基于 MCIWnd 的 AVI 视频播放器示例工程,面向正在学习 MFC 多媒体编程、需要理解 MCIWnd 控件用法的开发者。工程实现通过“文件→打开”选择 AVI 文件,在客户区左上角创建 MCIWnd 窗口并显示首帧画面,点击控制条播放… · 2026/11/5 7:16:38
AD封装库全流程:原理图库、PCB库与3D库管理避坑 简介:面向Altium Designer用户的元器件库合集,覆盖原理图绘制到PCB布局布线的常见需求,适合刚入门AD、需要快速补齐基础库的电子工程师与在校学生,也便于有经验的设计者减少重复建库。压缩包共117个文件,约464.27MB&am… · 2026/11/5 7:16:38
MySQL存储过程实战指南:性能优化与安全实践 1. MySQL存储过程全面解析作为一名长期与MySQL打交道的数据库工程师,我深刻体会到存储过程在实际项目中的价值。今天我将系统性地分享MySQL存储过程的完整知识体系,包含大量教科书上不会提及的实战经验。存储过程本质上是一组预编译的SQL语句集合&#x… · 2026/11/5 7:16:38
医疗知识图谱构建:技术实现与行业应用 1. 医疗知识图谱的行业价值与挑战医疗行业每天产生海量的临床数据、科研文献和诊疗记录,但信息孤岛现象严重。三甲医院平均每年产生超过50TB的非结构化医疗数据,包括影像报告、电子病历、检验结果等。这些数据之间缺乏有效关联,导致临床决策支… · 2026/11/5 7:16:38
蓝牙Mesh网络中的AppKey绑定机制详解 1. 蓝牙Mesh网络中的关键绑定机制解析在蓝牙Mesh网络的实际部署中,Provisioning(配网)只是设备入网的第一步。许多开发者常犯的一个错误是认为设备配网后就能立即响应控制指令,但真实情况要复杂得多。让我们通过一个照明控制场景来… · 2026/11/5 7:16:37
OpenClaw 2026版核心能力与京东云部署指南 1. OpenClaw(Clawdbot)2026版核心能力解析OpenClaw作为新一代AI助理框架,在2026年3月发布的版本中实现了多项突破性升级。与市面上常见的聊天机器人不同,它真正实现了从"对话交互"到"任务执行"的跨越。我在实… · 2026/11/5 7:15:37
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38