diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-06-20 11:54:06 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-06-20 11:54:06 +0200 |
| commit | 912e7b10facdd3b2565423206ae25b1d6e4f7dd9 (patch) | |
| tree | e744bc76893e8b1faa216b1aae93c7ec6e933a04 /ttwhy/scanners/terminal_events.cppm | |
| parent | 280190248bfbadaec4575932dc956401f7bb6390 (diff) | |
| download | ttwhy-912e7b10facdd3b2565423206ae25b1d6e4f7dd9.tar.xz ttwhy-912e7b10facdd3b2565423206ae25b1d6e4f7dd9.zip | |
lib: add xterm policy
Diffstat (limited to 'ttwhy/scanners/terminal_events.cppm')
| -rw-r--r-- | ttwhy/scanners/terminal_events.cppm | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/ttwhy/scanners/terminal_events.cppm b/ttwhy/scanners/terminal_events.cppm new file mode 100644 index 0000000..3e4c849 --- /dev/null +++ b/ttwhy/scanners/terminal_events.cppm @@ -0,0 +1,100 @@ +module; + +#include <cstdint> +#include <utility> +#include <variant> + +export module ttwhy.scanners:terminal_events; + +export namespace ttwhy::scanners +{ + enum struct control_key : std::uint8_t + { + enter, + escape, + tab, + backspace, + }; + + enum struct navigation_key : std::uint8_t + { + up, + down, + left, + right, + home, + end, + delete_key, + insert_key, + page_up, + page_down, + }; + + enum struct modifier : std::uint8_t + { + none = 0, + shift = 1, + alt = 2, + ctrl = 4, + meta = 8, + }; + + enum struct modifier_set : std::uint8_t + { + }; + + constexpr auto operator|(modifier lhs, modifier rhs) -> modifier_set + { + return static_cast<modifier_set>(std::to_underlying(lhs) | std::to_underlying(rhs)); + } + + constexpr auto operator|(modifier_set lhs, modifier rhs) -> modifier_set + { + return static_cast<modifier_set>(std::to_underlying(lhs) | std::to_underlying(rhs)); + } + + constexpr auto operator&(modifier lhs, modifier rhs) -> modifier_set + { + return static_cast<modifier_set>(std::to_underlying(lhs) & std::to_underlying(rhs)); + } + + constexpr auto operator&(modifier_set lhs, modifier rhs) -> modifier_set + { + return static_cast<modifier_set>(std::to_underlying(lhs) & std::to_underlying(rhs)); + } + + template<std::same_as<modifier>... Modifier> + constexpr auto has_all(modifier_set mask, Modifier... flag) -> bool + { + return (true && ... && (mask & flag)); + } + + template<std::same_as<modifier>... Modifier> + constexpr auto has_any(modifier_set mask, Modifier... flag) -> bool + { + return (false || ... || (mask & flag)); + } + + struct character_event + { + char value{}; + }; + + struct control_event + { + control_key key{}; + }; + + struct navigation_event + { + navigation_key key{}; + modifier_set modifiers{}; + }; + + struct ctrl_chord_event + { + char key{}; + }; + + using input_event = std::variant<character_event, control_event, navigation_event, ctrl_chord_event>; +} // namespace ttwhy::scanners |
