mirror of
https://github.com/whoahq/whoa.git
synced 2026-02-01 00:02:45 +03:00
feat(event): implement EventUnregisterEx
This commit is contained in:
parent
a1fafb46ec
commit
1fd4891efe
@ -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<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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user