feat(event): implement EventUnregisterEx

This commit is contained in:
fallenoak 2025-10-07 00:10:21 -05:00
parent a1fafb46ec
commit 1fd4891efe
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
3 changed files with 49 additions and 1 deletions

View File

@ -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) { void EventUnregisterEx(EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags) {
// TODO HEVENTCONTEXT hContext = PropGet(PROP_EVENTCONTEXT);
uint32_t contextId = *reinterpret_cast<uint32_t*>(hContext);
int32_t findMask;
EvtContext* context = TSingletonInstanceId<EvtContext, offsetof(EvtContext, m_id)>::s_idTable.Ptr(
contextId,
0,
&findMask
);
if (context) {
IEvtQueueUnregister(context, id, handler, param, flags);
if (findMask != -1) {
TSingletonInstanceId<EvtContext, offsetof(EvtContext, m_id)>::s_idTable.Unlock(
findMask & (INSTANCE_TABLE_SLOT_COUNT - 1),
findMask >= INSTANCE_TABLE_SLOT_COUNT
);
}
}
} }

View File

@ -159,3 +159,29 @@ int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key) {
return keystate; 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);
}
}
}
}
}

View File

@ -13,4 +13,6 @@ void IEvtQueueRegister(EvtContext* context, EVENTID id, int32_t (*handler)(const
int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key); int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key);
void IEvtQueueUnregister(EvtContext* context, EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags);
#endif #endif