3 * - By John Hodge (thePowersGang)
6 * - Virtual Terminal - VT100 (Kinda) Emulation
11 #define sTerminal sVTerm
12 #include "../../../Usermode/Applications/gui_terminal_src/vt100.c"
14 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
16 LOG("'%.*s'", Length, UTF8Text);
17 VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
19 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
22 VT_int_PutChar(Term, '\n');
24 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
26 LOG("(%i,+%i)", Start, Count);
27 Term->ScrollTop = Start;
28 Term->ScrollHeight = Count;
30 void Display_ScrollDown(tTerminal *Term, int CountDown)
32 LOG("(%i)", CountDown);
33 VT_int_UpdateScreen(Term, 0);
34 if( Term->Flags & VT_FLAG_ALTBUF )
35 VT_int_ScrollText(Term, CountDown);
38 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
40 if(Term->ViewPos/Term->TextWidth + CountDown > Term->TextHeight * (giVT_Scrollback + 1))
43 Term->ViewPos += Term->TextWidth * CountDown;
46 void Display_SetCursor(tTerminal *Term, int Row, int Col)
48 LOG("(R%i,C%i)", Row, Col);
49 VT_int_UpdateScreen(Term, 0);
50 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
51 ASSERTCR( Row, >=, 0, );
52 ASSERTCR( Row, <, maxrows, );
53 ASSERTCR( Col, >=, 0, );
54 ASSERTCR( Col, <, Term->TextWidth, );
55 *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
57 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
59 LOG("(R+%i,C+%i)", RelRow, RelCol);
60 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
67 int avail = *wrpos % Term->TextWidth;
73 size_t avail = Term->TextWidth - (*wrpos % Term->TextWidth);
81 int currow = *wrpos / Term->TextWidth;
82 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
85 if( RelRow < -currow )
90 if( currow + RelRow > maxrows-1 )
91 RelRow = maxrows-1 - currow;
93 *wrpos += RelRow*Term->TextWidth;
95 LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
97 void Display_SaveCursor(tTerminal *Term)
99 Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
100 LOG("Saved = %i", Term->SavedWritePos);
102 void Display_RestoreCursor(tTerminal *Term)
104 int max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
105 int *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
106 if( Term->SavedWritePos >= max )
109 *wrpos = Term->SavedWritePos;
110 LOG("Restored %i", *wrpos);
112 // 0: All, 1: Forward, -1: Reverse
113 void Display_ClearLine(tTerminal *Term, int Dir)
115 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
116 tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
118 LOG("(Dir=%i)", Dir);
122 VT_int_ClearLine(Term, *wrpos / Term->Width);
123 VT_int_UpdateScreen(Term, 0);
126 else if( Dir == 1 ) {
127 int max = Term->Width - *wrpos % Term->Width;
128 for( int i = 0; i < max; i ++ )
129 buffer[*wrpos+i].Ch = 0;
130 VT_int_UpdateScreen(Term, 0);
133 else if( Dir == -1 ) {
134 int start = *wrpos - *wrpos % Term->Width;
135 for( int i = start; i < *wrpos; i ++ )
137 VT_int_UpdateScreen(Term, 0);
141 ASSERTC(Dir, >=, -1);
145 void Display_ClearLines(tTerminal *Term, int Dir)
147 LOG("(Dir=%i)", Dir);
148 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
149 tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
155 if( Term->Flags & VT_FLAG_ALTBUF ) {
156 count = Term->TextHeight;
159 count = Term->TextHeight * (giVT_Scrollback + 1);
163 VT_int_ClearLine(Term, count);
165 VT_int_UpdateScreen(Term, 1);
168 else if( Dir == 1 ) {
169 Log_Warning("VTerm", "TODO: ClearLines Down");
172 else if( Dir == -1 ) {
173 Log_Warning("VTerm", "TODO: ClearLines Up");
177 ASSERTC(Dir, >=, -1);
181 void Display_ResetAttributes(tTerminal *Term)
184 Term->CurColour = DEFAULT_COLOUR;
186 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
189 Term->CurColour &= 0x8000FFFF;
190 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
193 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
196 Term->CurColour &= 0xFFFF8000;
197 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 0;
199 void Display_Flush(tTerminal *Term)
202 VT_int_UpdateScreen(Term, 0);
204 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
206 LOG("(%B)", AltBufEnabled);
207 VT_int_ToggleAltBuffer(Term, AltBufEnabled);