1f635a12ab5a1930cd1a24c886a3fc80ea7f9f03
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_vt100.c
1 /*
2  * Acess2 Kernel
3  * - By John Hodge (thePowersGang)
4  *
5  * drv/vterm_vt100.c
6  * - Virtual Terminal - VT100 (Kinda) Emulation
7  */
8 #define DEBUG   0
9 #include "vterm.h"
10
11 #define sTerminal       sVTerm
12 #include "../../../Usermode/Applications/gui_terminal_src/vt100.c"
13
14 void *Display_GetTermState(tTerminal *Term) {
15         return Term->VT100Info;;
16 }
17 void Display_SetTermState(tTerminal *Term, void *State) {
18         Term->VT100Info = State;
19 }
20
21 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
22 {
23         LOG("'%*C'", Length, UTF8Text);
24         VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
25 }
26 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
27 {
28         LOG("");
29         VT_int_PutChar(Term, '\n');
30 }
31 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
32 {
33         LOG("(%i,+%i)", Start, Count);
34         Term->ScrollTop = Start;
35         Term->ScrollHeight = Count;
36 }
37 void Display_ScrollDown(tTerminal *Term, int CountDown)
38 {
39         LOG("(%i)", CountDown);
40         VT_int_UpdateScreen(Term, 0);
41         if( Term->Flags & VT_FLAG_ALTBUF )
42                 VT_int_ScrollText(Term, CountDown);
43         else
44         {
45                 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
46                         return ;
47                 if(Term->ViewPos/Term->TextWidth + CountDown  > Term->TextHeight * (giVT_Scrollback + 1))
48                         return ;
49                 
50                 Term->ViewPos += Term->TextWidth * CountDown;
51         }
52 }
53 void Display_SetCursor(tTerminal *Term, int Row, int Col)
54 {
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;
63 }
64 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
65 {
66         LOG("(R+%i,C+%i)", RelRow, RelCol);
67         int     *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
68
69         if( RelCol != 0 )
70         {
71                 // 
72                 if( RelCol < 0 )
73                 {
74                          int    avail = *wrpos % Term->TextWidth;
75                         if( RelCol < -avail )
76                                 RelCol = -avail;
77                 }
78                 else
79                 {
80                         size_t  avail = Term->TextWidth - (*wrpos % Term->TextWidth);
81                         if(RelCol > avail)
82                                 RelCol = avail;
83                 }
84                 *wrpos += RelCol;
85         }
86         if( RelRow != 0 )
87         {
88                  int    currow = *wrpos / Term->TextWidth;
89                  int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
90                 if( RelRow < 0 )
91                 {
92                         if( RelRow < -currow )
93                                 RelRow = -currow;
94                 }
95                 else
96                 {
97                         if( currow + RelRow > maxrows-1 )
98                                 RelRow = maxrows-1 - currow;
99                 }
100                 *wrpos += RelRow*Term->TextWidth;
101         }
102         LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
103 }
104 void Display_SaveCursor(tTerminal *Term)
105 {
106         Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
107         LOG("Saved = %i", Term->SavedWritePos);
108 }
109 void Display_RestoreCursor(tTerminal *Term)
110 {
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 )
114                 *wrpos = max-1;
115         else
116                 *wrpos = Term->SavedWritePos;
117         LOG("Restored %i", *wrpos);
118 }
119 // 0: All, 1: Forward, -1: Reverse
120 void Display_ClearLine(tTerminal *Term, int Dir)
121 {
122          int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
123         tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
124
125         LOG("(Dir=%i)", Dir);   
126
127         // Erase all
128         if( Dir == 0 ) {
129                 VT_int_ClearLine(Term, *wrpos / Term->Width);
130                 VT_int_UpdateScreen(Term, 0);
131         }
132         // Erase to right
133         else if( Dir == 1 ) {
134                 int max = Term->Width - *wrpos % Term->Width;
135                 for( int i = 0; i < max; i ++ )
136                         buffer[*wrpos+i].Ch = 0;
137                 VT_int_UpdateScreen(Term, 0);
138         }
139         // Erase to left
140         else if( Dir == -1 ) {
141                 int start = *wrpos - *wrpos % Term->Width;
142                 for( int i = start; i < *wrpos; i ++ )
143                         buffer[i].Ch = 0;
144                 VT_int_UpdateScreen(Term, 0);
145         }
146         else {
147                 // ERROR!
148                 ASSERTC(Dir, >=, -1);
149                 ASSERTC(Dir, <=, 1);
150         }
151 }
152 void Display_ClearLines(tTerminal *Term, int Dir)
153 {
154         LOG("(Dir=%i)", Dir);   
155          int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
156         
157         // All
158         if( Dir == 0 ) {
159                 int count;
160                 
161                 if( Term->Flags & VT_FLAG_ALTBUF ) {
162                         count = Term->TextHeight;
163                 }
164                 else {
165                         count = Term->TextHeight * (giVT_Scrollback + 1);
166                         Term->ViewPos = 0;
167                 }
168                 while( count -- )
169                         VT_int_ClearLine(Term, count);
170                 *wrpos = 0;
171                 VT_int_UpdateScreen(Term, 1);
172         }
173         // Downwards
174         else if( Dir == 1 ) {
175                 Log_Warning("VTerm", "TODO: ClearLines Down");
176         }
177         // Upwards
178         else if( Dir == -1 ) {
179                 Log_Warning("VTerm", "TODO: ClearLines Up");
180         }
181         else {
182                 // ERROR!
183                 ASSERTC(Dir, >=, -1);
184                 ASSERTC(Dir, <=, 1);
185         }
186 }
187 void Display_ResetAttributes(tTerminal *Term)
188 {
189         LOG("");        
190         Term->CurColour = DEFAULT_COLOUR;
191 }
192 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
193 {
194         LOG("(%06x)", RGB);
195         Term->CurColour &= 0x8000FFFF;
196         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
197         
198 }
199 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
200 {
201         LOG("(%06x)", RGB);
202         Term->CurColour &= 0xFFFF8000;
203         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<  0;
204 }
205 void Display_Flush(tTerminal *Term)
206 {
207         LOG("");
208         VT_int_UpdateScreen(Term, 0);
209 }
210 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
211 {
212         LOG("(%B)", AltBufEnabled);
213         VT_int_ToggleAltBuffer(Term, AltBufEnabled);
214 }
215 void Display_SetTitle(tTerminal *Term, const char *Title)
216 {
217         // ignore
218 }
219

UCC git Repository :: git.ucc.asn.au