internal override bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
XEventQueue queue = (XEventQueue) queue_id;
bool pending;
if ((flags & (uint)PeekMessageFlags.PM_REMOVE) == 0) {
throw new NotImplementedException("PeekMessage PM_NOREMOVE is not implemented yet"); // FIXME - Implement PM_NOREMOVE flag
}
pending = false;
if (queue.Count > 0) {
pending = true;
} else {
// Only call UpdateMessageQueue if real events are pending
// otherwise we go to sleep on the socket
if (XPending(DisplayHandle) != 0) {
UpdateMessageQueue((XEventQueue)queue_id);
pending = true;
} else if (((XEventQueue)queue_id).Paint.Count > 0) {
pending = true;
}
}
CheckTimers(queue.timer_list, DateTime.UtcNow);
if (!pending) {
return false;
}
return GetMessage(queue_id, ref msg, hWnd, wFilterMin, wFilterMax);
}