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 VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
18 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
21 VT_int_PutChar(Term, '\n');
23 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
25 LOG("(%i,+%i)", Start, Count);
26 Term->ScrollTop = Start;
27 Term->ScrollHeight = Count;
29 void Display_ScrollDown(tTerminal *Term, int CountDown)
31 LOG("(%i)", CountDown);
32 VT_int_UpdateScreen(Term, 0);
33 if( Term->Flags & VT_FLAG_ALTBUF )
34 VT_int_ScrollText(Term, CountDown);
37 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
39 if(Term->ViewPos/Term->TextWidth + CountDown > Term->TextHeight * (giVT_Scrollback + 1))
42 Term->ViewPos += Term->TextWidth * CountDown;
45 void Display_SetCursor(tTerminal *Term, int Row, int Col)
47 LOG("(R%i,C%i)", Row, Col);
48 VT_int_UpdateScreen(Term, 0);
49 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
50 ASSERTCR( Row, >=, 0, );
51 ASSERTCR( Row, <, maxrows, );
52 ASSERTCR( Col, >=, 0, );
53 ASSERTCR( Col, <, Term->TextWidth, );
54 *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
56 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
58 LOG("(R+%i,C+%i)", RelRow, RelCol);
59 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
66 size_t avail = *wrpos % Term->TextWidth;
72 size_t avail = Term->TextWidth - (*wrpos % Term->TextWidth);
80 int currow = *wrpos / Term->TextWidth;
81 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
84 if( currow + RelRow < 0 )
89 if( currow + RelRow > maxrows-1 )
90 RelRow = maxrows-1 - currow;
92 *wrpos += RelRow*Term->TextWidth;
95 void Display_SaveCursor(tTerminal *Term)
97 Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
98 LOG("Saved = %i", Term->SavedWritePos);
100 void Display_RestoreCursor(tTerminal *Term)
102 int max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
103 int *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
104 if( Term->SavedWritePos >= max )
107 *wrpos = Term->SavedWritePos;
108 LOG("Restored %i", *wrpos);
110 // 0: All, 1: Forward, -1: Reverse
111 void Display_ClearLine(tTerminal *Term, int Dir)
113 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
114 tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
116 LOG("(Dir=%i)", Dir);
120 VT_int_ClearLine(Term, *wrpos / Term->Width);
121 VT_int_UpdateScreen(Term, 0);
124 else if( Dir == 1 ) {
125 int max = Term->Width - *wrpos % Term->Width;
126 for( int i = 0; i < max; i ++ )
127 buffer[*wrpos+i].Ch = 0;
128 VT_int_UpdateScreen(Term, 0);
131 else if( Dir == -1 ) {
132 int start = *wrpos - *wrpos % Term->Width;
133 for( int i = start; i < *wrpos; i ++ )
135 VT_int_UpdateScreen(Term, 0);
139 ASSERTC(Dir, >=, -1);
143 void Display_ClearLines(tTerminal *Term, int Dir)
145 LOG("(Dir=%i)", Dir);
146 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
147 tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
153 if( Term->Flags & VT_FLAG_ALTBUF ) {
154 count = Term->TextHeight;
157 count = Term->TextHeight * (giVT_Scrollback + 1);
161 VT_int_ClearLine(Term, count);
163 VT_int_UpdateScreen(Term, 1);
166 else if( Dir == 1 ) {
167 Log_Warning("VTerm", "TODO: ClearLines Down");
170 else if( Dir == -1 ) {
171 Log_Warning("VTerm", "TODO: ClearLines Up");
175 ASSERTC(Dir, >=, -1);
179 void Display_ResetAttributes(tTerminal *Term)
182 Term->CurColour = DEFAULT_COLOUR;
184 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
187 Term->CurColour &= 0x8000FFFF;
188 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
191 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
194 Term->CurColour &= 0xFFFF8000;
195 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<06;
197 void Display_Flush(tTerminal *Term)
200 VT_int_UpdateScreen(Term, 0);
202 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
204 LOG("(%B)", AltBufEnabled);
205 VT_int_ToggleAltBuffer(Term, AltBufEnabled);