mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-11 07:19:20 +00:00
Implement Virtual Terminal and fix /dev/kcon
This commit is contained in:
119
include/kcon.hpp
119
include/kcon.hpp
@ -18,11 +18,130 @@
|
||||
#ifndef __FENNIX_KERNEL_KERNEL_CONSOLE_H__
|
||||
#define __FENNIX_KERNEL_KERNEL_CONSOLE_H__
|
||||
|
||||
#include <display.hpp>
|
||||
#include <termios.h>
|
||||
#include <atomic>
|
||||
|
||||
namespace KernelConsole
|
||||
{
|
||||
enum TerminalColor
|
||||
{
|
||||
BLACK,
|
||||
RED,
|
||||
GREEN,
|
||||
YELLOW,
|
||||
BLUE,
|
||||
MAGENTA,
|
||||
CYAN,
|
||||
GREY
|
||||
};
|
||||
|
||||
struct ANSIArgument
|
||||
{
|
||||
int Value = 0;
|
||||
bool Empty = true;
|
||||
};
|
||||
|
||||
struct ANSIParser
|
||||
{
|
||||
enum ParserState
|
||||
{
|
||||
Escape,
|
||||
Bracket,
|
||||
Attribute,
|
||||
EndValue
|
||||
} State = Escape;
|
||||
|
||||
ANSIArgument Stack[8] = {};
|
||||
int Index = 0;
|
||||
};
|
||||
|
||||
struct TerminalAttribute
|
||||
{
|
||||
bool Bright = false;
|
||||
TerminalColor Background = BLACK;
|
||||
TerminalColor Foreground = GREY;
|
||||
};
|
||||
|
||||
struct TerminalCell
|
||||
{
|
||||
char c = '\0';
|
||||
TerminalAttribute attr{};
|
||||
};
|
||||
|
||||
struct TerminalCursor
|
||||
{
|
||||
long X = 0;
|
||||
long Y = 0;
|
||||
};
|
||||
|
||||
typedef void (*PaintCallback)(TerminalCell *Cell, long X, long Y);
|
||||
typedef void (*CursorCallback)(TerminalCursor *Cursor);
|
||||
|
||||
class FontRenderer
|
||||
{
|
||||
public:
|
||||
Video::Font *CurrentFont = nullptr;
|
||||
TerminalCursor Cursor = {0, 0};
|
||||
char Paint(long CellX, long CellY, char Char, uint32_t Foreground, uint32_t Background);
|
||||
};
|
||||
|
||||
class VirtualTerminal
|
||||
{
|
||||
private:
|
||||
ANSIParser Parser{};
|
||||
TerminalAttribute Attribute{};
|
||||
|
||||
TerminalCell *Cells = nullptr;
|
||||
TerminalCursor Cursor{};
|
||||
|
||||
PaintCallback PaintCB = nullptr;
|
||||
CursorCallback CursorCB = nullptr;
|
||||
|
||||
public:
|
||||
termios term;
|
||||
winsize termSize;
|
||||
|
||||
void Clear(unsigned short StartX, unsigned short StartY, unsigned short EndX, unsigned short EndY);
|
||||
void Scroll(unsigned short Lines);
|
||||
void NewLine();
|
||||
void Append(char c);
|
||||
void csi_cup(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_ed(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_el(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_sgr(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cuu(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cud(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cuf(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cub(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cnl(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cpl(ANSIArgument *Args, int ArgsCount);
|
||||
void csi_cha(ANSIArgument *Args, int ArgsCount);
|
||||
void Process(char c);
|
||||
|
||||
VirtualTerminal(unsigned short Rows, unsigned short Columns,
|
||||
unsigned short XPixels, unsigned short YPixels,
|
||||
PaintCallback Paint, CursorCallback Print);
|
||||
~VirtualTerminal();
|
||||
};
|
||||
|
||||
/**
|
||||
* 0 - Default
|
||||
* 1...11 - User
|
||||
* ...
|
||||
* 15 - Panic
|
||||
*/
|
||||
extern VirtualTerminal *Terminals[16];
|
||||
extern std::atomic<VirtualTerminal *> CurrentTerminal;
|
||||
extern int TermColors[];
|
||||
extern int TermBrightColors[];
|
||||
|
||||
bool SetTheme(std::string Theme);
|
||||
|
||||
/* Limited in functionality */
|
||||
void EarlyInit();
|
||||
|
||||
/* Full working terminal */
|
||||
void LateInit();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user