summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine.c6
-rw-r--r--src/state.c33
2 files changed, 37 insertions, 2 deletions
diff --git a/src/engine.c b/src/engine.c
index 72dcd27..ecc6ec1 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -759,11 +759,13 @@ void engine_input_ctx_push(i_ctx *ctx) {
void engine_input_ctx_pop(void) {
if (GLOBAL_PLATFORM->bindings == NULL || GLOBAL_PLATFORM->bindings_sz == 0) return;
- GLOBAL_PLATFORM->bindings_len--;
+ i_ctx_t_free(GLOBAL_PLATFORM->bindings[--GLOBAL_PLATFORM->bindings_len]);
}
void engine_input_ctx_reset(void) {
- GLOBAL_PLATFORM->bindings_len = 0;
+ while (GLOBAL_PLATFORM->bindings_len > 0) {
+ i_ctx_t_free(GLOBAL_PLATFORM->bindings[--GLOBAL_PLATFORM->bindings_len]);
+ }
}
u32 get_time(void) {return SDL_GetTicks();}
diff --git a/src/state.c b/src/state.c
index ceb21e6..47752bc 100644
--- a/src/state.c
+++ b/src/state.c
@@ -49,6 +49,8 @@ extern state_##name##_update_t name##_update;
#include <states/all_states.h>
+void binding_t_free(binding_t* b);
+
void State_init(StateType type, memory *mem) {
switch (type) {
#define State(name) \
@@ -283,3 +285,34 @@ bool State_reload(StateType type, i_ctx **ctx, usize ctx_len) {
//ctx = &ctx_cpy;
}
#endif
+
+void i_ctx_t_free(i_ctx* c) {
+ for (isize i = 0; i < c->len; i++) {
+ binding_t_free(&c->bindings[i]);
+ }
+}
+
+void binding_t_free(binding_t* b) {
+ switch (b->action.type) {
+ case InputType_error:
+ ERROR("Cannot free binding of type InputType_error");
+ break;
+ case InputType_action:
+ free(b->action.action.callback_str);
+ return;
+
+ case InputType_state:
+ free(b->action.state.activate_str);
+ free(b->action.state.deactivate_str);
+ break;
+
+ case InputType_range:
+ ERROR("Cannot free binding of type InputType_rage");
+ break;
+
+ default:
+ ERROR("Unknown bindings type");
+ break;
+ }
+ exit(EXIT_FAILURE);
+}