summaryrefslogtreecommitdiff
path: root/include/term/term_input.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/term/term_input.h')
-rw-r--r--include/term/term_input.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/include/term/term_input.h b/include/term/term_input.h
new file mode 100644
index 0000000..4b0a8d9
--- /dev/null
+++ b/include/term/term_input.h
@@ -0,0 +1,196 @@
+#ifndef TERM_INPUT_TYPES_H
+#define TERM_INPUT_TYPES_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include "term_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum term_key {
+ TERM_KEY_NONE = 0,
+
+ TERM_KEY_RETURN,
+ TERM_KEY_BACKSPACE,
+ TERM_KEY_TAB,
+ TERM_KEY_ESCAPE,
+
+ TERM_KEY_UP,
+ TERM_KEY_DOWN,
+ TERM_KEY_RIGHT,
+ TERM_KEY_LEFT,
+ TERM_KEY_HOME,
+ TERM_KEY_END,
+ TERM_KEY_PAGE_UP,
+ TERM_KEY_PAGE_DOWN,
+ TERM_KEY_INSERT,
+ TERM_KEY_DELETE,
+
+ TERM_KEY_F1, TERM_KEY_F2, TERM_KEY_F3, TERM_KEY_F4, TERM_KEY_F5,
+ TERM_KEY_F6, TERM_KEY_F7, TERM_KEY_F8, TERM_KEY_F9, TERM_KEY_F10,
+ TERM_KEY_F11, TERM_KEY_F12, TERM_KEY_F13, TERM_KEY_F14, TERM_KEY_F15,
+ TERM_KEY_F16, TERM_KEY_F17, TERM_KEY_F18, TERM_KEY_F19, TERM_KEY_F20,
+ TERM_KEY_F21, TERM_KEY_F22, TERM_KEY_F23, TERM_KEY_F24, TERM_KEY_F25,
+ TERM_KEY_F26, TERM_KEY_F27, TERM_KEY_F28, TERM_KEY_F29, TERM_KEY_F30,
+ TERM_KEY_F31, TERM_KEY_F32, TERM_KEY_F33, TERM_KEY_F34, TERM_KEY_F35,
+
+ TERM_KEY_KP_0, TERM_KEY_KP_1, TERM_KEY_KP_2, TERM_KEY_KP_3, TERM_KEY_KP_4,
+ TERM_KEY_KP_5, TERM_KEY_KP_6, TERM_KEY_KP_7, TERM_KEY_KP_8, TERM_KEY_KP_9,
+ TERM_KEY_KP_DECIMAL,
+ TERM_KEY_KP_ENTER,
+ TERM_KEY_KP_ADD,
+ TERM_KEY_KP_SUBTRACT,
+ TERM_KEY_KP_MULTIPLY,
+ TERM_KEY_KP_DIVIDE,
+ TERM_KEY_KP_EQUAL,
+ TERM_KEY_KP_SEPARATOR,
+ TERM_KEY_KP_LEFT,
+ TERM_KEY_KP_RIGHT,
+ TERM_KEY_KP_UP,
+ TERM_KEY_KP_DOWN,
+ TERM_KEY_KP_PAGE_UP,
+ TERM_KEY_KP_PAGE_DOWN,
+ TERM_KEY_KP_HOME,
+ TERM_KEY_KP_END,
+ TERM_KEY_KP_INSERT,
+ TERM_KEY_KP_DELETE,
+ TERM_KEY_KP_BEGIN,
+
+ TERM_KEY_CAPS_LOCK,
+ TERM_KEY_SCROLL_LOCK,
+ TERM_KEY_NUM_LOCK,
+ TERM_KEY_PRINT_SCREEN,
+ TERM_KEY_PAUSE,
+ TERM_KEY_MENU,
+
+ TERM_KEY_MEDIA_PLAY,
+ TERM_KEY_MEDIA_PAUSE,
+ TERM_KEY_MEDIA_STOP,
+ TERM_KEY_MEDIA_FORWARD,
+ TERM_KEY_MEDIA_REWIND,
+ TERM_KEY_MEDIA_NEXT,
+ TERM_KEY_MEDIA_PREV,
+ TERM_KEY_MEDIA_RECORD,
+ TERM_KEY_VOLUME_DOWN,
+ TERM_KEY_VOLUME_UP,
+ TERM_KEY_MUTE,
+
+ TERM_KEY_LSHIFT,
+ TERM_KEY_LCTRL,
+ TERM_KEY_LALT,
+ TERM_KEY_LSUPER,
+ TERM_KEY_LHYPER,
+ TERM_KEY_LMETA,
+ TERM_KEY_RSHIFT,
+ TERM_KEY_RCTRL,
+ TERM_KEY_RALT,
+ TERM_KEY_RSUPER,
+ TERM_KEY_RHYPER,
+ TERM_KEY_RMETA,
+ TERM_KEY_ISO_LEVEL3_SHIFT,
+ TERM_KEY_ISO_LEVEL5_SHIFT,
+
+ TERM_KEY_COUNT
+};
+
+enum term_mod {
+ TERM_MOD_SHIFT = 1,
+ TERM_MOD_ALT = 2,
+ TERM_MOD_CTRL = 4,
+ TERM_MOD_SUPER = 8,
+ TERM_MOD_HYPER = 16,
+ TERM_MOD_META = 32,
+ TERM_MOD_CAPS = 64,
+ TERM_MOD_NUM = 128,
+};
+
+enum term_key_action {
+ TERM_KEY_PRESS = 1,
+ TERM_KEY_REPEAT = 2,
+ TERM_KEY_RELEASE = 3,
+};
+
+enum term_mouse_button {
+ TERM_MOUSE_BUTTON_PRIMARY = 0,
+ TERM_MOUSE_BUTTON_MIDDLE,
+ TERM_MOUSE_BUTTON_SECONDARY,
+ TERM_MOUSE_BUTTON_NONE,
+ TERM_MOUSE_BUTTON_EXTRA_1,
+ TERM_MOUSE_BUTTON_EXTRA_2,
+ TERM_MOUSE_BUTTON_EXTRA_3,
+ TERM_MOUSE_BUTTON_EXTRA_4,
+ TERM_MOUSE_BUTTON_EXTRA_5,
+ TERM_MOUSE_WHEEL_UP = 16,
+ TERM_MOUSE_WHEEL_DOWN,
+ TERM_MOUSE_WHEEL_LEFT,
+ TERM_MOUSE_WHEEL_RIGHT,
+};
+
+enum term_mouse_event_kind {
+ TERM_MOUSE_PRESS = 0,
+ TERM_MOUSE_RELEASE,
+ TERM_MOUSE_MOTION,
+ TERM_MOUSE_SCROLL,
+ TERM_MOUSE_LEAVE,
+};
+
+struct term_key_event {
+ enum term_key_action action;
+ uint16_t key; /* enum term_key; TERM_KEY_NONE for a text key */
+ uint16_t keypad; /* the TERM_KEY_KP_* key when the key is on the keypad */
+ unsigned mods; /* enum term_mod */
+ uint32_t codepoint; /* the code point of the key without modifiers */
+ uint32_t shifted; /* the code point of the key with Shift */
+ uint32_t base; /* the code point of the key in the US layout */
+ uint32_t text; /* the code point the key types, or 0 */
+ bool text_deferred; /* an input method sends the text later */
+};
+
+struct term_mouse_event {
+ struct term_vector2i pos; /* Grid cell coordinates (col, row) */
+ struct term_vector2i pixel; /* Absolute pixel position in terminal grid */
+ int button;
+ unsigned mods;
+ int scroll_lines;
+ float scroll_delta;
+ enum term_mouse_event_kind kind;
+};
+
+/* The keys that are down. An all-zero value has no keys down. */
+struct term_keyboard_state {
+ uint64_t down[(TERM_KEY_COUNT + 63) / 64];
+};
+
+/* Record a press, repeat, or release in s. */
+TERM_API void term_keyboard_update(struct term_keyboard_state *s, const struct term_key_event *ev);
+TERM_API bool term_keyboard_key_down(const struct term_keyboard_state *s, enum term_key key);
+
+/* Kitty keyboard protocol flags, as in term_modes.keyboard. */
+enum term_keyboard_flag {
+ TERM_KEYBOARD_DISAMBIGUATE = 1,
+ TERM_KEYBOARD_EVENT_TYPES = 2,
+ TERM_KEYBOARD_ALTERNATE_KEYS = 4,
+ TERM_KEYBOARD_ALL_KEYS = 8,
+ TERM_KEYBOARD_ASSOCIATED_TEXT = 16,
+};
+
+enum term_input_status {
+ TERM_INPUT_UNHANDLED = 0, /* the terminal does not use the event */
+ TERM_INPUT_CONSUMED, /* the terminal uses the event but sends nothing */
+ TERM_INPUT_BYTES, /* send the len bytes in buf to the program */
+ TERM_INPUT_BUFFER_FULL, /* buf is too small; len is 0 */
+};
+
+struct term_input_result {
+ size_t len;
+ enum term_input_status status;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TERM_INPUT_TYPES_H */