[转载]Xlib 窗口属性(2)
(2016-03-01 18:49:37)
标签:
转载 |
分类: Linux |
原文地址:Xlib 窗口属性(2) 作者:枯草
事件队列管理
Xlib 维护一个事件队列。不过,操作系统也可能在其还没有读入事件队列的网络连接中缓冲数据。
要检查事件队列中的事件数目,使用 XEventsQueued。
int XEventsQueued(display, mode )
Display *display ;
int mode ;
display 指定到 X server 的连接。
mode
指定模式。你可以发送 QueuedAlready、QueuedAfterFlush、或者
QueuedAfterReadiing。
如果模式是 QueuedAlready,XEventsQueued 返回已经在事件队列中的事件数目(并且从不执行系统调用)。如果模式是
QueuedAfterFlush,如果已经在事件队列中的事件数目不是零的话,XEventsQueued
返回它。如果没有事件在队列中,XEventsQueued
刷新输出缓冲区,尝试将更多的事件从应用程序的连接中读出,并且返回读取的数目。如果 mode 是
QueuedAfterReading,并且如果已经在队列中的事件数目不是零,XEventsQueued
返回它。如果队列中没有事件,XEventsQueued
尝试从应用程序的连接中读出更多的事件但并不刷新输出缓冲区,并且返回读出的数目。
如果队列中已有事件,XEventsQueued 总是立即返回而无须任何 I/O。模式为 QueuedAfterFlush 的
XEventsQueued 在行为上与 XPending 是一致的。模式为 QueuedAlready 的 XEventsQueued
与 XQLength 函数一致。
用 XPending 返回未决的事件数目,
int XPending(display )
Display *display ;
display 指定到 X server 的连接。
XPending 函数返回已经从 X server 接收到但还没有从队列中移出的事件数目。XPending 与模式指定为
QueuedAfterFlush 的 XEventsQueued 一致。
维护事件队列
Xlib 提供用于维护事件队列的函数。包括三部分:
•获取事件,随后将它们从队列中移出
•在队列中窥探事件而不用将它们移出
•获取与事件掩码或者你提供的任意断言过程匹配的事件
1. 返回下一个事件
要得到下一个事件并将其从队列中移出,使用 XNextEvent。
XNextEvent(display, event_return )
Display *display ;
XEvent *event_return ;
display 指定到 X server 的连接。
event_return 返回队列中的下一个事件。
XNextEvent 函数从事件队列拷贝第一个事件到指定的 XEvent
结构中,然后将这个事件从队列中移出。如果事件队列是空的,XNextEvent 刷新输出缓冲区并阻塞直到收到事件。
使用 XPeekEvent 来窥探事件队列。
XPeekEvent(display, event_return )
Display *display ;
XEvent *event_return ;
display 指定到 X server 的连接。
event_return
返回与相关结构匹配事件的一个副本。
XPeekEvent 函数从队列中返回第一个事件,但是它并不将事件从队列中移出。如果队列为空,XPeekEvent
刷新输出缓冲区并阻塞直到接收到事件。它随后将事件复制到客户程序补充的 XEvent 结构中,而不将事件从事件队列中移出。
2. 使用断言过程选择事件
在这一部分中讨论的每一个函数都要求你传送一个断言过程来判断某个事件是否与你想要的相匹配。你的断言过程必须决定事件是否有用,并且绝不能调用
Xlib 函数。特别是,断言过程是从事件程序内部调用的,这个事件程序必须锁定数据结构以使事件队列在多线程环境中是一致的。
断言过程以及其相关的参数是:
Bool (*predicate)(display, event, arg )
Display *display ;
XEvent *event ;
char *arg ;
display 指定到 X server 的连接。
event 指定 XEvent 结构。
维护事件队列
•获取事件,随后将它们从队列中移出
•在队列中窥探事件而不用将它们移出
•获取与事件掩码或者你提供的任意断言过程匹配的事件
1. 返回下一个事件
2. 使用断言过程选择事件