+void EventManager::postEvent(Event* event)
+{
+ if (sender() && sender()->thread() != this->thread()) {
+ auto* queuedEvent = new QueuedQuasselEvent(event);
+ QCoreApplication::postEvent(this, queuedEvent);
+ }
+ else {
+ if (_eventQueue.isEmpty())
+ // we're currently not processing events
+ processEvent(event);
+ else
+ _eventQueue.append(event);
+ }
+}
+
+void EventManager::customEvent(QEvent* event)
+{
+ if (event->type() == QEvent::User) {
+ auto* queuedEvent = static_cast<QueuedQuasselEvent*>(event);
+ processEvent(queuedEvent->event);
+ event->accept();
+ }
+}
+
+void EventManager::processEvent(Event* event)
+{
+ Q_ASSERT(_eventQueue.isEmpty());
+ dispatchEvent(event);
+ // dispatching the event might cause new events to be generated. we process those afterwards.
+ while (!_eventQueue.isEmpty()) {
+ dispatchEvent(_eventQueue.first());
+ _eventQueue.removeFirst();
+ }
+}
+
+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;