VT100 - Replace global buffer with per-terminal, further implementation of escape...
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_vt100.c
index 1f635a1..ccb0c52 100644 (file)
 #include "../../../Usermode/Applications/gui_terminal_src/vt100.c"
 
 void *Display_GetTermState(tTerminal *Term) {
-       return Term->VT100Info;;
+       return Term->VT100Info;
 }
 void Display_SetTermState(tTerminal *Term, void *State) {
        Term->VT100Info = State;
 }
 
+void Display_SendInput(tTerminal *Term, const char *String)
+{
+       PTY_SendInput(Term->PTY, String, strlen(String));
+}
+
 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
 {
        LOG("'%*C'", Length, UTF8Text);
@@ -66,6 +71,12 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
        LOG("(R+%i,C+%i)", RelRow, RelCol);
        int     *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
 
+       // TODO: Support scrolling if cursor goes offscreen
+       // if( bScrollIfNeeded )
+       //      Display_ScrollDown(extra);
+       // else
+       //      clip
+
        if( RelCol != 0 )
        {
                // 
@@ -119,28 +130,25 @@ void Display_RestoreCursor(tTerminal *Term)
 // 0: All, 1: Forward, -1: Reverse
 void Display_ClearLine(tTerminal *Term, int Dir)
 {
-        int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
-       tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
+       const int       wrpos = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltWritePos : Term->WritePos);
+       const int       row = wrpos / Term->TextWidth;
+       const int       col = wrpos % Term->TextWidth;
 
-       LOG("(Dir=%i)", Dir);   
+       LOG("(Dir=%i)", Dir);
 
        // Erase all
        if( Dir == 0 ) {
-               VT_int_ClearLine(Term, *wrpos / Term->Width);
+               VT_int_ClearLine(Term, row);
                VT_int_UpdateScreen(Term, 0);
        }
        // Erase to right
        else if( Dir == 1 ) {
-               int max = Term->Width - *wrpos % Term->Width;
-               for( int i = 0; i < max; i ++ )
-                       buffer[*wrpos+i].Ch = 0;
+               VT_int_ClearInLine(Term, row, col, Term->TextWidth);
                VT_int_UpdateScreen(Term, 0);
        }
        // Erase to left
        else if( Dir == -1 ) {
-               int start = *wrpos - *wrpos % Term->Width;
-               for( int i = start; i < *wrpos; i ++ )
-                       buffer[i].Ch = 0;
+               VT_int_ClearInLine(Term, row, 0, col);
                VT_int_UpdateScreen(Term, 0);
        }
        else {
@@ -153,18 +161,15 @@ void Display_ClearLines(tTerminal *Term, int Dir)
 {
        LOG("(Dir=%i)", Dir);   
         int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
+        int    height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
        
        // All
        if( Dir == 0 ) {
-               int count;
                
-               if( Term->Flags & VT_FLAG_ALTBUF ) {
-                       count = Term->TextHeight;
-               }
-               else {
-                       count = Term->TextHeight * (giVT_Scrollback + 1);
+               if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
                        Term->ViewPos = 0;
                }
+               int count = height;
                while( count -- )
                        VT_int_ClearLine(Term, count);
                *wrpos = 0;
@@ -172,11 +177,15 @@ void Display_ClearLines(tTerminal *Term, int Dir)
        }
        // Downwards
        else if( Dir == 1 ) {
-               Log_Warning("VTerm", "TODO: ClearLines Down");
+               for( int row = *wrpos / Term->TextWidth; row < height; row ++ )
+                       VT_int_ClearLine(Term, row);
+               VT_int_UpdateScreen(Term, 1);
        }
        // Upwards
        else if( Dir == -1 ) {
-               Log_Warning("VTerm", "TODO: ClearLines Up");
+               for( int row = 0; row < *wrpos / Term->TextWidth; row ++ )
+                       VT_int_ClearLine(Term, row);
+               VT_int_UpdateScreen(Term, 1);
        }
        else {
                // ERROR!

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