From d52bd1c709456164b167cc7389b641b690c97ee5 Mon Sep 17 00:00:00 2001 From: 0scar Date: Mon, 5 Feb 2024 18:57:05 +0100 Subject: Organize the header files --- src/ctrl/include/engine/ctrl/input.h | 92 ++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/ctrl/include/engine/ctrl/input.h (limited to 'src/ctrl/include') diff --git a/src/ctrl/include/engine/ctrl/input.h b/src/ctrl/include/engine/ctrl/input.h new file mode 100644 index 0000000..49b3a96 --- /dev/null +++ b/src/ctrl/include/engine/ctrl/input.h @@ -0,0 +1,92 @@ +#ifndef INPUT_H +#define INPUT_H + +#include + +typedef void input_callback_t(void*); +typedef i32 scancode_t; + +typedef enum InputType { + InputType_error = 0, + InputType_action, + InputType_state, + InputType_range, /* TBD */ +} InputType; + +typedef union action_t { + InputType type; + + struct { + InputType type; + input_callback_t* callback; + char* callback_str; + } action; + + struct { + InputType type; + input_callback_t* activate; + input_callback_t* deactivate; + char* activate_str; + char* deactivate_str; + } state; +} action_t; + +typedef struct binding_t { + action_t action; + + // Change type depending on input handling back-end. like u16 for GLFW_KEY + scancode_t scancode; + scancode_t scancode_alt; + + u64 since_last_activation; +} binding_t; + +typedef struct i_ctx { + binding_t* bindings; + isize len; +} i_ctx; + +void i_ctx_t_free(i_ctx* c); +/* Executes all callbacks that has been pushed onto the callstack and resets the + * callstack */ +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); + +void i_ctx_push(i_ctx* ctx); +void i_ctx_pop(void); +void i_ctx_reset(void); + +/* Finds and updates the scancode of a binding with the given action in ctx */ +void i_bind_ctx(i_ctx* c, scancode_t s, action_t* a); +void i_bind_ctx_alt(i_ctx* c, scancode_t s, action_t* a); + +/* Update the scancode of a binding */ +void i_bind(binding_t* b, scancode_t s); +void i_bind_alt(binding_t* b, scancode_t s); + +#define BindAction(key, altkey, f_action) \ + (binding_t) { \ + .action = (action_t){.action = \ + { \ + .type = InputType_action, \ + .callback = (input_callback_t*)&f_action, \ + .callback_str = strdup(#f_action), \ + }}, \ + .scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \ + } + +#define BindState(key, altkey, f_activate, f_deactivate) \ + (binding_t) { \ + .action = \ + (action_t){.state = \ + { \ + .type = InputType_state, \ + .activate = (input_callback_t*)&f_activate, \ + .deactivate = (input_callback_t*)&f_deactivate, \ + .activate_str = strdup(#f_activate), \ + .deactivate_str = strdup(#f_deactivate), \ + }}, \ + .scancode = key, .scancode_alt = altkey, .since_last_activation = 0 \ + } + +#endif -- cgit v1.3