void EventDispatcher::handleEvent(_R<Event> e) { check(); e->check(); Locker l(handlersMutex); map<tiny_string, list<listener> >::iterator h=handlers.find(e->type); if(h==handlers.end()) { LOG(LOG_CALLS,_("Not handled event ") << e->type); return; } LOG(LOG_CALLS, _("Handling event ") << h->first); //Create a temporary copy of the listeners, as the list can be modified during the calls vector<listener> tmpListener(h->second.begin(),h->second.end()); l.release(); //TODO: check, ok we should also bind the level for(unsigned int i=0;i<tmpListener.size();i++) { if( (e->eventPhase == EventPhase::BUBBLING_PHASE && tmpListener[i].use_capture) || (e->eventPhase == EventPhase::CAPTURING_PHASE && !tmpListener[i].use_capture)) continue; incRef(); //The object needs to be used multiple times e->incRef(); //tmpListener is now also owned by the vector tmpListener[i].f->incRef(); //If the f is a class method, the 'this' is ignored ASObject* const arg0=e.getPtr(); ASObject* ret=tmpListener[i].f->call(this,&arg0,1); if(ret) ret->decRef(); //And now no more, f can also be deleted tmpListener[i].f->decRef(); } e->check(); }