资讯详情

资讯详情

libX11开发手册-第十章-窗口事件相关概念

本章主要讲解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
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →