AuroraRuntime/Source/Console/ConsoleTTY/ConsoleTTY.hpp

266 lines
7.8 KiB
C++
Raw Normal View History

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: ConsoleTTY.hpp
Date: 2022-5-11
Author: Reece
***/
#pragma once
namespace Aurora::Console::ConsoleTTY
{
inline bool gTTYConsoleEnabled {};
struct TTYConsole : ITTYConsole
{
Further Linux support [+] Begin work on IO futexes for io release on process/thread exit [+] Linux ::readdir iteration [+] AuConsole buffering API [*] Fix sleep as to not get interrupted by signals [*] Switch the type of FS lock used under Linux [*] Linux: Use new IPCHandle encoding scheme [*] Fix undefined behaviour: unintialized timeout values (AuLoop/Linux) [*] Fix undefined behaviour: ConsoleTTY clear line was called of a color of a random value on stack [-] Remainings of std dir iterator [*] Fix pthread_kill (aka send signal to pthread handle) always kills process. This is what you expect bc signal handler inheritance. [*] Reformat the build Aurora.json file [+] Added clang warning ignores to the build file [*] Fix: UNIX need to use STDOUT_FILENO. Was using CRT handle in place of fd by mistake. [+] Linux implementation for IO yield (AuIO::IOYield() - UNIX::LinuxOverlappedYield()) [*] Fix: Linux async end of stream processing. res 0 = zero bytes consumed. <= was detecting this as an error of code 0. Should succeed with zero bytes. [+] Linux LoopQueue missing epilogue hook for the IO processor [*] Various refactors and minor bug fixes [*] Linux fix: Handle pipe EOS as zero [*] Linux fix: thread termination via a user signal of 77. Need a force terminate. [*] IPC handle: fix improper int to bool cast in the header setup within ToString [*] Linux fix: HWInfo CPU topology regression [-] Linux fix: remove SIGABRT handler [*] Missing override in compression, exit, and consoletty headers. [+] Unix Syslog logger backend
2022-08-02 04:52:17 +00:00
void BufferMessage(const AuConsole::ConsoleMessage &msg) override;
void Pump();
void PumpHistory();
bool RedrawWindow();
void OnEnter();
void Init();
void Deinit();
bool Start() override;
void End() override;
private:
bool UTF8();
void SetHintStrings(const AuList<AuPair<AuString /*autocompletion*/, AuList<AuString/* secondary hint*/>>> &hints);
void RedrawBorders();
void RedrawLogBox();
void RedrawHintLine();
void RedrawInput(bool clear);
void RedrawBanner();
void BlankLogBox();
void SetInitialCursorPos();
bool CheckRedraw();
void PostRedraw(bool first);
bool RegenerateBuffer(bool resChanged, bool &redrawBox);
Further Linux support [+] Begin work on IO futexes for io release on process/thread exit [+] Linux ::readdir iteration [+] AuConsole buffering API [*] Fix sleep as to not get interrupted by signals [*] Switch the type of FS lock used under Linux [*] Linux: Use new IPCHandle encoding scheme [*] Fix undefined behaviour: unintialized timeout values (AuLoop/Linux) [*] Fix undefined behaviour: ConsoleTTY clear line was called of a color of a random value on stack [-] Remainings of std dir iterator [*] Fix pthread_kill (aka send signal to pthread handle) always kills process. This is what you expect bc signal handler inheritance. [*] Reformat the build Aurora.json file [+] Added clang warning ignores to the build file [*] Fix: UNIX need to use STDOUT_FILENO. Was using CRT handle in place of fd by mistake. [+] Linux implementation for IO yield (AuIO::IOYield() - UNIX::LinuxOverlappedYield()) [*] Fix: Linux async end of stream processing. res 0 = zero bytes consumed. <= was detecting this as an error of code 0. Should succeed with zero bytes. [+] Linux LoopQueue missing epilogue hook for the IO processor [*] Various refactors and minor bug fixes [*] Linux fix: Handle pipe EOS as zero [*] Linux fix: thread termination via a user signal of 77. Need a force terminate. [*] IPC handle: fix improper int to bool cast in the header setup within ToString [*] Linux fix: HWInfo CPU topology regression [-] Linux fix: remove SIGABRT handler [*] Missing override in compression, exit, and consoletty headers. [+] Unix Syslog logger backend
2022-08-02 04:52:17 +00:00
bool NoncanonicalMode() override;
void NoncanonicalTick();
void NoncanonicalSetCursor();
void NoncanonicalOnString(const AuString &input);
void NoncanonicalOnBackspace();
void NoncanonicalOnEnter();
void NoncanonicalOnLeft();
void NoncanonicalOnRight();
2022-05-24 05:58:06 +00:00
void NoncanonicalOnPageUp();
void NoncanonicalOnPageDown();
void Scroll(int delta);
void NoncanonicalOnMenuLeft();
void NoncanonicalOnMenuRight();
void NoncanonicalOnMenuUp();
void NoncanonicalOnMenuDown();
2022-05-19 03:21:34 +00:00
void NoncanonicalOnHistoryUp();
void NoncanonicalOnHistoryDown();
void HistorySetFile();
AuString HistoryGetFile();
void HistoryAppendChanges();
void HistoryLoad();
void HistoryUpdateCursor();
AuString historyFileName;
int noncanonicalCursorPos {};
int noncanonicalCursorPosInBytes {};
virtual int GetBannerLines();
virtual int GetLogBoxLines();
virtual int GetHintLines();
virtual int GetTextInputLines();
virtual bool GetLogBoxHintBorder();
virtual bool GetBottomBorder() override;
AuPair<AuUInt32, AuUInt32> GetLogBoxStart();
AuPair<AuUInt32, AuUInt32> GetHintLine();
AuPair<AuUInt32, AuUInt32> GetInputCursor();
AuPair<AuUInt32, AuUInt32> GetInitialInputLine();
virtual bool GetBannerFootBorder() override;
virtual ETTYAlign SetTitleAlignment(ETTYAlign newValue) override;
virtual ETTYAlign GetLogBoxTitleAlignment() override;
virtual ETTYAlign SetLogBoxTitleAlignment(ETTYAlign newValue) override;
virtual bool GetTopBorder() override;
virtual bool GetLeftBorder() override;
virtual bool GetRightBorder() override;
virtual ETTYAlign GetTitleAlignment() override;
virtual ETTYAlign GetHeaderAlignment() override;
virtual ETTYAlign GetSubheaderAlignment() override;
virtual AuString GetHeaderBorderTitle() override;
virtual AuString GetLogBoxBorderTitle() override;
virtual AuString GetHeader() override;
virtual AuString GetSubHeader() override;
virtual ETTYAlign SetHeaderAlignment(ETTYAlign newValue) override;
virtual ETTYAlign SetSubheaderAlignment(ETTYAlign newValue) override;
virtual AuString SetHeaderBorderTitle(const AuString &newValue) override;
virtual AuString SetLogBoxBorderTitle(const AuString &newValue) override;
virtual AuString SetHeader(const AuString &newValue) override;
virtual AuString SetSubHeader(const AuString &newValue) override;
virtual bool SetTopBorder(bool newValue) override;
virtual bool SetLeftBorder(bool newValue) override;
virtual bool SetRightBorder(bool newValue) override;
virtual AuUInt8 SetPaddingLeftOfLog(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingRightOfLog(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingLeftOfInput(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingTopOfInput(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingTopOfHint(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingTopOfHeader(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingMidOfHeader(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingBottomOfSubheader(AuUInt8 newValue) override;
virtual AuUInt8 GetPaddingLeftOfLog() override;
virtual AuUInt8 GetPaddingRightOfLog() override;
virtual AuUInt8 GetPaddingLeftOfInput() override;
virtual AuUInt8 GetPaddingTopOfInput() override;
virtual AuUInt8 GetPaddingTopOfHint() override;
virtual AuUInt8 GetPaddingTopOfHeader() override;
virtual AuUInt8 GetPaddingMidOfHeader() override;
virtual AuUInt8 GetPaddingBottomOfSubheader() override;
virtual AuUInt8 SetPaddingHeadOfLog(AuUInt8 newValue) override;
virtual AuUInt8 SetPaddingTopOfLog(AuUInt8 newValue) override;
virtual AuUInt8 GetPaddingHeadOfLog() override;
virtual AuUInt8 GetPaddingTopOfLog() override;
void WriteBuffered(AuPair<AuUInt32, AuUInt32> pos, const AuString &in);
void WriteLine(int Y, const AuString &in);
void BlankLine(int Y, bool borders = true);
void BlankBordersLine(int Y);
bool PermitDoubleBuffering();
private:
void DebugLogArea();
AuList<AuPair<AuString /*autocompletion*/, AuList<AuString/* secondary hint*/>>> hintStrings;
void Flush();
int currentWidth {};
int currentHeight {};
int oldWidth {};
int oldHeight {};
2022-05-19 03:21:34 +00:00
int iHistoryPos {-1};
int iHistoryWritePos {0};
2022-05-19 03:21:34 +00:00
AuList<AuString> history;
AuThreadPrimitives::RWLockUnique_t historyLock;
AuThreadPrimitives::SpinLock messageLock;
AuList<AuConsole::ConsoleMessage> messagesPending;
AuList<AuConsole::ConsoleMessage> messages;
AuList<AuString> screenBuffer;
bool bScreenBufferDoesntMap {};
int iScrollPos { -1 };
AuPair<AuUInt32, AuUInt32> cursorPos;
struct AlignedString
{
AuString str;
Further Linux support [+] Begin work on IO futexes for io release on process/thread exit [+] Linux ::readdir iteration [+] AuConsole buffering API [*] Fix sleep as to not get interrupted by signals [*] Switch the type of FS lock used under Linux [*] Linux: Use new IPCHandle encoding scheme [*] Fix undefined behaviour: unintialized timeout values (AuLoop/Linux) [*] Fix undefined behaviour: ConsoleTTY clear line was called of a color of a random value on stack [-] Remainings of std dir iterator [*] Fix pthread_kill (aka send signal to pthread handle) always kills process. This is what you expect bc signal handler inheritance. [*] Reformat the build Aurora.json file [+] Added clang warning ignores to the build file [*] Fix: UNIX need to use STDOUT_FILENO. Was using CRT handle in place of fd by mistake. [+] Linux implementation for IO yield (AuIO::IOYield() - UNIX::LinuxOverlappedYield()) [*] Fix: Linux async end of stream processing. res 0 = zero bytes consumed. <= was detecting this as an error of code 0. Should succeed with zero bytes. [+] Linux LoopQueue missing epilogue hook for the IO processor [*] Various refactors and minor bug fixes [*] Linux fix: Handle pipe EOS as zero [*] Linux fix: thread termination via a user signal of 77. Need a force terminate. [*] IPC handle: fix improper int to bool cast in the header setup within ToString [*] Linux fix: HWInfo CPU topology regression [-] Linux fix: remove SIGABRT handler [*] Missing override in compression, exit, and consoletty headers. [+] Unix Syslog logger backend
2022-08-02 04:52:17 +00:00
ETTYAlign align {};
};
AuString tempMemory;
AuUInt32 GuessWidth(const AuString &referenceLine);
const AuString &Stringify(const AuString &referenceLine, const AlignedString &string, bool spacing, bool brackets, bool extraPadding);
AlignedString header;
AlignedString subheader;
AlignedString headerTitle;
AlignedString logTitle;
bool bTriggerRedraw {};
bool bRightBorder {true};
bool bLeftBorder {true};
bool bTopBorder {true};
Further Linux support [+] Begin work on IO futexes for io release on process/thread exit [+] Linux ::readdir iteration [+] AuConsole buffering API [*] Fix sleep as to not get interrupted by signals [*] Switch the type of FS lock used under Linux [*] Linux: Use new IPCHandle encoding scheme [*] Fix undefined behaviour: unintialized timeout values (AuLoop/Linux) [*] Fix undefined behaviour: ConsoleTTY clear line was called of a color of a random value on stack [-] Remainings of std dir iterator [*] Fix pthread_kill (aka send signal to pthread handle) always kills process. This is what you expect bc signal handler inheritance. [*] Reformat the build Aurora.json file [+] Added clang warning ignores to the build file [*] Fix: UNIX need to use STDOUT_FILENO. Was using CRT handle in place of fd by mistake. [+] Linux implementation for IO yield (AuIO::IOYield() - UNIX::LinuxOverlappedYield()) [*] Fix: Linux async end of stream processing. res 0 = zero bytes consumed. <= was detecting this as an error of code 0. Should succeed with zero bytes. [+] Linux LoopQueue missing epilogue hook for the IO processor [*] Various refactors and minor bug fixes [*] Linux fix: Handle pipe EOS as zero [*] Linux fix: thread termination via a user signal of 77. Need a force terminate. [*] IPC handle: fix improper int to bool cast in the header setup within ToString [*] Linux fix: HWInfo CPU topology regression [-] Linux fix: remove SIGABRT handler [*] Missing override in compression, exit, and consoletty headers. [+] Unix Syslog logger backend
2022-08-02 04:52:17 +00:00
bool bShouldShowBorders {};
bool bShowingBorders {};
bool IsShowingHintLine();
bool bIsShowingHintLine;
2022-05-23 15:10:19 +00:00
bool IsWin32UxMode();
void UXModeFlip();
void UXModeStart();
bool uxModeFlipped {};
AuString inputField {};
AuUInt32 lastInputHash {};
AuUInt32 lastBorderHash {};
int leftPadding {1};
int rightPadding {1};
int leftLogPadding {1};
int rightLogPadding {1};
int topLogPadding {0}; // extra padding, if displaying header ...
int topLogPaddingExtra {1}; // this is backwards ...
int leftInputPadding {0};
int topInputPadding {0};
int topHintPadding {0};
int topHeaderPadding {0};
int midHeaderPadding {0};
int bottomSubHeaderPadding {0};
AuUInt32 oldCP {};
};
inline TTYConsole gTTYConsole;
void Init();
void Pump();
void Exit();
void OnEnter();
void WriteTTYOut(const AuConsole::ConsoleMessage &msg);
AUKN_SYM AuSPtr<ITTYConsole> GetTTYConsole();
}