mirror of
https://github.com/whoahq/whoa.git
synced 2026-02-02 00:32: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) {
|
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;
|
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);
|
int32_t IEvtQueueCheckSyncKeyState(EvtContext* context, KEY key);
|
||||||
|
|
||||||
|
void IEvtQueueUnregister(EvtContext* context, EVENTID id, EVENTHANDLERFUNC handler, void* param, uint32_t flags);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user