diff options
| -rw-r--r-- | include/line/mode.h | 2 | ||||
| -rw-r--r-- | module-test/line_test.cc | 3 | ||||
| -rw-r--r-- | src/line/mode.cc | 51 |
3 files changed, 48 insertions, 8 deletions
diff --git a/include/line/mode.h b/include/line/mode.h index fcbad8c..c0c8ace 100644 --- a/include/line/mode.h +++ b/include/line/mode.h @@ -15,6 +15,8 @@ struct T_position }; inline termios attr; +inline int cursor_row; +inline int cursor_col; void disable_raw(); void enable_raw(); diff --git a/module-test/line_test.cc b/module-test/line_test.cc index d71d088..207e2e8 100644 --- a/module-test/line_test.cc +++ b/module-test/line_test.cc @@ -22,6 +22,9 @@ using namespace ov4; int main() { enable_raw(); + T_position pos = get_cursor_position(); + cursor_row = pos.row; + cursor_col = pos.col; string s = readline(); disable_raw(); cout << s << endl; diff --git a/src/line/mode.cc b/src/line/mode.cc index 9eb54b1..3ddd067 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -77,24 +77,58 @@ string readline() } else if (iscntrl(c)) { - print("control: {}\r\n", static_cast<unsigned char>(c)); - fflush(stdout); + //print("control: {}\r\n", static_cast<unsigned char>(c)); + //fflush(stdout); if (c == 13) // \n { //print("line: {}\r\n", buffer); return buffer; } + + // ESC sequence + if (c == '\x1b') + { + char seq[10]; + // eat [ + if (read(STDIN_FILENO, seq + 0, 1) != 1) + continue; + + if (read(STDIN_FILENO, seq + 1, 1) != 1) + continue; + + switch (seq[1]) + { + case 'A': + print("\x1b[A"); + fflush(stdout); + cursor_row--; + break; + case 'B': + print("\x1b[B"); + fflush(stdout); + cursor_row++; + break; + case 'C': + print("\x1b[C"); + fflush(stdout); + cursor_col--; + break; + case 'D': + print("\x1b[D"); + fflush(stdout); + cursor_col++; + break; + default: + return "ERROR"; + } + } } + + // normal char else { buffer += c; print_override(buffer); - - // esc sequence - if (buffer.size() <= 2 && buffer[0] == '\x1b' && buffer[1] == '[') - { - ; - } } } return buffer; @@ -138,6 +172,7 @@ void print_override(const std::string &s) fflush(stdout); print("{}", s); fflush(stdout); + cursor_col = s.size()+1; } } |
