Kernel/VTerm - Switched to using userland VT100 code
[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_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
15 {
16         VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
17 }
18 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
19 {
20         LOG("");
21         VT_int_PutChar(Term, '\n');
22 }
23 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
24 {
25         LOG("(%i,+%i)", Start, Count);
26         Term->ScrollTop = Start;
27         Term->ScrollHeight = Count;
28 }
29 void Display_ScrollDown(tTerminal *Term, int CountDown)
30 {
31         LOG("(%i)", CountDown);
32         VT_int_UpdateScreen(Term, 0);
33         if( Term->Flags & VT_FLAG_ALTBUF )
34                 VT_int_ScrollText(Term, CountDown);
35         else
36         {
37                 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
38                         return ;
39                 if(Term->ViewPos/Term->TextWidth + CountDown  > Term->TextHeight * (giVT_Scrollback + 1))
40                         return ;
41                 
42                 Term->ViewPos += Term->TextWidth * CountDown;
43         }
44 }
45 void Display_SetCursor(tTerminal *Term, int Row, int Col)
46 {
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;
55 }
56 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
57 {
58         LOG("(R+%i,C+%i)", RelRow, RelCol);
59         int     *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
60
61         if( RelCol != 0 )
62         {
63                 // 
64                 if( RelCol < 0 )
65                 {
66                         size_t  avail = *wrpos % Term->TextWidth;
67                         if( RelCol < -avail )
68                                 RelCol = -avail;
69                 }
70                 else
71                 {
72                         size_t  avail = Term->TextWidth - (*wrpos % Term->TextWidth);
73                         if(RelCol > avail)
74                                 RelCol = avail;
75                 }
76                 *wrpos += RelCol;
77         }
78         if( RelRow != 0 )
79         {
80                  int    currow = *wrpos / Term->TextWidth;
81                  int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
82                 if( RelRow < 0 )
83                 {
84                         if( currow + RelRow < 0 )
85                                 RelRow = currow;
86                 }
87                 else
88                 {
89                         if( currow + RelRow > maxrows-1 )
90                                 RelRow = maxrows-1 - currow;
91                 }
92                 *wrpos += RelRow*Term->TextWidth;
93         }
94 }
95 void Display_SaveCursor(tTerminal *Term)
96 {
97         Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
98         LOG("Saved = %i", Term->SavedWritePos);
99 }
100 void Display_RestoreCursor(tTerminal *Term)
101 {
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 )
105                 *wrpos = max-1;
106         else
107                 *wrpos = Term->SavedWritePos;
108         LOG("Restored %i", *wrpos);
109 }
110 // 0: All, 1: Forward, -1: Reverse
111 void Display_ClearLine(tTerminal *Term, int Dir)
112 {
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);
115
116         LOG("(Dir=%i)", Dir);   
117
118         // Erase all
119         if( Dir == 0 ) {
120                 VT_int_ClearLine(Term, *wrpos / Term->Width);
121                 VT_int_UpdateScreen(Term, 0);
122         }
123         // Erase to right
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);
129         }
130         // Erase to left
131         else if( Dir == -1 ) {
132                 int start = *wrpos - *wrpos % Term->Width;
133                 for( int i = start; i < *wrpos; i ++ )
134                         buffer[i].Ch = 0;
135                 VT_int_UpdateScreen(Term, 0);
136         }
137         else {
138                 // ERROR!
139                 ASSERTC(Dir, >=, -1);
140                 ASSERTC(Dir, <=, 1);
141         }
142 }
143 void Display_ClearLines(tTerminal *Term, int Dir)
144 {
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);
148         
149         // All
150         if( Dir == 0 ) {
151                 int count;
152                 
153                 if( Term->Flags & VT_FLAG_ALTBUF ) {
154                         count = Term->TextHeight;
155                 }
156                 else {
157                         count = Term->TextHeight * (giVT_Scrollback + 1);
158                         Term->ViewPos = 0;
159                 }
160                 while( count -- )
161                         VT_int_ClearLine(Term, count);
162                 *wrpos = 0;
163                 VT_int_UpdateScreen(Term, 1);
164         }
165         // Downwards
166         else if( Dir == 1 ) {
167                 Log_Warning("VTerm", "TODO: ClearLines Down");
168         }
169         // Upwards
170         else if( Dir == -1 ) {
171                 Log_Warning("VTerm", "TODO: ClearLines Up");
172         }
173         else {
174                 // ERROR!
175                 ASSERTC(Dir, >=, -1);
176                 ASSERTC(Dir, <=, 1);
177         }
178 }
179 void Display_ResetAttributes(tTerminal *Term)
180 {
181         LOG("");        
182         Term->CurColour = DEFAULT_COLOUR;
183 }
184 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
185 {
186         LOG("(%06x)", RGB);
187         Term->CurColour &= 0x8000FFFF;
188         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
189         
190 }
191 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
192 {
193         LOG("(%06x)", RGB);
194         Term->CurColour &= 0xFFFF8000;
195         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<06;
196 }
197 void Display_Flush(tTerminal *Term)
198 {
199         LOG("");
200         VT_int_UpdateScreen(Term, 0);
201 }
202 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
203 {
204         LOG("(%B)", AltBufEnabled);
205         VT_int_ToggleAltBuffer(Term, AltBufEnabled);
206 }
207

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