public XEvent DequeueUnlocked (out bool paint)
{
paint = false;
try_again:
XEvent xev = xqueue.Dequeue ();
if (xev != null)
return xev;
xev = paint_queue.Dequeue ();
if (xev != null) {
paint = true;
return xev;
}
// both queues are empty. go to sleep until NextTimeout
// (or until there's an event to handle).
if (Monitor.Wait (xqueue, NextTimeout (DateTime.UtcNow), true)) {
/* the lock was reaquired before timeout.
i.e. we have an event now */
goto try_again;
}
else
return null;
}