aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/scanners/terminal_policies.cppm
diff options
context:
space:
mode:
Diffstat (limited to 'ttwhy/scanners/terminal_policies.cppm')
-rw-r--r--ttwhy/scanners/terminal_policies.cppm72
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