VT100 - Replace global buffer with per-terminal, further implementation of escape...
[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_SendInput(tTerminal *Term, const char *String)
22 {
23         PTY_SendInput(Term->PTY, String, strlen(String));
24 }
25
26 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
27 {
28         LOG("'%*C'", Length, UTF8Text);
29         VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
30 }
31 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
32 {
33         LOG("");
34         VT_int_PutChar(Term, '\n');
35 }
36 void Display_SetScrollArea(tTerminal *Term, int Start, int Count)
37 {
38         LOG("(%i,+%i)", Start, Count);
39         Term->ScrollTop = Start;
40         Term->ScrollHeight = Count;
41 }
42 void Display_ScrollDown(tTerminal *Term, int CountDown)
43 {
44         LOG("(%i)", CountDown);
45         VT_int_UpdateScreen(Term, 0);
46         if( Term->Flags & VT_FLAG_ALTBUF )
47                 VT_int_ScrollText(Term, CountDown);
48         else
49         {
50                 if(Term->ViewPos/Term->TextWidth + CountDown < 0)
51                         return ;
52                 if(Term->ViewPos/Term->TextWidth + CountDown  > Term->TextHeight * (giVT_Scrollback + 1))
53                         return ;
54                 
55                 Term->ViewPos += Term->TextWidth * CountDown;
56         }
57 }
58 void Display_SetCursor(tTerminal *Term, int Row, int Col)
59 {
60         LOG("(R%i,C%i)", Row, Col);
61         VT_int_UpdateScreen(Term, 0);
62          int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
63         ASSERTCR( Row, >=, 0, );
64         ASSERTCR( Row, <, maxrows, );
65         ASSERTCR( Col, >=, 0, );
66         ASSERTCR( Col, <, Term->TextWidth, );
67         *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
68 }
69 void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
70 {
71         LOG("(R+%i,C+%i)", RelRow, RelCol);
72         int     *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
73
74         // TODO: Support scrolling if cursor goes offscreen
75         // if( bScrollIfNeeded )
76         //      Display_ScrollDown(extra);
77         // else
78         //      clip
79
80         if( RelCol != 0 )
81         {
82                 // 
83                 if( RelCol < 0 )
84                 {
85                          int    avail = *wrpos % Term->TextWidth;
86                         if( RelCol < -avail )
87                                 RelCol = -avail;
88                 }
89                 else
90                 {
91                         size_t  avail = Term->TextWidth - (*wrpos % Term->TextWidth);
92                         if(RelCol > avail)
93                                 RelCol = avail;
94                 }
95                 *wrpos += RelCol;
96         }
97         if( RelRow != 0 )
98         {
99                  int    currow = *wrpos / Term->TextWidth;
100                  int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
101                 if( RelRow < 0 )
102                 {
103                         if( RelRow < -currow )
104                                 RelRow = -currow;
105                 }
106                 else
107                 {
108                         if( currow + RelRow > maxrows-1 )
109                                 RelRow = maxrows-1 - currow;
110                 }
111                 *wrpos += RelRow*Term->TextWidth;
112         }
113         LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
114 }
115 void Display_SaveCursor(tTerminal *Term)
116 {
117         Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
118         LOG("Saved = %i", Term->SavedWritePos);
119 }
120 void Display_RestoreCursor(tTerminal *Term)
121 {
122          int    max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
123          int    *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
124         if( Term->SavedWritePos >= max )
125                 *wrpos = max-1;
126         else
127                 *wrpos = Term->SavedWritePos;
128         LOG("Restored %i", *wrpos);
129 }
130 // 0: All, 1: Forward, -1: Reverse
131 void Display_ClearLine(tTerminal *Term, int Dir)
132 {
133         const int       wrpos = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltWritePos : Term->WritePos);
134         const int       row = wrpos / Term->TextWidth;
135         const int       col = wrpos % Term->TextWidth;
136
137         LOG("(Dir=%i)", Dir);
138
139         // Erase all
140         if( Dir == 0 ) {
141                 VT_int_ClearLine(Term, row);
142                 VT_int_UpdateScreen(Term, 0);
143         }
144         // Erase to right
145         else if( Dir == 1 ) {
146                 VT_int_ClearInLine(Term, row, col, Term->TextWidth);
147                 VT_int_UpdateScreen(Term, 0);
148         }
149         // Erase to left
150         else if( Dir == -1 ) {
151                 VT_int_ClearInLine(Term, row, 0, col);
152                 VT_int_UpdateScreen(Term, 0);
153         }
154         else {
155                 // ERROR!
156                 ASSERTC(Dir, >=, -1);
157                 ASSERTC(Dir, <=, 1);
158         }
159 }
160 void Display_ClearLines(tTerminal *Term, int Dir)
161 {
162         LOG("(Dir=%i)", Dir);   
163          int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
164          int    height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
165         
166         // All
167         if( Dir == 0 ) {
168                 
169                 if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
170                         Term->ViewPos = 0;
171                 }
172                 int count = height;
173                 while( count -- )
174                         VT_int_ClearLine(Term, count);
175                 *wrpos = 0;
176                 VT_int_UpdateScreen(Term, 1);
177         }
178         // Downwards
179         else if( Dir == 1 ) {
180                 for( int row = *wrpos / Term->TextWidth; row < height; row ++ )
181                         VT_int_ClearLine(Term, row);
182                 VT_int_UpdateScreen(Term, 1);
183         }
184         // Upwards
185         else if( Dir == -1 ) {
186                 for( int row = 0; row < *wrpos / Term->TextWidth; row ++ )
187                         VT_int_ClearLine(Term, row);
188                 VT_int_UpdateScreen(Term, 1);
189         }
190         else {
191                 // ERROR!
192                 ASSERTC(Dir, >=, -1);
193                 ASSERTC(Dir, <=, 1);
194         }
195 }
196 void Display_ResetAttributes(tTerminal *Term)
197 {
198         LOG("");        
199         Term->CurColour = DEFAULT_COLOUR;
200 }
201 void Display_SetForeground(tTerminal *Term, uint32_t RGB)
202 {
203         LOG("(%06x)", RGB);
204         Term->CurColour &= 0x8000FFFF;
205         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 16;
206         
207 }
208 void Display_SetBackground(tTerminal *Term, uint32_t RGB)
209 {
210         LOG("(%06x)", RGB);
211         Term->CurColour &= 0xFFFF8000;
212         Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<  0;
213 }
214 void Display_Flush(tTerminal *Term)
215 {
216         LOG("");
217         VT_int_UpdateScreen(Term, 0);
218 }
219 void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
220 {
221         LOG("(%B)", AltBufEnabled);
222         VT_int_ToggleAltBuffer(Term, AltBufEnabled);
223 }
224 void Display_SetTitle(tTerminal *Term, const char *Title)
225 {
226         // ignore
227 }
228

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