kiba-engine
event.c
Go to the documentation of this file.
1 
6 #include <kiba/core/event.h>
7 
8 #include <kiba/core/log.h>
9 #include <kiba/core/memory.h>
10 
12 typedef struct registered_listener {
14  void *listener;
18 
20 #define MAX_EVENT_LISTENER 512
21 
22 // TODO: Replace with container.
24 typedef struct registered_listener_list {
30 
32 typedef struct event_system_state {
36 
39 
40 b8 event_initialize(void) {
42  return true;
43 }
44 
45 void event_shutdown(void) {}
46 
47 b8 event_register(u16 event_code, void *listener, on_event_function on_event, b8 append) {
49  if (list->last_listener >= MAX_EVENT_LISTENER) {
50  return false;
51  }
52  registered_listener *element;
53  if (append) {
54  element = &list->content[list->last_listener++];
55  } else {
56  element = list->content;
57  registered_listener_list new_list;
58  memory_copy(new_list.content, list->content, MAX_EVENT_LISTENER - 1);
59  memory_copy(list->content + 1, new_list.content, MAX_EVENT_LISTENER - 1);
60  ++list->last_listener;
61  }
62  element->listener = listener;
63  element->on_event = on_event;
64  return true;
65 }
66 
67 b8 event_unregister(u16 event_code, void *listener, on_event_function on_event) {
69  for (u32 i = 0; i < list->last_listener; ++i) {
70  if (list->content[i].listener == listener && list->content[i].on_event == on_event) {
71  if (i + 1 >= list->last_listener) {
72  memory_copy(list->content + i, list->content + i + 1, list->last_listener - i);
73  }
74  memory_zero(&list->content[--list->last_listener], sizeof(registered_listener));
75  return true;
76  }
77  }
78  return false;
79 }
80 
81 b8 event_fire(u16 event_code, void *sender, event_context context) {
83  for (u32 i = 0; i < list->last_listener; ++i) {
84  if ((*list->content[i].on_event)(event_code, sender, list->content[i].listener, context)) {
85  return true;
86  }
87  }
88  return false;
89 }
void * memory_copy(void *dst, const void *src, usize size)
Copy memory.
Definition: memory.c:83
void * memory_zero(void *mem, usize size)
Zero out memory.
Definition: memory.c:79
Lightweight layer between platform and other engine components to enable tracing/monitoring.
struct event_system_state event_system_state
b8 event_unregister(u16 event_code, void *listener, on_event_function on_event)
Unregister a callback for a particular event type.
Definition: event.c:67
event_system_state event_state
Definition: event.c:38
struct registered_listener registered_listener
b8 event_fire(u16 event_code, void *sender, event_context context)
Fire an event.
Definition: event.c:81
struct registered_listener_list registered_listener_list
b8 event_register(u16 event_code, void *listener, on_event_function on_event, b8 append)
Register a callback for a particular event type.
Definition: event.c:47
b8 event_initialize(void)
Initialize the event system.
Definition: event.c:40
#define MAX_EVENT_LISTENER
Maximum number of listeners per event code.
Definition: event.c:20
void event_shutdown(void)
Shutdown event system.
Definition: event.c:45
Event system.
b8(* on_event_function)(u16 event_code, void *sender, void *listener, event_context context)
Function signature for event callbacks.
Definition: event.h:73
@ APPLICATION_EVENT_CODE_MAX
End of external code range.
Definition: event.h:61
Logging system.
Context used to store data of an event.
Definition: event.h:15
registered_listener_list listener_map[APPLICATION_EVENT_CODE_MAX]
List of registered listeners and their callbacks for every event code.
Definition: event.c:34
registered_listener content[MAX_EVENT_LISTENER]
Consecutive priority list of event listeners and their callback.
Definition: event.c:26
u32 last_listener
Index after the final element in content.
Definition: event.c:28
void * listener
Custom listener data.
Definition: event.c:14
on_event_function on_event
Event callback function.
Definition: event.c:16