summary refs log tree commit diff
path: root/src/Event.c
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Event.c
initial commit
Diffstat (limited to 'src/Event.c')
-rw-r--r--src/Event.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/src/Event.c b/src/Event.c
new file mode 100644
index 0000000..1c0d976
--- /dev/null
+++ b/src/Event.c
@@ -0,0 +1,201 @@
+#include "Event.h"
+#include "Logger.h"
+
+int EventAPIVersion = 3;
+struct _EntityEventsList        EntityEvents;
+struct _TabListEventsList       TabListEvents;
+struct _TextureEventsList       TextureEvents;
+struct _GfxEventsList           GfxEvents;
+struct _UserEventsList          UserEvents;
+struct _BlockEventsList         BlockEvents;
+struct _WorldEventsList         WorldEvents;
+struct _ChatEventsList          ChatEvents;
+struct _WindowEventsList        WindowEvents;
+struct _InputEventsList         InputEvents;
+struct _PointerEventsList       PointerEvents;
+struct _ControllerEventsList    ControllerEvents;
+struct _NetEventsList           NetEvents;
+
+void Event_Register(struct Event_Void* handlers, void* obj, Event_Void_Callback handler) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		/* Attempting to register the same handler twice is usually caused by a bug */
+		if (handlers->Handlers[i] == handler && handlers->Objs[i] == obj) {
+			Logger_Abort("Attempt to register event handler that was already registered");
+		}
+	}
+
+	if (handlers->Count == EVENT_MAX_CALLBACKS) {
+		Logger_Abort("Unable to register another event handler");
+	} else {
+		handlers->Handlers[handlers->Count] = handler;
+		handlers->Objs[handlers->Count]     = obj;
+		handlers->Count++;
+	}
+}
+
+void Event_Unregister(struct Event_Void* handlers, void* obj, Event_Void_Callback handler) {
+	int i, j;
+	for (i = 0; i < handlers->Count; i++) {
+		if (handlers->Handlers[i] != handler || handlers->Objs[i] != obj) continue;
+
+		/* Remove this handler from the list, by shifting all following handlers left */
+		for (j = i; j < handlers->Count - 1; j++) {
+			handlers->Handlers[j] = handlers->Handlers[j + 1];
+			handlers->Objs[j]     = handlers->Objs[j + 1];
+		}
+		
+		handlers->Count--;
+		handlers->Handlers[handlers->Count] = NULL;
+		handlers->Objs[handlers->Count]     = NULL;
+		return;
+	}
+}
+
+void Event_UnregisterAll(void) {
+	/* NOTE: This MUST be kept in sync with Event.h list of events */
+	EntityEvents.Added.Count   = 0;
+	EntityEvents.Removed.Count = 0;
+
+	TabListEvents.Added.Count   = 0;
+	TabListEvents.Changed.Count = 0;
+	TabListEvents.Removed.Count = 0;
+
+	TextureEvents.AtlasChanged.Count = 0;
+	TextureEvents.PackChanged.Count  = 0;
+	TextureEvents.FileChanged.Count  = 0;
+
+	GfxEvents.ViewDistanceChanged.Count = 0;
+	GfxEvents.LowVRAMDetected.Count     = 0;
+	GfxEvents.ProjectionChanged.Count   = 0;
+	GfxEvents.ContextLost.Count         = 0;
+	GfxEvents.ContextRecreated.Count    = 0;
+
+	UserEvents.BlockChanged.Count     = 0;
+	UserEvents.HackPermsChanged.Count = 0;
+	UserEvents.HeldBlockChanged.Count = 0;
+
+	BlockEvents.PermissionsChanged.Count = 0;
+	BlockEvents.BlockDefChanged.Count    = 0;
+
+	WorldEvents.NewMap.Count    = 0;
+	WorldEvents.Loading.Count   = 0;
+	WorldEvents.MapLoaded.Count = 0;
+	WorldEvents.EnvVarChanged.Count = 0;
+	WorldEvents.LightingModeChanged.Count = 0;
+
+	ChatEvents.FontChanged.Count    = 0;
+	ChatEvents.ChatReceived.Count   = 0;
+	ChatEvents.ChatSending.Count    = 0;
+	ChatEvents.ColCodeChanged.Count = 0;
+
+	WindowEvents.RedrawNeeded.Count = 0;
+	WindowEvents.Resized.Count = 0;
+	WindowEvents.Closing.Count = 0;
+	WindowEvents.FocusChanged.Count = 0;
+	WindowEvents.StateChanged.Count = 0;
+	WindowEvents.Created.Count      = 0;
+	WindowEvents.InactiveChanged.Count = 0;
+	WindowEvents.Redrawing.Count    = 0;
+
+	InputEvents.Press.Count = 0;
+	InputEvents.Down.Count  = 0;
+	InputEvents.Up.Count    = 0;
+	InputEvents.Wheel.Count = 0;
+	InputEvents.TextChanged.Count = 0;
+
+	PointerEvents.Moved.Count = 0;
+	PointerEvents.Down.Count  = 0;
+	PointerEvents.Up.Count    = 0;
+	PointerEvents.RawMoved.Count = 0;
+	
+	ControllerEvents.AxisUpdate.Count = 0;
+
+	NetEvents.Connected.Count    = 0;
+	NetEvents.Disconnected.Count = 0;
+	NetEvents.PluginMessageReceived.Count = 0;
+}
+
+void Event_RaiseVoid(struct Event_Void* handlers) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i]);
+	}
+}
+
+void Event_RaiseInt(struct Event_Int* handlers, int arg) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], arg);
+	}
+}
+
+void Event_RaiseFloat(struct Event_Float* handlers, float arg) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], arg);
+	}
+}
+
+void Event_RaiseEntry(struct Event_Entry* handlers, struct Stream* stream, const cc_string* name) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], stream, name);
+	}
+}
+
+void Event_RaiseBlock(struct Event_Block* handlers, IVec3 coords, BlockID oldBlock, BlockID block) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], coords, oldBlock, block);
+	}
+}
+
+void Event_RaiseChat(struct Event_Chat* handlers, const cc_string* msg, int msgType) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], msg, msgType);
+	}
+}
+
+void Event_RaiseInput(struct Event_Input* handlers, int key, cc_bool repeating) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], key, repeating);
+	}
+}
+
+void Event_RaiseString(struct Event_String* handlers, const cc_string* str) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], str);
+	}
+}
+
+void Event_RaiseRawMove(struct Event_RawMove* handlers, float xDelta, float yDelta) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], xDelta, yDelta);
+	}
+}
+
+void Event_RaisePadAxis(struct Event_PadAxis* handlers, int port, int axis, float x, float y) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], port, axis, x, y);
+	}
+}
+
+void Event_RaisePluginMessage(struct Event_PluginMessage* handlers, cc_uint8 channel, cc_uint8* data) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], channel, data);
+	}
+}
+
+void Event_RaiseLightingMode(struct Event_LightingMode* handlers, cc_uint8 oldMode, cc_bool fromServer) {
+	int i;
+	for (i = 0; i < handlers->Count; i++) {
+		handlers->Handlers[i](handlers->Objs[i], oldMode, fromServer);
+	}
+}
\ No newline at end of file