XSync - discard参数是什么意思?

时间:2013-01-25 14:09:53

标签: x11

根据man page,调用XSync(dpy, 1)会丢弃队列中的事件,但这究竟意味着什么?如果它们没有被丢弃,它们是否被发送两次(一次是XSync()呼叫,第二次是正常清空队列)?或者它就像一个垃圾收集器(事件会在以后被丢弃)?

2 个答案:

答案 0 :(得分:1)

XSync等待,直到请求输出缓冲区被清空(发送到服务器)。如果discard参数为True,则此函数将丢弃所有排队的事件。这些事件是从X服务器接收的。

考虑以下协议交换:

C -> S  QueryKeymap request
                                C <- S ConfigureNotify event
                                C <- S QueryKeymap reply

您在客户端应用程序中调用了XQueryKeymap,它向服务器发送了QueryKeymap协议消息。在执行此操作时,您调整了窗口大小,因此ConfigureNotify事件。

如果您在XSync(display, False)之后运行XQueryKeymap,则客户端将等待收到回复。下一次XPending(display)来电将返回上述1事件的ConfigureNotify排队事件数。

当使用XSync(display, True)时,XPending(display)会针对上述情况返回0

如果您的代码供他人使用,请使用True 来节省时间。有关使用True时可能出现的问题的示例,请参阅http://bugzilla.libsdl.org/show_bug.cgi?id=1859

答案 1 :(得分:0)

似乎你误解了两件事:X事件的X请求,它不一样。简而言之:

X requets:

  

...客户端应用程序通过此连接向X服务器发送请求。这些请求由客户端应用程序中调用的Xlib函数生成。 ...

X事件:

  

...许多Xlib函数导致X服务器生成事件,用户键入或移动指针可以异步生成事件。 X服务器将事件返回给客户端......

有关详情,请查看this - 这非常有用。

XSync这样调用:XSync(dpy, False)做两件事(根据你指出的manul):

  

XSync函数刷新输出缓冲区,然后等待,直到X服务器收到并处理了所有请求。

XSync以这种方式调用:XSync(dpy, True)执行上述两件事以及另外一件事:丢弃(处理)队列中的所有事件。

  

如果您传递了True,XSync()会丢弃队列中的所有事件,包括在调用XSync()之前队列中的那些事件。

例如(伪代码):

sendEvent2Xserver() //for example by pressing the key
endEvent2Xserver() //for example by mouse button press
XSendEvent() //sending chosen event to X server
XSync(dpy, True) // after this call, it's guaranteed that all the previous events were processed by the server