summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/engine/input.h19
-rw-r--r--src/engine.c6
-rw-r--r--src/state.c33
3 files changed, 47 insertions, 11 deletions
diff --git a/include/engine/input.h b/include/engine/input.h
index 918312e..12b1bba 100644
--- a/include/engine/input.h
+++ b/include/engine/input.h
@@ -19,15 +19,15 @@ typedef union action_t {
struct {
InputType type;
input_callback_t* callback;
- const char* callback_str;
+ char* callback_str;
} action;
struct {
InputType type;
input_callback_t* activate;
input_callback_t* deactivate;
- const char* activate_str;
- const char* deactivate_str;
+ char* activate_str;
+ char* deactivate_str;
} state;
} action_t;
@@ -47,6 +47,7 @@ typedef struct i_ctx {
isize len;
} i_ctx;
+void i_ctx_t_free(i_ctx* c);
void i_flush_bindings(usize numcalls, void* state_mem, input_callback_t* c[]);
action_t i_get_action(const i_ctx *restrict ctx, u32 time, scancode_t scancode);
@@ -55,7 +56,7 @@ action_t i_get_action(const i_ctx *restrict ctx, u32 time, scancode_t scancode);
.action = (action_t){.action = {\
.type = InputType_action,\
.callback = (input_callback_t*)&f_action,\
- .callback_str = #f_action,\
+ .callback_str = strdup( #f_action ),\
}},\
.scancode = key,\
.scancode_alt = altkey,\
@@ -68,8 +69,8 @@ action_t i_get_action(const i_ctx *restrict ctx, u32 time, scancode_t scancode);
.type = InputType_state,\
.activate = (input_callback_t*)&f_activate,\
.deactivate = (input_callback_t*)&f_deactivate,\
- .activate_str = #f_activate,\
- .deactivate_str = #f_deactivate,\
+ .activate_str = strdup( #f_activate ),\
+ .deactivate_str = strdup( #f_deactivate ),\
}},\
.scancode = key,\
.scancode_alt = altkey,\
@@ -82,7 +83,7 @@ action_t i_get_action(const i_ctx *restrict ctx, u32 time, scancode_t scancode);
.action = (action_t){.action = {\
.type = InputType_action,\
.callback = NULL,\
- .callback_str = action_str,\
+ .callback_str = strdup( action_str ),\
}},\
.scancode = key,\
.scancode_alt = altkey,\
@@ -95,8 +96,8 @@ action_t i_get_action(const i_ctx *restrict ctx, u32 time, scancode_t scancode);
.type = InputType_state,\
.activate = NULL,\
.deactivate = NULL,\
- .activate_str = _activate_str,\
- .deactivate_str = _deactivate_str,\
+ .activate_str = strdup( _activate_str ),\
+ .deactivate_str = strdup( _deactivate_str ),\
}},\
.scancode = key,\
.scancode_alt = altkey,\
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);
+}