Kernel/VTerm - Implemented \ec, reset settings
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_vt100.c
index d86ee0f..c054e75 100644 (file)
@@ -139,7 +139,6 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int
                        Term->WritePos = args[0] + args[1]*Term->TextWidth;
                //Log_Debug("VTerm", "args = {%i, %i}", args[0], args[1]);
                break;
-       
        // Scroll up `n` lines
        case 'S':
                tmp = -1;
@@ -158,7 +157,23 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int
                        Term->ViewPos += Term->TextWidth*tmp;
                }
                break;
-       
+       // Set Mode (?)
+       case 'h':
+               if( argc >= 1 )
+               {
+                       switch(args[0])
+                       {
+                       case 2: // Keyboard action mode
+                       case 4: // Insert mode
+                       case 12:        // Send/receive
+                       case 20:        // Automatic newline
+                               break;
+                       default:        // ?
+                               break;
+                       }
+               }
+               break;
+               
        // Set Font flags
        case 'm':
                for( ; argc--; )
@@ -188,6 +203,18 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int
                                Term->CurColour &= 0xFFFF8000;
                                Term->CurColour |= caVT100Colours[ colour_idx ];
                        }
+                       // Foreground Colour - bright
+                       else if(90 <= args[argc] && args[argc] <= 97 ) {
+                               colour_idx = args[argc]-90 + 8;
+                               Term->CurColour &= 0x8000FFFF;
+                               Term->CurColour |= (Uint32)caVT100Colours[ colour_idx ] << 16;
+                       }
+                       // Background Colour - bright
+                       else if(100 <= args[argc] && args[argc] <= 107 ) {
+                               colour_idx = args[argc]-100 + 8;
+                               Term->CurColour &= 0xFFFF8000;
+                               Term->CurColour |= (Uint32)caVT100Colours[ colour_idx ];
+                       }
                        else {
                                Log_Warning("VTerm", "Unknown font flag %i", args[argc]);
                        }
@@ -200,7 +227,19 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int
                Term->ScrollTop = args[0];
                Term->ScrollHeight = args[1] - args[0];
                break;
-       
+
+       // Save cursor position
+       case 's':
+               if( argc != 0 ) break;
+               Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
+               break;
+
+       // Restore saved cursor position
+       case 'u':
+               if( argc != 0 ) break;
+               *((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos) = Term->SavedWritePos;
+               break;
+
        default:
                Log_Warning("VTerm", "Unknown control sequence '\\x1B[%c'", CmdChar);
                break;
@@ -217,8 +256,24 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes)
         int    argc = 0, j = 0;
         int    args[6] = {0,0,0,0};
         int    bQuestionMark = 0;
+       const int       ofs = Term->EscapeCodeLen;
+       const int       sparespace = sizeof(Term->EscapeCodeCache)-Term->EscapeCodeLen;
+       const int       copysize = MIN(Bytes, sparespace);
 
-       if( Bytes == j )        return j;
+       memcpy( Term->EscapeCodeCache + Term->EscapeCodeLen, Buffer, copysize );
+       Term->EscapeCodeLen += copysize;
+       
+       Bytes = Term->EscapeCodeLen;
+       Buffer = Term->EscapeCodeCache;
+
+       if( Bytes == j )        return j-ofs;
+       c = Buffer[j++];
+       if(c != '\x1b') {
+               Term->EscapeCodeLen = 0;
+               return 0;
+       }
+
+       if( Bytes == j )        return j-ofs;
        c = Buffer[j++];
 
        switch(c)
@@ -226,24 +281,24 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes)
        //Large Code
        case '[':
                // Get Arguments
-               if(Bytes == j)  return j;
+               if(Bytes == j)  return j-ofs;
                c = Buffer[j++];
                if(c == '?') {
                        bQuestionMark = 1;
-                       if(Bytes == j)  return j;
+                       if(Bytes == j)  return j-ofs;
                        c = Buffer[j++];
                }
                if( '0' <= c && c <= '9' )
                {
                        do {
                                if(c == ';') {
-                                       if(Bytes == j)  return j;
+                                       if(Bytes == j)  return j-ofs;
                                        c = Buffer[j++];
                                }
                                while('0' <= c && c <= '9') {
                                        args[argc] *= 10;
                                        args[argc] += c-'0';
-                                       if(Bytes == j)  return j;
+                                       if(Bytes == j)  return j-ofs;
                                        c = Buffer[j++];
                                }
                                argc ++;
@@ -253,8 +308,10 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes)
                // Get Command
                if( !('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') )
                {
-                       // Error
-                       return j;
+                       // Error - eat ESC only?
+                       // > j : Entire code skipped
+                       Term->EscapeCodeLen = 0;
+                       return j-ofs;
                }
                
                if( bQuestionMark )
@@ -299,6 +356,12 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes)
        case '\0':
                // Ignore \0
                break;
+       // Reset all attributes
+       case 'c':
+               Term->CurColour = DEFAULT_COLOUR;
+               Term->Flags = 0;
+               Term->ScrollHeight = 0;
+               break;
        default:
                //Log_Notice("VTerm", "TODO: Handle short escape codes");
                {
@@ -313,5 +376,6 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes)
        }
        
        //Log_Debug("VTerm", "j = %i, Buffer = '%s'", j, Buffer);
-       return j;
+       Term->EscapeCodeLen = 0;
+       return j-ofs;
 }

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