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_GetTermState(tTerminal *Term) {
15 return Term->VT100Info;;
17 void Display_SetTermState(tTerminal *Term, void *State) {
18 Term->VT100Info = State;
21 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
23 LOG("'%*C'", Length, UTF8Text);
24 VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
26 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
29 VT_int_PutChar(Term, '\n');
31 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
33 LOG("(%i,+%i)", Start, Count);
34 Term->ScrollTop = Start;
35 Term->ScrollHeight = Count;
37 void Display_ScrollDown(tTerminal *Term, int CountDown)
39 LOG("(%i)", CountDown);
40 VT_int_UpdateScreen(Term, 0);
41 if( Term->Flags & VT_FLAG_ALTBUF )
42 VT_int_ScrollText(Term, CountDown);
45 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
47 if(Term->ViewPos/Term->TextWidth + CountDown > Term->TextHeight * (giVT_Scrollback + 1))
50 Term->ViewPos += Term->TextWidth * CountDown;
53 void Display_SetCursor(tTerminal *Term, int Row, int Col)
55 LOG("(R%i,C%i)", Row, Col);
56 VT_int_UpdateScreen(Term, 0);
57 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
58 ASSERTCR( Row, >=, 0, );
59 ASSERTCR( Row, <, maxrows, );
60 ASSERTCR( Col, >=, 0, );
61 ASSERTCR( Col, <, Term->TextWidth, );
62 *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
64 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
66 LOG("(R+%i,C+%i)", RelRow, RelCol);
67 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
74 int avail = *wrpos % Term->TextWidth;
80 size_t avail = Term->TextWidth - (*wrpos % Term->TextWidth);
88 int currow = *wrpos / Term->TextWidth;
89 int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
92 if( RelRow < -currow )
97 if( currow + RelRow > maxrows-1 )
98 RelRow = maxrows-1 - currow;
100 *wrpos += RelRow*Term->TextWidth;
102 LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
104 void Display_SaveCursor(tTerminal *Term)
106 Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
107 LOG("Saved = %i", Term->SavedWritePos);
109 void Display_RestoreCursor(tTerminal *Term)
111 int max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
112 int *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
113 if( Term->SavedWritePos >= max )
116 *wrpos = Term->SavedWritePos;
117 LOG("Restored %i", *wrpos);
119 // 0: All, 1: Forward, -1: Reverse
120 void Display_ClearLine(tTerminal *Term, int Dir)
122 const int wrpos = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltWritePos : Term->WritePos);
123 const int row = wrpos / Term->TextWidth;
124 const int col = wrpos % Term->TextWidth;
126 LOG("(Dir=%i)", Dir);
130 VT_int_ClearLine(Term, row);
131 VT_int_UpdateScreen(Term, 0);
134 else if( Dir == 1 ) {
135 VT_int_ClearInLine(Term, row, col, Term->TextWidth);
136 VT_int_UpdateScreen(Term, 0);
139 else if( Dir == -1 ) {
140 VT_int_ClearInLine(Term, row, 0, col);
141 VT_int_UpdateScreen(Term, 0);
145 ASSERTC(Dir, >=, -1);
149 void Display_ClearLines(tTerminal *Term, int Dir)
151 LOG("(Dir=%i)", Dir);
152 int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
158 if( Term->Flags & VT_FLAG_ALTBUF ) {
159 count = Term->TextHeight;
162 count = Term->TextHeight * (giVT_Scrollback + 1);
166 VT_int_ClearLine(Term, count);
168 VT_int_UpdateScreen(Term, 1);
171 else if( Dir == 1 ) {
172 Log_Warning("VTerm", "TODO: ClearLines Down");
175 else if( Dir == -1 ) {
176 Log_Warning("VTerm", "TODO: ClearLines Up");
180 ASSERTC(Dir, >=, -1);
184 void Display_ResetAttributes(tTerminal *Term)
187 Term->CurColour = DEFAULT_COLOUR;
189 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
192 Term->CurColour &= 0x8000FFFF;
193 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
196 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
199 Term->CurColour &= 0xFFFF8000;
200 Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 0;
202 void Display_Flush(tTerminal *Term)
205 VT_int_UpdateScreen(Term, 0);
207 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
209 LOG("(%B)", AltBufEnabled);
210 VT_int_ToggleAltBuffer(Term, AltBufEnabled);
212 void Display_SetTitle(tTerminal *Term, const char *Title)