コード例 #1
0
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" );
}
コード例 #2
0
void StateMachineLoop::connect(int event, const SignalSlot &slot)
{
  SignalSignal *signal = new SignalSignal();
  mSignalList.insert(pair <int, SignalSignal *> (event, signal));

  signal->connect(slot);
}
コード例 #3
0
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 ) );
}
コード例 #4
0
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");
  }
}