diff options
| -rw-r--r-- | include/engine/input.h | 19 | ||||
| -rw-r--r-- | src/engine.c | 6 | ||||
| -rw-r--r-- | src/state.c | 33 |
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); +} |
