void Object::_edje_signal_handler_callback( void *data, Evas_Object *obj, const char *emission, const char *source ) { Dout( dc::notice, "Object::_edje_signal_handler_callback( " << (emission ? emission:"<null>") << ", " << (source ? source:"<null>") << " ) " ); SignalSignal* signal = reinterpret_cast<SignalSignal*>( data ); if ( signal ) signal->emit( emission, source ); else Dout( dc::warning, "Object::_edje_signal_handler_callback() - got callback without valid signal" ); }
void StateMachineLoop::connect(int event, const SignalSlot &slot) { SignalSignal *signal = new SignalSignal(); mSignalList.insert(pair <int, SignalSignal *> (event, signal)); signal->connect(slot); }
void Object::connect (const std::string &emission, const std::string &source, const SignalSlot& slot) { SignalSignal* signal = new SignalSignal(); mSignalList[std::pair <std::string, std::string> (emission, source)] = signal; AllocTag( signal, emission ); signal->connect( slot ); edje_object_signal_callback_add( o, emission.c_str (), source.c_str (), &_edje_signal_handler_callback, static_cast<void*>( signal ) ); }
void StateMachineLoop::run() { LOG4CXX_TRACE(mLogger, "+run"); StateMachineAccessor &stateMachineAccessor(StateMachineAccessor::getInstance()); while (mRunning) { LOG4CXX_TRACE(mLogger, "+run::running while"); mEventMutex.lock(); // this waiting loop runs until someone pushed an event to the event queue while (!mSM->hasEvents()) { LOG4CXX_TRACE(mLogger, "!mSM->eventQueue.empty()"); // here is the point the loop waits if no event is in the event queue mEventsInQueue.wait(mEventMutex); if (!mRunning) { mEventMutex.unlock(); LOG4CXX_TRACE(mLogger, "!mRunning"); return; } } LOG4CXX_TRACE(mLogger, "mSM->eventQueue.empty()"); int event = mSM->getNextEvent(); mEventMutex.unlock(); LOG4CXX_DEBUG(mLogger, "+EventQueue size: " << mSM->getEventCount()); try { mSM->evaluateState(event); } catch (StateMachineFinishException finisEx) { mRunning = false; LOG4CXX_INFO(mLogger, "trigger statemachine finish"); } // pop element after working LOG4CXX_DEBUG(mLogger, "-EventQueue size: " << mSM->getEventCount()); // emit event signals multimap <int, SignalSignal *>::iterator findResult = mSignalList.find(event); multimap <int, SignalSignal *>::iterator lastElement = mSignalList.upper_bound(event); if (findResult != mSignalList.end()) { // emit also multible signals... for (; findResult != lastElement; ++findResult) { LOG4CXX_DEBUG(mLogger, "call event '" << event << "' to app"); SignalSignal *signal = (*findResult).second; signal->emit(event); } } LOG4CXX_TRACE(mLogger, "-run::running while"); // emit the signal broadcast // this is e.g. useful to dispatch signals to another thread mSignalBroadcast.emit(event); mEventMutex.lock(); mSM->popEvent(); mEventMutex.unlock(); LOG4CXX_TRACE(mLogger, "-run"); } }