#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 //enum SDL_Scancode keycode; 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