From 7659dd6846310df9d61c403b6d838077d916ebb3 Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Sun, 22 Mar 2026 18:39:55 +0100 Subject: [PATCH] added ostd::BasicConsole::getConsoleCursorPosition() function --- other/build.nr | 2 +- src/ostd/io/Console.cpp | 71 +++++++++++++++++++++++++++++++++++++++-- src/ostd/io/Console.hpp | 1 + 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/other/build.nr b/other/build.nr index b91e780..2fc31b3 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -2027 +2028 diff --git a/src/ostd/io/Console.cpp b/src/ostd/io/Console.cpp index d1bc07f..a649ff0 100644 --- a/src/ostd/io/Console.cpp +++ b/src/ostd/io/Console.cpp @@ -7,7 +7,7 @@ namespace ostd #include -void Utils::clearConsole(void) +void BasicConsole::clearConsole(void) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hStdOut; @@ -31,7 +31,7 @@ void Utils::clearConsole(void) SetConsoleCursorPosition( hStdOut, homeCoords ); } -void Utils::getConsoleSize(int32_t& outColumns, int32_t& outRows) +void BasicConsole::getConsoleSize(int32_t& outColumns, int32_t& outRows) { CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); @@ -39,13 +39,20 @@ void Utils::getConsoleSize(int32_t& outColumns, int32_t& outRows) outRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; } -void Utils::setConsoleCursorPosition(int32_t x, int32_t y) +void BasicConsole::setConsoleCursorPosition(int32_t x, int32_t y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); } +IPoint BasicConsole::getConsoleCursorPosition(void) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); + return { csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y }; +} + #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__) #include @@ -77,6 +84,35 @@ void BasicConsole::setConsoleCursorPosition(int32_t x, int32_t y) printf("\033[%d;%dH",x+1,y+1); } +IPoint BasicConsole::getConsoleCursorPosition(void) +{ + // Save terminal settings + termios oldt, newt; + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + + // Disable canonical mode and echo + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + + // Request cursor position + std::printf("\033[6n"); + std::fflush(stdout); + + // Read response: ESC [ row ; col R + int row = 0, col = 0; + if (std::scanf("\033[%d;%dR", &row, &col) != 2) { + // Failed to parse + row = col = -1; + } + + // Restore terminal settings + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + + // Convert to 0-based like Windows + return { col - 1, row - 1 }; +} + #elif defined(__APPLE__) #include @@ -105,6 +141,35 @@ void BasicConsole::setConsoleCursorPosition(int32_t x, int32_t y) std::fflush(stdout); } +IPoint BasicConsole::getConsoleCursorPosition(void) +{ + // Save terminal settings + termios oldt, newt; + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + + // Disable canonical mode and echo + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + + // Request cursor position + std::printf("\033[6n"); + std::fflush(stdout); + + // Read response: ESC [ row ; col R + int row = 0, col = 0; + if (std::scanf("\033[%d;%dR", &row, &col) != 2) { + // Failed to parse + row = col = -1; + } + + // Restore terminal settings + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + + // Convert to 0-based like Windows + return { col - 1, row - 1 }; +} + #endif diff --git a/src/ostd/io/Console.hpp b/src/ostd/io/Console.hpp index a28dd4f..847f851 100644 --- a/src/ostd/io/Console.hpp +++ b/src/ostd/io/Console.hpp @@ -39,6 +39,7 @@ namespace ostd static void clearConsole(void); static void getConsoleSize(int32_t& outColumns, int32_t& outRows); static void setConsoleCursorPosition(int32_t x, int32_t y); + static IPoint getConsoleCursorPosition(void); static int32_t getConsoleWidth(void); static int32_t getConsoleHeight(void); };