我正在写有X11 / Xlib的接口,和我的事件处理循环看起来像这样的程序:
while (XNextEvent(display, &ev) >= 0) {
switch (ev.type) {
// Process events
}
}
问题是,当窗口大小,我得到了一堆Expose
事件告诉我的窗口部件重绘其。 如果我到事件的直接反应重绘他们,重绘操作非常滞后,因为它是如此之慢(调整我能看到所有新失效的矩形刷新逐一后)。
我想这样做是为了记录更新的窗口大小,它的变化,只有整个窗口上运行一个重绘操作(或至少只有两个矩形)时,有没有更多的事件留下来处理。
不幸的是,我不能明白的方式来做到这一点。 我尝试这样做:
do {
XPeekEvent(display, &ev);
while (XCheckMaskEvent(display, ExposureMask | StructureNotifyMask, &ev)) {
switch (ev.type) {
// Process events, record but don't process redraw events
}
}
// No more events, do combined redraw here
}
这实际上做的工作,但它是一个小效率低,而且如果一个事件到达时,我不感兴趣的XCheckMaskEvent
调用不会从队列中删除它,所以它在那里停留停止XPeekEvent
阻塞,导致100%的CPU使用。
我只是想知道是否有实现的延迟/组合重绘我是后一种标准的方式? 许多Xlib的事件处理功能似乎阻塞,因此,他们没有真正合适的,如果你想要做他们阻止之前一些处理使用,但只有当他们将阻止!
编辑:为了记录在案,这是我使用的解决方案。 这是纳米的一个简化版本:
while (XNextEvent(display, &ev) >= 0) {
switch (ev.type) {
// Process events, remember any redraws needed later
}
if (!XPending(display)) {
// No more events, redraw if needed
}
}