aboutsummaryrefslogtreecommitdiffstats
path: root/pugl/detail/x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'pugl/detail/x11.c')
-rw-r--r--pugl/detail/x11.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index bbf4307..49c843b 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -671,6 +671,8 @@ puglDispatchEvents(PuglWorld* world)
Display* display = world->impl->display;
XFlush(display);
+ world->impl->dispatchingEvents = true;
+
// Process all queued events (locally, without flushing or reading)
while (XEventsQueued(display, QueuedAlready) > 0) {
XEvent xevent;
@@ -783,6 +785,8 @@ puglDispatchEvents(PuglWorld* world)
}
}
+ world->impl->dispatchingEvents = false;
+
return PUGL_SUCCESS;
}
@@ -811,7 +815,15 @@ puglPostRedisplay(PuglView* view)
PuglStatus
puglPostRedisplayRect(PuglView* view, PuglRect rect)
{
- if (view->visible) {
+ if (view->world->impl->dispatchingEvents) {
+ // Currently dispatching events, add/expand expose for the loop end
+ const PuglEventExpose event = {
+ PUGL_EXPOSE, 0, rect.x, rect.y, rect.width, rect.height, 0
+ };
+
+ addPendingExpose(view, (const PuglEvent*)&event);
+ } else if (view->visible) {
+ // Not dispatching events, send an X expose so we wake up next time
const int x = (int)floor(rect.x);
const int y = (int)floor(rect.y);
const int w = (int)ceil(rect.x + rect.width) - x;