// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #pragma once #include "../libs.h" #include "../assert/assert.h" #include "../util/array.h" #define EVENT_LISTENER_COUNT_MAX 128 typedef uint8_t event_t; typedef bool eventcallback_t( void *user, event_t event, void *args[], int32_t argc ); typedef struct { void *user; event_t event; eventcallback_t *callback; } eventlistener_t; typedef struct { eventlistener_t listeners[EVENT_LISTENER_COUNT_MAX]; } eventmanager_t; /** * Initialize the event manager. * * @param manager Event manager to initialize. */ void eventManagerInit(eventmanager_t *manager); /** * Subscribe to an event on a given event manager. * * @param man Event manager to subscribe to. * @param event Event to subscribe to. * @param user Any custom user data to provide to the event callback. * @param callback Callback to fire when the event is triggered. * @return The event listener that was subscribed to. */ eventlistener_t * eventManagerSubscribe( eventmanager_t *man, event_t event, void *user, eventcallback_t *callback ); /** * Unsubscribe an event listener that was previously subscribed. * * @param listener Listener to unsubscribe. */ void eventManagerUnsubscribe(eventmanager_t *man, eventlistener_t *listener); /** * Trigger a specific event on the event manager. * * @param manager Manager to trigger the event on. * @param event Event to trigger * @param args Array of pointers for event arguments. * @param argc Count of event arguments. * @return True if no events are subscribed, otherwise only returns true if all * event listeners also return true. */ bool eventManagerTrigger( eventmanager_t *manager, event_t event, void *args[], int32_t argc );