我有一个事件循环,它定期在一组读取文件描述符上调用poll()
并在准备好从中读取事件时调度事件。这些文件描述符之一是XConnectionNumber()
返回的X连接文件描述符,当文件描述符准备好时将调用以下文件:
XEvent evt;
if (! XPending (display))
return false;
XNextEvent (display, &evt);
// do something with evt
这一切都可以很好地用于接收显示事件。
我的应用程序中的重新绘制依赖于XShm扩展,它实际上调用XShmPutImage()
来绘制一些像素,然后等待完成事件,直到再次绘制为止,方法是通过在窗口中检查evt.any.type == XShmGetEventBase (display)
来找到完成事件。以上代码。
问题是XShm完成事件似乎没有将显示器的文件描述符设置为可以进行I / O的操作,因此,我仅在将其他事件发送到显示器并设置fd时才获得重绘事件例如鼠标移动,按键事件等。这导致应用程序仅在发生其他事件时才响应。
我误解了XShm完成事件是如何发送的吗?它不应该设置Display fd吗?
答案 0 :(得分:0)
好的,我已经回答了我自己的问题。似乎我需要在POLLOUT
结构上为显示文件描述符设置pollfd
标志。以前,我只是在等待输入事件时才设置POLLIN
,但是XShm完成事件会将fd设置为可以写入。