diff options
Diffstat (limited to 'ttwhy/scanners/terminal_policies.cppm')
| -rw-r--r-- | ttwhy/scanners/terminal_policies.cppm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/ttwhy/scanners/terminal_policies.cppm b/ttwhy/scanners/terminal_policies.cppm new file mode 100644 index 0000000..87e54b3 --- /dev/null +++ b/ttwhy/scanners/terminal_policies.cppm @@ -0,0 +1,72 @@ +module; + +#include <string> + +export module ttwhy.scanners:terminal_policies; + +import :events; +import :concepts; + +namespace ttwhy::scanners +{ + + export struct ansi_policy + { + constexpr auto static resolve_vt220_keypad(std::string & buffer, ttwhy::ansi_sink auto & sink) -> void + { + auto key = [](auto terminator) { + switch (terminator) + { + case '1': + case '7': + return navigation_key::home; + case '2': + return navigation_key::insert_key; + case '3': + return navigation_key::delete_key; + case '4': + case '8': + return navigation_key::end; + case '5': + return navigation_key::page_up; + case '6': + return navigation_key::page_down; + default: + return static_cast<navigation_key>(-1); + } + }(buffer.back()); + sink(navigation_event{key}); + buffer.clear(); + } + + constexpr auto static resolve_vt100_cursor(char terminator, ttwhy::ansi_sink auto & sink) -> void + { + auto key = [terminator] { + switch (terminator) + { + case 'A': + return navigation_key::up; + case 'B': + return navigation_key::down; + case 'C': + return navigation_key::right; + case 'D': + return navigation_key::left; + case 'H': + return navigation_key::home; + case 'F': + return navigation_key::end; + default: + return static_cast<navigation_key>(-1); + } + }(); + sink(navigation_event{key}); + } + + constexpr auto static resolve_ss3(char terminator, ttwhy::ansi_sink auto & sink) -> void + { + return resolve_vt100_cursor(terminator, sink); + } + }; + +} // namespace ttwhy::scanners |
