void MessagePump::dispatchAll() { _initReceiverQueue(); while( true ) { EventRef event; if( _needGlobalLock ) Global::enterCarbon(); const OSStatus status = ReceiveNextEvent( 0, 0, 0.0, true, &event ); if( status == eventLoopTimedOutErr ) break; if( status != noErr ) { EQWARN << "ReceiveNextEvent failed: " << status << std::endl; break; } EQVERB << "Dispatch Carbon event " << event << std::endl; if( !_needGlobalLock ) Global::enterCarbon(); const EventTargetRef target = GetEventDispatcherTarget(); SendEventToEventTarget( event, target ); Global::leaveCarbon(); ReleaseEvent( event ); } if( _needGlobalLock ) Global::leaveCarbon(); }
void MessagePump::dispatchOne( const uint32_t timeout ) { _initReceiverQueue(); _clock.reset(); for( int64_t timeLeft = timeout; timeleft >= 0; timeleft = timeout - _clock.getTime64( )) { if( _needGlobalLock ) Global::enterCarbon(); EventRef event; const float wait = EQ_MIN( float( timeLeft ) * .001f, .05f /* 50ms */ ); const OSStatus status = ReceiveNextEvent( 0, 0, wait, true, &event ); if( status == noErr ) { LBVERB << "Dispatch Carbon event " << event << std::endl; if( !_needGlobalLock ) Global::enterCarbon(); const EventTargetRef target = GetEventDispatcherTarget(); SendEventToEventTarget( event, target ); Global::leaveCarbon(); ReleaseEvent( event ); return; } if( _needGlobalLock ) Global::leaveCarbon(); if( status != eventLoopTimedOutErr ) { LBWARN << "ReceiveNextEvent failed: " << status << std::endl; return; } } }