我有一个事件循环,它定期在一组读取文件描述符上调用 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完成事件的发送方式吗?它不应该设置显示fd?
1 回答
好的我已经回答了我自己的问题 . 看来我需要在
pollfd
结构上为显示文件描述符设置POLLOUT
标志 . 之前我只是在设置POLLIN
,因为我在等待输入事件,但XShm完成事件正在将fd设置为准备写入 .