added ostd::BasicConsole::getConsoleCursorPosition() function

This commit is contained in:
OmniaX-Dev 2026-03-22 18:39:55 +01:00
parent 77c2cff1ca
commit 7659dd6846
3 changed files with 70 additions and 4 deletions

View file

@ -1 +1 @@
2027 2028

View file

@ -7,7 +7,7 @@ namespace ostd
#include <windows.h> #include <windows.h>
void Utils::clearConsole(void) void BasicConsole::clearConsole(void)
{ {
CONSOLE_SCREEN_BUFFER_INFO csbi; CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hStdOut; HANDLE hStdOut;
@ -31,7 +31,7 @@ void Utils::clearConsole(void)
SetConsoleCursorPosition( hStdOut, homeCoords ); 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; CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &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; 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 coord;
coord.X = x; coord.Y = y; coord.X = x; coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 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__) #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
#include <unistd.h> #include <unistd.h>
@ -77,6 +84,35 @@ void BasicConsole::setConsoleCursorPosition(int32_t x, int32_t y)
printf("\033[%d;%dH",x+1,y+1); 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__) #elif defined(__APPLE__)
#include <unistd.h> #include <unistd.h>
@ -105,6 +141,35 @@ void BasicConsole::setConsoleCursorPosition(int32_t x, int32_t y)
std::fflush(stdout); 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 #endif

View file

@ -39,6 +39,7 @@ namespace ostd
static void clearConsole(void); static void clearConsole(void);
static void getConsoleSize(int32_t& outColumns, int32_t& outRows); static void getConsoleSize(int32_t& outColumns, int32_t& outRows);
static void setConsoleCursorPosition(int32_t x, int32_t y); static void setConsoleCursorPosition(int32_t x, int32_t y);
static IPoint getConsoleCursorPosition(void);
static int32_t getConsoleWidth(void); static int32_t getConsoleWidth(void);
static int32_t getConsoleHeight(void); static int32_t getConsoleHeight(void);
}; };