#ifndef INPUT_H #define INPUT_H // NOTE: KEY_STATE_RELEASED does not imply KEY_STATE_UNPRESSED, which can be funky. Maybe give this another look? typedef enum { KEY_STATE_UNPRESSED = 0, KEY_STATE_RELEASED = 1, KEY_STATE_PRESSED = 1 << 1, KEY_STATE_HELD = 1 << 2 } key_state_t; typedef enum { KEYBOARD_STATE_UNPLUGGED = 0, KEYBOARD_STATE_UNFOCUSED = 1, KEYBOARD_STATE_FOCUSED = 1 << 1, KEYBOARD_STATE_IME = 1 << 2 } keyboard_state_t; typedef enum { MOUSE_STATE_UNPLUGGED = 0, MOUSE_STATE_UNFOCUSED = 1, MOUSE_STATE_FOCUSED = 1 << 1 } mouse_state_t; typedef enum { MOUSE_KEY_LEFT = 0, MOUSE_KEY_RIGHT = 1, MOUSE_KEY_MIDDLE = 2, MOUSE_KEY_SIDE = 3, MOUSE_KEY_EXTRA = 4, MOUSE_KEY_FORWARD = 5, MOUSE_KEY_BACK = 6, MOUSE_KEY_TASK = 7, MOUSE_KEY_EXTRA_0 = 8, MOUSE_KEY_EXTRA_1 = 9, MOUSE_KEY_EXTRA_2 = 10, MOUSE_KEY_EXTRA_3 = 11, MOUSE_KEY_EXTRA_4 = 12, MOUSE_KEY_EXTRA_5 = 13, MOUSE_KEY_EXTRA_6 = 14, MOUSE_KEY_EXTRA_7 = 15, MOUSE_KEY_EXTRA_8 = 16, MOUSE_KEY_EXTRA_9 = 17, MOUSE_KEY_TOTAL = 18 } mouse_keysym_t; #define IME_STR_MAX 200 // TODO: check if this limit is sensible #define KEYBOARD_KEY_TOTAL 256 typedef struct { uint8_t keyboard_state; // mostly used to check if we are using the IME uint8_t keys[KEYBOARD_KEY_TOTAL]; // the state of the full keyboard uint8_t mouse_state; int32_t mouse_x; int32_t mouse_y; uint8_t mouse_keys[MOUSE_KEY_TOTAL]; uint32_t modifiers; // TODO: Decide on a format for keyboard mod keys uint8_t ime_str[IME_STR_MAX]; // the final string coming from the IME for text input fields as utf8 } input_t; int32_t is_key_down(input_t *i, uint8_t key) { return i->keys[key] & KEY_STATE_PRESSED; } int32_t is_key_pressed(input_t *i, uint8_t key) { return i->keys[key] & KEY_STATE_PRESSED && !(i->keys[key] & KEY_STATE_HELD); } int32_t is_key_held(input_t *i, uint8_t key) { return i->keys[key] & KEY_STATE_HELD; } int32_t is_key_released(input_t *i, uint8_t key) { return i->keys[key] & KEY_STATE_RELEASED; } #endif