diff options
-rw-r--r-- | include/rune/ui/input.h | 6 | ||||
-rw-r--r-- | ui/input.c | 24 |
2 files changed, 19 insertions, 11 deletions
diff --git a/include/rune/ui/input.h b/include/rune/ui/input.h index 3d8ca9a..f18cd19 100644 --- a/include/rune/ui/input.h +++ b/include/rune/ui/input.h @@ -23,17 +23,17 @@ #define RUNE_UI_INPUT_H #include <rune/util/types.h> -#include <rune/ui/app_window.h> +#include <rune/ui/window.h> #define KB_MODE_RAW 0 #define KB_MODE_TEXT 1 -RAPI int rune_input_init(struct rune_window *window); +RAPI int rune_input_init(window_t *window); RAPI void set_keyboard_mode(int mode); RAPI int get_keyboard_mode(void); -RAPI void register_key_hook(uint8_t scancode, void (*func)(void)); +RAPI void register_input_callback(uint8_t scancode, void (*func)(void*), void *data); RAPI void rune_input_tick(void); #endif @@ -3,21 +3,27 @@ #include <rune/core/callbacks.h> #include <rune/core/logging.h> #include <rune/core/alloc.h> +#include <string.h> + +typedef struct callback { + void *data; + void (*callback_ptr)(void*); +} callback_t; static int keyboard_mode; -static void (*key_hooks[256])(void); +static callback_t callbacks[256]; void _key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) { - scancode -= 8; - if (action == GLFW_PRESS && key_hooks[scancode] != NULL) - (*key_hooks[scancode])(); + if ((action == GLFW_PRESS) && (callbacks[scancode].callback_ptr != NULL)) + (*callbacks[scancode].callback_ptr)(callbacks[scancode].data); } -int rune_input_init(struct rune_window *window) { +int rune_input_init(window_t *window) { keyboard_mode = KB_MODE_RAW; glfwSetKeyCallback(window->window, _key_callback); for (int i = 0; i < 256; i++) - key_hooks[i] = NULL; + memset(&callbacks[i], 0, sizeof(callback_t)); + log_output(LOG_DEBUG, "Initialized keyboard input"); } void set_keyboard_mode(int mode) { @@ -32,8 +38,10 @@ int get_keyboard_mode(void) { return keyboard_mode; } -void register_key_hook(uint8_t scancode, void (*func)(void)) { - key_hooks[scancode] = func; +void register_input_callback(uint8_t scancode, void (*func)(void*), void *data) { + callbacks[scancode].data = data; + callbacks[scancode].callback_ptr = func; + log_output(LOG_DEBUG, "Registered scancode %d with callback function address %x", scancode, func); } void rune_input_tick(void) { |