我正在编写一个具有 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 事件处理函数似乎是阻塞的,所以如果你想在它们阻塞之前进行一些处理,它们并不适合使用,但前提是它们会阻塞!
编辑:为了记录,这是我使用的解决方案。这是 nm 的简化版本:
while (XNextEvent(display, &ev) >= 0) {
switch (ev.type) {
// Process events, remember any redraws needed later
}
if (!XPending(display)) {
// No more events, redraw if needed
}
}