summaryrefslogtreecommitdiffstats
path: root/src/input.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.cpp')
-rw-r--r--src/input.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/input.cpp b/src/input.cpp
new file mode 100644
index 0000000..5cbedb2
--- /dev/null
+++ b/src/input.cpp
@@ -0,0 +1,37 @@
+#include "input.hpp"
+namespace input {
+
+int getcode() {
+ int r = 0;
+ char c;
+ if(read(STDIN_FILENO, &c, 1) != 1) return -1;
+ if(c == '\x1b') {
+ char seq[3];
+ if(read(STDIN_FILENO, &seq[0], 1) != 1) return '\x1b';
+ if(read(STDIN_FILENO, &seq[1], 1) != 1) return '\x1b';
+ if(seq[0] == '[') {
+ if(seq[1] >= 0 && seq[1] <= '9') {
+ if(read(STDIN_FILENO, &seq[2], 1) != 1) return '\x1b';
+ if(seq[2] == '~') {
+ switch(seq[1]) {
+ case '1':
+ case '7': return CTRL_KEY_HOME;
+ case '4':
+ case '8': return CTRL_KEY_END;
+ default: return CTRL_RANGE_START + seq[1] + 20;
+ }
+ }
+ }else{
+ switch(seq[1]) {
+ default: return CTRL_RANGE_START + seq[1];
+ }
+ }
+ }else if(seq[0] == 'O') {
+ return CTRL_RANGE_START + seq[1];
+ }
+ return '\x1b';
+ }else{
+ return c;
+ }
+}
+}