AuroraRuntime/Source/Console/ConsoleTTY/ConsoleTTY.NT.cpp

304 lines
7.5 KiB
C++
Raw Normal View History

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"
2022-05-03 04:31:49 +00:00
#include "ConsoleTTY.NT.hpp"
#include "../ColorConvert.hpp"
2022-05-03 04:31:49 +00:00
#include <Source/Console/ConsoleStd/ConsoleStd.hpp>
namespace Aurora::Console
{
static HANDLE gConsole {INVALID_HANDLE_VALUE};
2022-05-03 04:31:49 +00:00
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;
}
2022-05-03 04:31:49 +00:00
AUKN_SYM void TTYClearLine(EAnsiColor bgColor)
{
HANDLE hConsole;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
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;
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;
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()
{
SetConsoleCursorPosition(GetTTYHandle(), {0, 0});
2022-05-03 04:31:49 +00:00
}
AUKN_SYM AuPair<AuUInt32, AuUInt32> TTYScreenSize()
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi))
2022-05-03 04:31:49 +00:00
{
return {};
}
return AuMakePair(AuStaticCast<AuUInt32>(csbi.srWindow.Right - csbi.srWindow.Left + 1),
AuStaticCast<AuUInt32>(csbi.srWindow.Bottom - csbi.srWindow.Top + 1));
2022-05-03 04:31:49 +00:00
}
AUKN_SYM void TTYStorePos()
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (!GetConsoleScreenBufferInfo(GetTTYHandle(), &csbi))
2022-05-03 04:31:49 +00:00
{
return;
}
gSavedCoord = csbi.dwCursorPosition;
}
AUKN_SYM void TTYRestorePos()
{
SetConsoleCursorPosition(GetTTYHandle(), gSavedCoord);
2022-05-03 04:31:49 +00:00
}
AUKN_SYM void TTYMoveY(AuInt16 lines)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hConsole;
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;
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;
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;
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)
{
SetConsoleCursorPosition(GetTTYHandle(), COORD {AuStaticCast<short>(position.first), AuStaticCast<short>(position.second)});
2022-05-03 04:31:49 +00:00
}
}