- // special handling for numeric IrcEvents
- if((type & ~IrcEventNumericMask) == IrcEventNumeric) {
- ::IrcEventNumeric *numEvent = static_cast< ::IrcEventNumeric *>(event);
- if(!numEvent)
- qWarning() << "Invalid event type for IrcEventNumeric!";
- else {
- int num = numEvent->number();
- if(num > 0) {
- insertHandlers(registeredHandlers().value(type + num), handlers);
- insertFilters(registeredFilters().value(type + num), filters);
- }
- }
- }
-
- // exact type
- insertHandlers(registeredHandlers().value(type), handlers);
- insertFilters(registeredFilters().value(type), filters);
-
- // check if we have a generic handler for the event group
- if((type & EventGroupMask) != type) {
- insertHandlers(registeredHandlers().value(type & EventGroupMask), handlers);
- insertFilters(registeredFilters().value(type & EventGroupMask), filters);
- }
-
- // now dispatch the event
- QList<Handler>::const_iterator it = handlers.begin();
- while(it != handlers.end() && !event->isStopped()) {
- QObject *obj = it->object;
-
- if(ignored.contains(obj)) // we only deliver an event once to any given object
- continue;
-
- if(filters.contains(obj)) { // we have a filter, so let's check if we want to deliver the event
- Handler filter = filters.value(obj);
- bool result = false;
- void *param[] = {Q_RETURN_ARG(bool, result).data(), Q_ARG(Event *, event).data() };
- obj->qt_metacall(QMetaObject::InvokeMetaMethod, filter.methodIndex, param);
- ignored.insert(obj); // don't try to deliver the event again either way
- if(!result)
- continue; // mmmh, event filter told us to not accept
+void EventManager::dispatchEvent(Event *event)
+{
+ //qDebug() << "Dispatching" << event;
+
+ // we try handlers from specialized to generic by masking the enum
+
+ // build a list sorted by priorities that contains all eligible handlers
+ QList<Handler> handlers;
+ QHash<QObject *, Handler> filters;
+ QSet<QObject *> ignored;
+ uint type = event->type();
+
+ bool checkDupes = false;
+
+ // special handling for numeric IrcEvents
+ if ((type & ~IrcEventNumericMask) == IrcEventNumeric) {
+ ::IrcEventNumeric *numEvent = static_cast< ::IrcEventNumeric *>(event);
+ if (!numEvent)
+ qWarning() << "Invalid event type for IrcEventNumeric!";
+ else {
+ int num = numEvent->number();
+ if (num > 0) {
+ insertHandlers(registeredHandlers().value(type + num), handlers, false);
+ insertFilters(registeredFilters().value(type + num), filters);
+ checkDupes = true;
+ }
+ }