Dawn/src/engine/event.c

81 lines
1.8 KiB
C

/**
* Copyright (c) 2022 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "event.h"
void eventManagerInit(eventmanager_t *manager) {
uint8_t i;
ASSERT_NOT_NULL(manager);
for(i = 0; i < EVENT_LISTENER_COUNT_MAX; i++) {
manager->listeners[i].callback = NULL;
}
}
bool _eventManagerFindFree(int32_t i, void *item) {
return ((eventlistener_t *) item)->callback == NULL;
}
eventlistener_t * eventManagerSubscribe(
eventmanager_t *man, event_t event, void *user, eventcallback_t *callback
) {
int32_t first;
eventlistener_t *listener;
ASSERT_NOT_NULL(man);
ASSERT_NOT_NULL(callback);
// Find the first available space.
first = arrayFindCallback(
sizeof(eventmanager_t), man->listeners,
EVENT_LISTENER_COUNT_MAX, _eventManagerFindFree
);
ASSERT_LESS_THAN(first, EVENT_LISTENER_COUNT_MAX);
ASSERT_GREATER_THAN_EQUAL_TO(first, 0);
// Insert
listener = man->listeners + first;
listener->callback = callback;
listener->user = user;
listener->event = event;
return listener;
}
void eventManagerUnsubscribe(eventmanager_t *man, eventlistener_t *listener) {
ASSERT_NOT_NULL(man);
ASSERT_NOT_NULL(listener);
listener->callback = NULL;
}
bool eventManagerTrigger(
eventmanager_t *manager, event_t event, void *args[], int32_t argc
) {
uint8_t i;
eventlistener_t *listener;
bool result;
ASSERT_GREATER_THAN_EQUAL_TO(argc, 0);
ASSERT_IF(
argc > 0,
ASSERT_NOT_NULL(args)
);
for(i = 0; i < EVENT_LISTENER_COUNT_MAX; i++) {
listener = manager->listeners + i;
if(listener->callback == NULL) continue;
if(listener->event != event) continue;
result = listener->callback(listener->user, event, args, argc);
if(!result) return false;
}
return true;
}