diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/line/cursor.cc | 93 | ||||
| -rw-r--r-- | src/line/mode.cc | 68 |
2 files changed, 96 insertions, 65 deletions
diff --git a/src/line/cursor.cc b/src/line/cursor.cc new file mode 100644 index 0000000..ce01466 --- /dev/null +++ b/src/line/cursor.cc @@ -0,0 +1,93 @@ +#include "line/cursor.h" + +#include <print> +#include <iostream> +#include <string> +#include <unistd.h> +#include <cstdio> +#include <cstdlib> +#include <termios.h> + +using namespace std; + +namespace ov4 +{ + +T_position get_cursor_position() +{ + char c; + string buffer; + T_position pos; + int row, col; + tcflush(STDIN_FILENO, TCIFLUSH); + cout << "\x1b[6n" << flush; + while (read(STDIN_FILENO, &c, 1) == 1) + { + if (c == 'R') break; + buffer += c; + } + if (buffer.size() <= 2 || buffer[0] != '\x1b' || buffer[1] != '[') + { + pos.row = -1; + pos.col = -1; + return pos; + } + if ((sscanf(buffer.c_str(), "\x1b[%d;%d", &row, &col)) != 2) + { + pos.row = -1; + pos.col = -1; + return pos; + } + pos.row = row; + pos.col = col; + print("row {}, col {}\r\n", row, col); + fflush(stdout); + return pos; +} + +void print_override(const std::string &s) +{ + print("\r"); + fflush(stdout); + print("{}", s); + fflush(stdout); + cursor_col = s.size()+1; + line_end_pos = cursor_col; +} + +void move_cursor(char c) +{ + switch (c) + { + // case 'A': + // print("\x1b[A"); + // fflush(stdout); + // cursor_row--; + // break; + // case 'B': + // print("\x1b[B"); + // fflush(stdout); + // cursor_row++; + // break; + case 'C': + if (cursor_col < line_end_pos) + { + print("\x1b[C"); + fflush(stdout); + cursor_col++; + } + break; + case 'D': + if (cursor_col > 1) + { + print("\x1b[D"); + fflush(stdout); + cursor_col--; + } + break; + default: + return; + } +} + +} diff --git a/src/line/mode.cc b/src/line/mode.cc index 3ddd067..c4b9972 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -5,6 +5,8 @@ #include <iostream> #include <print> +#include "line/cursor.h" + using namespace std; namespace ov4 @@ -96,31 +98,7 @@ string readline() 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"; - } + move_cursor(seq[1]); } } @@ -134,45 +112,5 @@ string readline() return buffer; } -T_position get_cursor_position() -{ - char c; - string buffer; - T_position pos; - int row, col; - tcflush(STDIN_FILENO, TCIFLUSH); - cout << "\x1b[6n" << flush; - while (read(STDIN_FILENO, &c, 1) == 1) - { - if (c == 'R') break; - buffer += c; - } - if (buffer.size() <= 2 || buffer[0] != '\x1b' || buffer[1] != '[') - { - pos.row = -1; - pos.col = -1; - return pos; - } - if ((sscanf(buffer.c_str(), "\x1b[%d;%d", &row, &col)) != 2) - { - pos.row = -1; - pos.col = -1; - return pos; - } - pos.row = row; - pos.col = col; - print("row {}, col {}\r\n", row, col); - fflush(stdout); - return pos; -} - -void print_override(const std::string &s) -{ - print("\r"); - fflush(stdout); - print("{}", s); - fflush(stdout); - cursor_col = s.size()+1; -} } |
