Kernel/VTerm - Fix scroll in alt buffer
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_vt100.c
index ccb0c52..1399d7b 100644 (file)
@@ -5,7 +5,7 @@
  * drv/vterm_vt100.c
  * - Virtual Terminal - VT100 (Kinda) Emulation
  */
-#define DEBUG  0
+#define DEBUG  1
 #include "vterm.h"
 
 #define sTerminal      sVTerm
@@ -44,32 +44,33 @@ void Display_ScrollDown(tTerminal *Term, int CountDown)
        LOG("(%i)", CountDown);
        VT_int_UpdateScreen(Term, 0);
        if( Term->Flags & VT_FLAG_ALTBUF )
-               VT_int_ScrollText(Term, 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 )
@@ -82,22 +83,22 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
                // 
                if( RelCol < 0 )
                {
-                        int    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( RelRow < -currow )
@@ -108,47 +109,46 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
                        if( currow + RelRow > maxrows-1 )
                                RelRow = maxrows-1 - currow;
                }
-               *wrpos += RelRow*Term->TextWidth;
+               wrpos->Row += RelRow;
        }
-       LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
+       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)
 {
-       const int       wrpos = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltWritePos : Term->WritePos);
-       const int       row = wrpos / Term->TextWidth;
-       const int       col = wrpos % Term->TextWidth;
+       const tVT_Pos   *wrpos = VT_int_GetWritePosPtr(Term);
 
        LOG("(Dir=%i)", Dir);
 
        // Erase all
        if( Dir == 0 ) {
-               VT_int_ClearLine(Term, row);
+               VT_int_ClearLine(Term, wrpos->Row);
                VT_int_UpdateScreen(Term, 0);
        }
        // Erase to right
        else if( Dir == 1 ) {
-               VT_int_ClearInLine(Term, row, col, Term->TextWidth);
+               VT_int_ClearInLine(Term, wrpos->Row, wrpos->Col, Term->TextWidth);
                VT_int_UpdateScreen(Term, 0);
        }
        // Erase to left
        else if( Dir == -1 ) {
-               VT_int_ClearInLine(Term, row, 0, col);
+               VT_int_ClearInLine(Term, wrpos->Row, 0, wrpos->Col);
                VT_int_UpdateScreen(Term, 0);
        }
        else {
@@ -160,30 +160,31 @@ 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);
-        int    height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
+       tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+       size_t  height = VT_int_GetBufferRows(Term);
        
        // All
        if( Dir == 0 ) {
                
                if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
-                       Term->ViewPos = 0;
+                       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 ) {
-               for( int row = *wrpos / Term->TextWidth; row < height; row ++ )
+               for( int row = wrpos->Row; row < height; row ++ )
                        VT_int_ClearLine(Term, row);
                VT_int_UpdateScreen(Term, 1);
        }
        // Upwards
        else if( Dir == -1 ) {
-               for( int row = 0; row < *wrpos / Term->TextWidth; row ++ )
+               for( int row = 0; row < wrpos->Row; row ++ )
                        VT_int_ClearLine(Term, row);
                VT_int_UpdateScreen(Term, 1);
        }

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