From c2336a8a22a5ddf26b33a53f914bf0d5397a6553 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 22 Sep 2026 02:52:22 +0000 Subject: add cursor moving limit pos --- src/line/cursor.cc | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/line/mode.cc | 68 ++------------------------------------- 2 files changed, 96 insertions(+), 65 deletions(-) create mode 100644 src/line/cursor.cc (limited to 'src/line') 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 +#include +#include +#include +#include +#include +#include + +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 #include +#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; -} } -- cgit v1.3.1-4-g156e