Kernel/VTerm - Replace offset WritePos with Row,Col pair
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_vt100.c
index bab7802..b5d60a9 100644 (file)
@@ -5,14 +5,27 @@
  * drv/vterm_vt100.c
  * - Virtual Terminal - VT100 (Kinda) Emulation
  */
-#define DEBUG  0
+#define DEBUG  1
 #include "vterm.h"
 
 #define sTerminal      sVTerm
 #include "../../../Usermode/Applications/gui_terminal_src/vt100.c"
 
+void *Display_GetTermState(tTerminal *Term) {
+       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);
        VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
 }
 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
@@ -34,104 +47,108 @@ void Display_ScrollDown(tTerminal *Term, int CountDown)
                VT_int_ScrollText(Term, CountDown);
        else
        {
-               if(Term->ViewPos/Term->TextWidth + CountDown < 0)
+               if(Term->ViewTopRow + CountDown < 0)
                        return ;
-               if(Term->ViewPos/Term->TextWidth + CountDown  > Term->TextHeight * (giVT_Scrollback + 1))
+               if(Term->ViewTopRow + CountDown  > Term->TextHeight * (giVT_Scrollback + 1))
                        return ;
                
-               Term->ViewPos += Term->TextWidth * CountDown;
+               Term->ViewTopRow += CountDown;
        }
 }
 void Display_SetCursor(tTerminal *Term, int Row, int Col)
 {
        LOG("(R%i,C%i)", Row, Col);
        VT_int_UpdateScreen(Term, 0);
-        int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
+        int    maxrows = VT_int_GetBufferRows(Term);
        ASSERTCR( Row, >=, 0, );
        ASSERTCR( Row, <, maxrows, );
        ASSERTCR( Col, >=, 0, );
        ASSERTCR( Col, <, Term->TextWidth, );
-       *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
+       VT_int_GetWritePosPtr(Term)->Row = Row;
+       VT_int_GetWritePosPtr(Term)->Col = Col;
 }
 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);
+       tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+
+       // TODO: Support scrolling if cursor goes offscreen
+       // if( bScrollIfNeeded )
+       //      Display_ScrollDown(extra);
+       // else
+       //      clip
 
        if( RelCol != 0 )
        {
                // 
                if( RelCol < 0 )
                {
-                       size_t  avail = *wrpos % Term->TextWidth;
-                       if( RelCol < -avail )
-                               RelCol = -avail;
+                        int    max = wrpos->Col;
+                       if( RelCol < -max )
+                               RelCol = -max;
                }
                else
                {
-                       size_t  avail = Term->TextWidth - (*wrpos % Term->TextWidth);
-                       if(RelCol > avail)
-                               RelCol = avail;
+                       size_t  max = Term->TextWidth - wrpos->Col - 1;
+                       if(RelCol > max)
+                               RelCol = max;
                }
-               *wrpos += RelCol;
+               wrpos->Col += RelCol;
        }
        if( RelRow != 0 )
        {
-                int    currow = *wrpos / Term->TextWidth;
-                int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
+                int    currow = wrpos->Row;
+                int    maxrows = VT_int_GetBufferRows(Term);
                if( RelRow < 0 )
                {
-                       if( currow + RelRow < 0 )
-                               RelRow = currow;
+                       if( RelRow < -currow )
+                               RelRow = -currow;
                }
                else
                {
                        if( currow + RelRow > maxrows-1 )
                                RelRow = maxrows-1 - currow;
                }
-               *wrpos += RelRow*Term->TextWidth;
+               wrpos->Row += RelRow;
        }
+       LOG("=(R%i,C%i)", wrpos->Row, wrpos->Col);
 }
 void Display_SaveCursor(tTerminal *Term)
 {
-       Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
+       Term->SavedWritePos = *VT_int_GetWritePosPtr(Term);
        LOG("Saved = %i", Term->SavedWritePos);
 }
 void Display_RestoreCursor(tTerminal *Term)
 {
-        int    max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
-        int    *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
-       if( Term->SavedWritePos >= max )
-               *wrpos = max-1;
-       else
-               *wrpos = Term->SavedWritePos;
-       LOG("Restored %i", *wrpos);
+       size_t  maxrow = VT_int_GetBufferRows(Term);
+       tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+       *wrpos = Term->SavedWritePos;
+       if(wrpos->Row >= maxrow)
+               wrpos->Row = maxrow-1;
+       if(wrpos->Col >= Term->TextWidth )
+               wrpos->Col = Term->TextWidth-1;
+       LOG("Restored (R%i,C%i)", wrpos->Row, wrpos->Col);
 }
 // 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 tVT_Pos   *wrpos = VT_int_GetWritePosPtr(Term);
 
-       LOG("(Dir=%i)", Dir);   
+       LOG("(Dir=%i)", Dir);
 
        // Erase all
        if( Dir == 0 ) {
-               VT_int_ClearLine(Term, *wrpos / Term->Width);
+               VT_int_ClearLine(Term, wrpos->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, wrpos->Row, wrpos->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, wrpos->Row, 0, wrpos->Col);
                VT_int_UpdateScreen(Term, 0);
        }
        else {
@@ -143,32 +160,33 @@ void Display_ClearLine(tTerminal *Term, int Dir)
 void Display_ClearLines(tTerminal *Term, int Dir)
 {
        LOG("(Dir=%i)", Dir);   
-        int    *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
-       tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
+       tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+       size_t  height = VT_int_GetBufferRows(Term);
        
        // All
        if( Dir == 0 ) {
-               int count;
                
-               if( Term->Flags & VT_FLAG_ALTBUF ) {
-                       count = Term->TextHeight;
-               }
-               else {
-                       count = Term->TextHeight * (giVT_Scrollback + 1);
-                       Term->ViewPos = 0;
+               if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
+                       Term->ViewTopRow = 0;
                }
+               int count = height;
                while( count -- )
                        VT_int_ClearLine(Term, count);
-               *wrpos = 0;
+               wrpos->Col = 0;
+               wrpos->Row = 0;
                VT_int_UpdateScreen(Term, 1);
        }
        // Downwards
        else if( Dir == 1 ) {
-               Log_Warning("VTerm", "TODO: ClearLines Down");
+               for( int row = wrpos->Row; 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->Row; row ++ )
+                       VT_int_ClearLine(Term, row);
+               VT_int_UpdateScreen(Term, 1);
        }
        else {
                // ERROR!
@@ -192,7 +210,7 @@ void Display_SetBackground(tTerminal *Term, uint32_t RGB)
 {
        LOG("(%06x)", RGB);
        Term->CurColour &= 0xFFFF8000;
-       Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<06;
+       Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<  0;
 }
 void Display_Flush(tTerminal *Term)
 {
@@ -204,4 +222,8 @@ void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled)
        LOG("(%B)", AltBufEnabled);
        VT_int_ToggleAltBuffer(Term, AltBufEnabled);
 }
+void Display_SetTitle(tTerminal *Term, const char *Title)
+{
+       // ignore
+}
 

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