2022-05-03 04:31:49 +00:00
|
|
|
/***
|
|
|
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
|
|
|
|
File: ConsoleTTY.NT.cpp
|
|
|
|
Date: 2022-5-2
|
|
|
|
Author: Reece
|
|
|
|
***/
|
|
|
|
#include <Source/RuntimeInternal.hpp>
|
|
|
|
#include "Console.hpp"
|
|
|
|
#include "ConsoleTTY.NT.hpp"
|
|
|
|
#include "ColorConvert.hpp"
|
|
|
|
#include <Source/Console/ConsoleStd/ConsoleStd.hpp>
|
|
|
|
|
|
|
|
namespace Aurora::Console
|
|
|
|
{
|
2022-05-04 15:34:02 +00:00
|
|
|
static HANDLE gConsole {INVALID_HANDLE_VALUE};
|
2022-05-03 04:31:49 +00:00
|
|
|
static COORD gSavedCoord {};
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
static HANDLE GetTTYHandle()
|
|
|
|
{
|
|
|
|
if (gConsole != INVALID_HANDLE_VALUE)
|
|
|
|
{
|
|
|
|
return gConsole;
|
|
|
|
}
|
|
|
|
|
|
|
|
return gConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void SuperSecretTTYReplacer(HANDLE console)
|
|
|
|
{
|
|
|
|
gConsole = console;
|
|
|
|
}
|
|
|
|
|
2022-05-03 04:31:49 +00:00
|
|
|
AUKN_SYM void TTYClearLine(EAnsiColor bgColor)
|
|
|
|
{
|
|
|
|
HANDLE hConsole;
|
|
|
|
DWORD cCharsWritten;
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
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<AuUInt>(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;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
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<AuUInt>(fgColor)];
|
|
|
|
}
|
|
|
|
else if (bgColor != EAnsiColor::eEnumCount)
|
|
|
|
{
|
|
|
|
attrib = FOREGROUND_WHITE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bgColor != EAnsiColor::eEnumCount)
|
|
|
|
{
|
|
|
|
attrib |= kAnsiColorBackgroundToNT[AuStaticCast<AuUInt>(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;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
if (fgColor != EAnsiColor::eEnumCount)
|
|
|
|
{
|
|
|
|
attrib |= kAnsiColorForegroundToNT[AuStaticCast<AuUInt>(fgColor)];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
attrib = FOREGROUND_WHITE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bgColor != EAnsiColor::eEnumCount)
|
|
|
|
{
|
|
|
|
attrib |= kAnsiColorBackgroundToNT[AuStaticCast<AuUInt>(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()
|
|
|
|
{
|
2022-05-04 15:34:02 +00:00
|
|
|
SetConsoleCursorPosition(GetTTYHandle(), {0, 0});
|
2022-05-03 04:31:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM AuPair<AuUInt32, AuUInt32> TTYScreenSize()
|
|
|
|
{
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi))
|
2022-05-03 04:31:49 +00:00
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
return AuMakePair(AuStaticCast<AuUInt32>(csbi.dwSize.X), AuStaticCast<AuUInt32>(csbi.dwSize.Y));
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void TTYStorePos()
|
|
|
|
{
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi))
|
2022-05-03 04:31:49 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
gSavedCoord = csbi.dwCursorPosition;
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void TTYRestorePos()
|
|
|
|
{
|
2022-05-04 15:34:02 +00:00
|
|
|
SetConsoleCursorPosition(GetTTYHandle(), gSavedCoord);
|
2022-05-03 04:31:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void TTYMoveY(AuInt16 lines)
|
|
|
|
{
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
|
|
|
HANDLE hConsole;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2022-05-04 15:34:02 +00:00
|
|
|
hConsole = GetTTYHandle();
|
2022-05-03 04:31:49 +00:00
|
|
|
|
|
|
|
if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
csbi.dwCursorPosition.X = X;
|
|
|
|
SetConsoleCursorPosition(hConsole, gSavedCoord);
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void TTYSetPos(AuPair<AuUInt32, AuUInt32> position)
|
|
|
|
{
|
2022-05-04 15:34:02 +00:00
|
|
|
SetConsoleCursorPosition(GetTTYHandle(), COORD {AuStaticCast<short>(position.first), AuStaticCast<short>(position.second)});
|
2022-05-03 04:31:49 +00:00
|
|
|
}
|
|
|
|
}
|