/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: ConsoleTTY.NT.cpp Date: 2022-5-2 Author: Reece ***/ #include #include "../Console.hpp" #include "ConsoleTTY.NT.hpp" #include "../ColorConvert.hpp" #include namespace Aurora::Console { static HANDLE gConsole {INVALID_HANDLE_VALUE}; static COORD gSavedCoord {}; HANDLE GetTTYHandle() { if (gConsole != INVALID_HANDLE_VALUE) { return gConsole; } return gConsole = GetStdHandle(STD_OUTPUT_HANDLE); } AUKN_SYM void SuperSecretTTYReplacer(HANDLE console) { gConsole = console; } AUKN_SYM void TTYClearLine(EAnsiColor bgColor) { HANDLE hConsole; DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } if (!FillConsoleOutputCharacterW(hConsole, L' ', csbi.dwSize.X, COORD {0, csbi.dwCursorPosition.Y}, &cCharsWritten)) { return; } if (!FillConsoleOutputAttribute(hConsole, bgColor == EAnsiColor::eEnumCount ? csbi.wAttributes : kAnsiColorBackgroundToNT[AuStaticCast(bgColor)], csbi.dwSize.X, COORD {0, csbi.dwCursorPosition.Y}, &cCharsWritten)) { return; } SetConsoleCursorPosition(hConsole, {0, csbi.dwCursorPosition.Y}); } AUKN_SYM void TTYClearScreen() { HANDLE hConsole; DWORD cCharsWritten; CONSOLE_SCREEN_BUFFER_INFO csbi; DWORD dwConSize; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } dwConSize = csbi.dwSize.X * csbi.dwSize.Y; if (!FillConsoleOutputCharacterW(hConsole, L' ', dwConSize, COORD {0, 0}, &cCharsWritten)) { return; } if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } if (!FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, COORD {0, 0}, &cCharsWritten)) { return; } SetConsoleCursorPosition(hConsole, {0, 0}); } AUKN_SYM void TTYFill(char character, EAnsiColor fgColor, EAnsiColor bgColor) { DWORD attrib {0}, cCharsWritten {}; CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hConsole; hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } if (fgColor != EAnsiColor::eEnumCount) { attrib |= kAnsiColorForegroundToNT[AuStaticCast(fgColor)]; } else if (bgColor != EAnsiColor::eEnumCount) { attrib = FOREGROUND_WHITE; } if (bgColor != EAnsiColor::eEnumCount) { attrib |= kAnsiColorBackgroundToNT[AuStaticCast(bgColor)]; } if (!FillConsoleOutputCharacterW(hConsole, L' ', csbi.dwSize.X * csbi.dwSize.Y, COORD {0, 0}, &cCharsWritten)) { return; } if (attrib) { if (!FillConsoleOutputAttribute(hConsole, attrib, csbi.dwSize.X * csbi.dwSize.Y, COORD {0, 0}, &cCharsWritten)) { //return; } } } AUKN_SYM AuUInt32 TTYWrite(const void *buffer, AuUInt32 length) { return ConsoleStd::WriteStdOutBlocking2(buffer, length); } AUKN_SYM void TTYWrite(const char *string, EAnsiColor fgColor, EAnsiColor bgColor) { DWORD attrib {}; HANDLE hConsole; hConsole = GetTTYHandle(); if (fgColor != EAnsiColor::eEnumCount) { attrib |= kAnsiColorForegroundToNT[AuStaticCast(fgColor)]; } else { attrib = FOREGROUND_WHITE; } if (bgColor != EAnsiColor::eEnumCount) { attrib |= kAnsiColorBackgroundToNT[AuStaticCast(bgColor)]; } else { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } attrib |= csbi.wAttributes & (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY); } SetConsoleTextAttribute(hConsole, attrib); TTYWrite(string, strlen(string)); SetConsoleTextAttribute(hConsole, FOREGROUND_WHITE); } AUKN_SYM void TTYReturnHome() { SetConsoleCursorPosition(GetTTYHandle(), {0, 0}); } AUKN_SYM AuPair TTYScreenSize() { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi)) { return {}; } return AuMakePair(AuStaticCast(csbi.srWindow.Right - csbi.srWindow.Left + 1), AuStaticCast(csbi.srWindow.Bottom - csbi.srWindow.Top + 1)); } AUKN_SYM void TTYStorePos() { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi)) { return; } gSavedCoord = csbi.dwCursorPosition; } AUKN_SYM void TTYRestorePos() { SetConsoleCursorPosition(GetTTYHandle(), gSavedCoord); } AUKN_SYM void TTYMoveY(AuInt16 lines) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hConsole; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } csbi.dwCursorPosition.Y += lines; SetConsoleCursorPosition(hConsole, gSavedCoord); } AUKN_SYM void TTYMoveX(AuInt16 lines) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hConsole; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } csbi.dwCursorPosition.X += lines; SetConsoleCursorPosition(hConsole, gSavedCoord); } AUKN_SYM void TTYSetY(AuUInt16 Y) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hConsole; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } csbi.dwCursorPosition.Y = Y; SetConsoleCursorPosition(hConsole, gSavedCoord); } AUKN_SYM void TTYSetX(AuUInt16 X) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hConsole; hConsole = GetTTYHandle(); if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } csbi.dwCursorPosition.X = X; SetConsoleCursorPosition(hConsole, gSavedCoord); } AUKN_SYM void TTYSetPos(AuPair position) { SetConsoleCursorPosition(GetTTYHandle(), COORD {AuStaticCast(position.first), AuStaticCast(position.second)}); } }