Kernel/VTerm - Why did I remove the redraw?
[tpg/acess2.git] / Kernel / drv / vterm.c
index 82eac3e..b4df6e3 100644 (file)
@@ -482,7 +482,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                        ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
                        pos ++;
                        term->InputRead ++;
-                       while(term->InputRead > MAX_INPUT_CHARS8)
+                       while(term->InputRead >= MAX_INPUT_CHARS8)
                                term->InputRead -= MAX_INPUT_CHARS8;
                }
                break;
@@ -495,8 +495,9 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                avail = term->InputWrite - term->InputRead;
                if(avail < 0)
                        avail += MAX_INPUT_CHARS32;
+               Length /= 4;
                if(avail > Length - pos)
-                       avail = Length/4 - pos;
+                       avail = Length - pos;
                
                codepoint_in = (void*)term->InputBuffer;
                codepoint_buf = Buffer;
@@ -506,7 +507,7 @@ Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                        codepoint_buf[pos] = codepoint_in[term->InputRead];
                        pos ++;
                        term->InputRead ++;
-                       while(term->InputRead > MAX_INPUT_CHARS32)
+                       while(term->InputRead >= MAX_INPUT_CHARS32)
                                term->InputRead -= MAX_INPUT_CHARS32;
                }
                pos *= 4;
@@ -874,7 +875,7 @@ void VT_SetTerminal(int ID)
        
        VT_int_UpdateCursor(gpVT_CurTerm, 1);
        // Update the screen
-//     VT_int_UpdateScreen(gpVT_CurTerm, 1);
+       VT_int_UpdateScreen(gpVT_CurTerm, 1);
 }
 
 /**
@@ -890,7 +891,7 @@ void VT_KBCallBack(Uint32 Codepoint)
 {
        tVTerm  *term = gpVT_CurTerm;
 
-       // Key Up
+       // Catch VT binds
        switch( Codepoint & KEY_ACTION_MASK )
        {
        case KEY_ACTION_RELEASE:
@@ -928,22 +929,30 @@ void VT_KBCallBack(Uint32 Codepoint)
                case KEY_F10:   VT_SetTerminal(9);      return;
                case KEY_F11:   VT_SetTerminal(10);     return;
                case KEY_F12:   VT_SetTerminal(11);     return;
+               }
+               
+               // Scrolling is only valid in text mode
+               if(gpVT_CurTerm->Mode != TERM_MODE_TEXT)
+                       break;
+               
+               switch(Codepoint & KEY_CODEPOINT_MASK)
+               {
                // Scrolling
                case KEY_PGUP:
                        if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF )
                                return ;
-                       if( gpVT_CurTerm->ViewPos > gpVT_CurTerm->Width )
-                               gpVT_CurTerm->ViewPos -= gpVT_CurTerm->Width;
-                       else
-                               gpVT_CurTerm->ViewPos = 0;
+                       gpVT_CurTerm->ViewPos = MAX(
+                               0,
+                               gpVT_CurTerm->ViewPos - gpVT_CurTerm->Width
+                               );
                        return;
                case KEY_PGDOWN:
                        if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF )
                                return ;
-                       if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback) )
-                               gpVT_CurTerm->ViewPos += gpVT_CurTerm->Width;
-                       else
-                               gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback);
+                       gpVT_CurTerm->ViewPos = MIN(
+                               gpVT_CurTerm->ViewPos + gpVT_CurTerm->Width,
+                               gpVT_CurTerm->Width * gpVT_CurTerm->Height*giVT_Scrollback
+                               );
                        return;
                }
                break;
@@ -1045,13 +1054,26 @@ void VT_KBCallBack(Uint32 Codepoint)
        {
                // Encode the raw key event
                Uint32  *raw_in = (void*)term->InputBuffer;
+       
+               #if 0
+               // Drop new keys
+               if( term->InputWrite == term->InputRead )
+                       return ;                
+               #endif
+
                raw_in[ term->InputWrite ] = Codepoint;
                term->InputWrite ++;
-               term->InputWrite %= MAX_INPUT_CHARS32;
+               if(term->InputWrite >= MAX_INPUT_CHARS32)
+                       term->InputWrite -= MAX_INPUT_CHARS32;
+               
+               #if 1
+               // TODO: Should old or new be dropped?
                if(term->InputRead == term->InputWrite) {
                        term->InputRead ++;
-                       term->InputRead %= MAX_INPUT_CHARS32;
+                       if( term->InputRead >= MAX_INPUT_CHARS32 )
+                               term->InputRead -= MAX_INPUT_CHARS32;
                }
+               #endif
        }
        
        VFS_MarkAvaliable(&term->Node, 1);
@@ -1316,6 +1338,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer)
                                        if(argc != 1)   break;
                                        switch(args[0])
                                        {
+                                       case 25:
+                                               Term->Flags &= ~VT_FLAG_HIDECSR;
+                                               break;
                                        case 1047:
                                                VT_int_ToggleAltBuffer(Term, 1);
                                                break;
@@ -1325,6 +1350,9 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer)
                                        if(argc != 1)   break;
                                        switch(args[0])
                                        {
+                                       case 25:
+                                               Term->Flags |= VT_FLAG_HIDECSR;
+                                               break;
                                        case 1047:
                                                VT_int_ToggleAltBuffer(Term, 0);
                                                break;

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