Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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;
        }
    }
}