Kernel/VTerm - Code cleanup and VT100 bugfixes
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_termbuf.c
index cb0de74..d4ea9a4 100644 (file)
@@ -62,26 +62,49 @@ void VT_int_PutRawString(tVTerm *Term, const Uint8 *String, size_t Bytes)
 void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
 {
         int    i;
-       tVT_Char        *buffer;
-        int    write_pos;
-        int    limit;
        
        HEAP_VALIDATE();
        
-       if(Term->Flags & VT_FLAG_ALTBUF) {
-               buffer = Term->AltBuf;
-               write_pos = Term->AltWritePos;
-               limit = Term->TextHeight * Term->TextWidth;
+       size_t  limit = VT_int_GetBufferRows(Term) * Term->TextWidth;
+       size_t  write_pos = *VT_int_GetWritePosPtr(Term);
+       tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
+
+       ASSERTC(write_pos, >=, 0);
+
+       // Scroll entire buffer (about to write outside limit)
+       if( write_pos >= limit )
+       {
+               ASSERTC(write_pos, <, limit + Term->TextWidth);
+               VT_int_ScrollText(Term, 1);
+               write_pos -= Term->TextWidth;
        }
-       else {
-               buffer = Term->Text;
-               write_pos = Term->WritePos;
-               limit = Term->TextHeight*(giVT_Scrollback+1) * Term->TextWidth;
+
+       // Bring written cell into view
+       if( !(Term->Flags & VT_FLAG_ALTBUF) )
+       {
+               size_t  onescreen = Term->TextWidth*Term->TextHeight;
+               if( write_pos >= Term->ViewPos + onescreen )
+               {
+                       size_t  new_pos = write_pos - (write_pos % Term->TextWidth) - onescreen + Term->TextWidth;
+                       size_t  count = (new_pos - Term->ViewPos) / Term->TextWidth;
+                       VT_int_ScrollFramebuffer(Term, count);
+                       //Debug("VT_int_PutChar: VScroll down to %i", new_pos/Term->TextWidth);
+                       Term->ViewPos = new_pos;
+               }
+               else if( write_pos < Term->ViewPos )
+               {
+                       size_t  new_pos = write_pos - (write_pos % Term->TextWidth);
+                       size_t  count = (Term->ViewPos - new_pos) / Term->TextWidth;
+                       VT_int_ScrollFramebuffer(Term, -count);
+                       //Debug("VT_int_PutChar: VScroll up to %i", new_pos/Term->TextWidth);
+                       Term->ViewPos = new_pos;
+               }
+               else
+               {
+                       // no action, cell is visible
+               }
        }
        
-       // TODO: Can the write position be equal to the end of screen?
-       ASSERTC(write_pos, <, limit);
-       
        switch(Ch)
        {
        case '\0':      // Ignore NULL byte
@@ -89,6 +112,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
        case '\n':
                VT_int_UpdateScreen( Term, 0 ); // Update the line before newlining
                write_pos += Term->TextWidth;
+               // TODO: Scroll display down if needed
        case '\r':
                write_pos -= write_pos % Term->TextWidth;
                break;
@@ -135,43 +159,8 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                break;
        }
        
-       if(Term->Flags & VT_FLAG_ALTBUF)
-       {
-               Term->AltWritePos = write_pos;
-               
-               if(Term->AltWritePos >= limit)
-               {
-                       Term->AltWritePos -= Term->TextWidth;
-                       VT_int_ScrollText(Term, 1);
-               }
-       }
-       else
-       {
-               Term->WritePos = write_pos;
-               // Move Screen
-               // - Check if we need to scroll the entire scrollback buffer
-               if(Term->WritePos >= limit)
-               {
-                        int    base;
-                       
-                       // Update view position
-                       base = Term->TextWidth*Term->TextHeight*(giVT_Scrollback);
-                       if(Term->ViewPos < base)
-                               Term->ViewPos += Term->Width;
-                       if(Term->ViewPos > base)
-                               Term->ViewPos = base;
-                       
-                       VT_int_ScrollText(Term, 1);
-                       Term->WritePos -= Term->TextWidth;
-               }
-               // Ok, so we only need to scroll the screen
-               else if(Term->WritePos >= Term->ViewPos + Term->TextWidth*Term->TextHeight)
-               {
-                       VT_int_ScrollFramebuffer( Term, 1 );
-                       
-                       Term->ViewPos += Term->TextWidth;
-               }
-       }
+       ASSERTC(write_pos, <=, limit);
+       *VT_int_GetWritePosPtr(Term) = write_pos;
 
        HEAP_VALIDATE();
        
@@ -181,26 +170,23 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
 void VT_int_ScrollText(tVTerm *Term, int Count)
 {
        tVT_Char        *buf;
-        int    *write_pos_ptr;
-        int    height;
         int    scroll_top, scroll_height;
        
        HEAP_VALIDATE();
 
        // Get buffer pointer and attributes    
+       size_t  height = VT_int_GetBufferRows(Term);
+       size_t  *write_pos_ptr = VT_int_GetWritePosPtr(Term);
+       
        if( Term->Flags & VT_FLAG_ALTBUF )
        {
                buf = Term->AltBuf;
-               height = Term->TextHeight;
-               write_pos_ptr = &Term->AltWritePos;
                scroll_top = Term->ScrollTop;
                scroll_height = Term->ScrollHeight;
        }
        else
        {
                buf = Term->Text;
-               height = Term->TextHeight*(giVT_Scrollback+1);
-               write_pos_ptr = &Term->WritePos;
                scroll_top = 0;
                scroll_height = height;
        }
@@ -286,7 +272,7 @@ void VT_int_ClearLine(tVTerm *Term, int Row)
 {
        HEAP_VALIDATE();
        
-       size_t  height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
+       size_t  height = VT_int_GetBufferRows(Term);
        tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
        ASSERTCR(Row, >=, 0, );
        ASSERTCR(Row, <, height, );
@@ -306,7 +292,7 @@ void VT_int_ClearInLine(tVTerm *Term, int Row, int FirstCol, int LastCol)
 {
        HEAP_VALIDATE();
        
-       size_t  height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
+       size_t  height = VT_int_GetBufferRows(Term);
        tVT_Char        *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
        ASSERTCR(Row, >=, 0, );
        ASSERTCR(Row, <, height, );
@@ -436,3 +422,13 @@ void VT_int_ToggleAltBuffer(tVTerm *Term, int Enabled)
        VT_int_UpdateScreen(Term, 1);
 }
 
+size_t *VT_int_GetWritePosPtr(tVTerm *Term)
+{
+       return ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
+}
+
+size_t VT_int_GetBufferRows(tVTerm *Term)
+{
+       return ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
+}
+

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