internal override bool GetMessage(object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
IntPtr evtRef = IntPtr.Zero;
IntPtr target = GetEventDispatcherTarget();
CheckTimers (DateTime.UtcNow);
ReceiveNextEvent (0, IntPtr.Zero, 0, true, ref evtRef);
if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
SendEventToEventTarget (evtRef, target);
ReleaseEvent (evtRef);
}
lock (queuelock) {
loop:
if (MessageQueue.Count <= 0) {
if (Idle != null)
Idle (this, EventArgs.Empty);
else if (TimerList.Count == 0) {
ReceiveNextEvent (0, IntPtr.Zero, 0.15, true, ref evtRef);
if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
SendEventToEventTarget (evtRef, target);
ReleaseEvent (evtRef);
}
} else {
ReceiveNextEvent (0, IntPtr.Zero, NextTimeout (), true, ref evtRef);
if (evtRef != IntPtr.Zero && target != IntPtr.Zero) {
SendEventToEventTarget (evtRef, target);
ReleaseEvent (evtRef);
}
}
msg.hwnd = IntPtr.Zero;
msg.message = Msg.WM_ENTERIDLE;
return GetMessageResult;
}
object queueobj = MessageQueue.Dequeue ();
if (queueobj is GCHandle) {
XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
goto loop;
} else {
msg = (MSG)queueobj;
}
}
return GetMessageResult;
}