diff --git a/src/event/Event.cpp b/src/event/Event.cpp index 54947d9..f3363fd 100644 --- a/src/event/Event.cpp +++ b/src/event/Event.cpp @@ -167,5 +167,25 @@ void EventRegisterEx(EVENTID id, EVENTHANDLERFUNC handler, void* param, float pr } void EventUnregisterEx(EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags) { - // TODO + HEVENTCONTEXT hContext = PropGet(PROP_EVENTCONTEXT); + + uint32_t contextId = *reinterpret_cast(hContext); + int32_t findMask; + + EvtContext* context = TSingletonInstanceId::s_idTable.Ptr( + contextId, + 0, + &findMask + ); + + if (context) { + IEvtQueueUnregister(context, id, handler, param, flags); + + if (findMask != -1) { + TSingletonInstanceId::s_idTable.Unlock( + findMask & (INSTANCE_TABLE_SLOT_COUNT - 1), + findMask >= INSTANCE_TABLE_SLOT_COUNT + ); + } + } } diff --git a/src/event/Queue.cpp b/src/event/Queue.cpp index 7e61f10..327beb5 100644 --- a/src/event/Queue.cpp +++ b/src/event/Queue.cpp @@ -159,3 +159,29 @@ int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key) { return keystate; } + +void IEvtQueueUnregister(EvtContext* context, EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags) { + STORM_VALIDATE_BEGIN; + STORM_VALIDATE(context); + STORM_VALIDATE_END_VOID; + + auto idMatch = flags & 0x1; + auto handlerMatch = flags & 0x2; + auto paramMatch = flags & 0x4; + + for (uint32_t q = 0; q < EVENTIDS; q++) { + auto listMatched = (!idMatch || q == id); + + if (listMatched) { + auto handlerList = &context->m_queueHandlerList[q]; + + for (auto node = handlerList->Head(); node; node = handlerList->Next(node)) { + auto nodeMatched = (!handlerMatch || node->func == handler) && (!paramMatch || node->param == param); + + if (nodeMatched && !node->marker) { + node = handlerList->DeleteNode(node); + } + } + } + } +} diff --git a/src/event/Queue.hpp b/src/event/Queue.hpp index 642e9f7..e1cbb71 100644 --- a/src/event/Queue.hpp +++ b/src/event/Queue.hpp @@ -13,4 +13,6 @@ void IEvtQueueRegister(EvtContext* context, EVENTID id, int32_t (*handler)(const int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key); +void IEvtQueueUnregister(EvtContext* context, EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags); + #endif