#include "event/Queue.hpp" #include "event/EvtContext.hpp" #include "event/EvtHandler.hpp" #include void IEvtQueueDispatch(EvtContext* context, EVENTID id, const void* data) { STORM_ASSERT(context); // TODO // UpdateSyncState(data, &id, context, v3); // TODO // if (SErrIsDisplayingError()) { // return; // } auto handlerList = &context->m_queueHandlerList[id]; EvtHandler marker; marker.marker = 1; handlerList->LinkNode(&marker, 1, nullptr); EvtHandler* handler; while (1) { handler = marker.link.Next(); if (!handler) { break; } handlerList->LinkNode(&marker, 1, marker.link.Next()); if (!handler->marker && !handler->func(data, handler->param)) { break; } } handlerList->UnlinkNode(&marker); } void IEvtQueueDispatchAll(EvtContext* context) { // TODO } void IEvtQueueRegister(EvtContext* context, EVENTID id, int32_t (*handler)(const void*, void*), void* param, float priority) { STORM_ASSERT(context); auto handlerList = &context->m_queueHandlerList[id]; EvtHandler* evtHandler; void* m = SMemAlloc(sizeof(EvtHandler), __FILE__, __LINE__, 0x8); if (m) { evtHandler = new (m) EvtHandler(); } else { evtHandler = nullptr; } evtHandler->priority = priority; evtHandler->param = param; evtHandler->func = handler; evtHandler->marker = 0; EvtHandler* h = handlerList->Head(); while (h && (priority < h->priority || h->marker)) { h = handlerList->Link(h)->Next(); } handlerList->LinkNode(evtHandler, 1, h); }