Kernel/VTerm - VT100 emulation fixes exposed by dropbear+irssi
authorJohn Hodge <[email protected]>
Mon, 18 Nov 2013 06:36:37 +0000 (14:36 +0800)
committerJohn Hodge <[email protected]>
Mon, 18 Nov 2013 06:36:37 +0000 (14:36 +0800)
KernelLand/Kernel/drv/vterm_termbuf.c
KernelLand/Kernel/drv/vterm_vt100.c
Usermode/Applications/gui_terminal_src/vt100.c

index e3ddff1..1ce8051 100644 (file)
@@ -24,6 +24,7 @@ void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count)
                int esc_len = Term_HandleVT100(Term, Count - ofs, (const void*)(Buffer + ofs));
                if( esc_len < 0 ) {
                        esc_len = -esc_len;
+                       LOG("%i '%*c'", esc_len, esc_len, Buffer+ofs);
                        VT_int_PutRawString(Term, Buffer + ofs, esc_len);
                        //Debug("Raw string '%.*s'", esc_len, Buffer+ofs);
                }
index bab7802..5c2e35d 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
@@ -13,6 +13,7 @@
 
 void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
 {
+       LOG("'%.*s'", Length, UTF8Text);
        VT_int_PutRawString(Term, (const void*)UTF8Text, Length);
 }
 void Display_Newline(tTerminal *Term, bool bCarriageReturn)
@@ -63,7 +64,7 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
                // 
                if( RelCol < 0 )
                {
-                       size_t  avail = *wrpos % Term->TextWidth;
+                        int    avail = *wrpos % Term->TextWidth;
                        if( RelCol < -avail )
                                RelCol = -avail;
                }
@@ -81,8 +82,8 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
                 int    maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
                if( RelRow < 0 )
                {
-                       if( currow + RelRow < 0 )
-                               RelRow = currow;
+                       if( RelRow < -currow )
+                               RelRow = -currow;
                }
                else
                {
@@ -91,6 +92,7 @@ void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
                }
                *wrpos += RelRow*Term->TextWidth;
        }
+       LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
 }
 void Display_SaveCursor(tTerminal *Term)
 {
@@ -192,7 +194,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)
 {
index c1d5177..1c47381 100644 (file)
 #endif
 
 const uint32_t caVT100Colours[] = {
-       // Black, Red, Green, Yellow, Blue, Purple, Cyan, Gray
+       // Black,      Red,    Green,   Yellow,     Blue,  Magenta,     Cyan,      Gray
        // Same again, but bright
-       0x000000, 0x770000, 0x007700, 0x777700, 0x000077, 0x770077, 0x007777, 0xAAAAAAA,
-       0xCCCCCC, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFFF
+       0x000000, 0x770000, 0x007700, 0x777700, 0x000077, 0x770077, 0x007777, 0xAAAAAA,
+       0xCCCCCC, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF
 };
 
  int   Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buf);
@@ -46,6 +46,7 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
                memcpy(inc_buf + inc_len, Buf, new_bytes);
 
                if( new_bytes == 0 ) {
+                       _SysDebug("Term_HandleVT100: Hit max? (Len=%i)", Len);
                        inc_len = 0;
                        return 0;
                }
@@ -188,6 +189,9 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                case 'l':       // unset
                        switch(args[0])
                        {
+                       case  1:        // Aplication cursor keys
+                               _SysDebug("TODO: \\e[?1%c Application cursor keys", c);
+                               break;
                        case 25:        // Hide cursor
                                _SysDebug("TODO: \\e[?25%c Show/Hide cursor", c);
                                break;
@@ -209,6 +213,18 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                // Standard commands
                switch( c )
                {
+               case 'A':
+                       Display_MoveCursor(Term, -(argc >= 1 ? args[0] : 1), 0);
+                       break;
+               case 'B':
+                       Display_MoveCursor(Term, (argc >= 1 ? args[0] : 1), 0);
+                       break;
+               case 'C':
+                       Display_MoveCursor(Term, 0, (argc >= 1 ? args[0] : 1));
+                       break;
+               case 'D':
+                       Display_MoveCursor(Term, 0, -(argc >= 1 ? args[0] : 1));
+                       break;
                case 'H':
                        if( argc != 2 ) {
                        }
@@ -216,15 +232,17 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                                Display_SetCursor(Term, args[0], args[1]);
                        }
                        break;
-               case 'J':
+               case 'J':       // Clear lines
                        switch( args[0] )
                        {
                        case 0:
+                               Display_ClearLines(Term, 1);    // Down
+                               break;
                        case 1:
-                               _SysDebug("TODO: VT100 %i J", args[0]);
+                               Display_ClearLines(Term, -1);   // Up
                                break;
-                       case 2: // Everything
-                               Display_ClearLines(Term, 0);
+                       case 2:
+                               Display_ClearLines(Term, 0);    // All
                                break;
                        default:
                                _SysDebug("Unknown VT100 %i J", args[0]);
@@ -235,8 +253,10 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                        switch( args[0] )
                        {
                        case 0: // To EOL
+                               Display_ClearLine(Term, -1);
+                               break;
                        case 1: // To SOL
-                               _SysDebug("TODO: VT100 %i K", args[0]);
+                               Display_ClearLine(Term, 1);
                                break;
                        case 2:
                                Display_ClearLine(Term, 0);
@@ -245,8 +265,11 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                                _SysDebug("Unknown VT100 %i K", args[0]);
                                break;
                        }
+               case 'S':       // Scroll down n=1
+                       Display_ScrollDown(Term, -(argc >= 1 ? args[0] : 1));
+                       break;
                case 'T':       // Scroll down n=1
-                       Display_ScrollDown(Term, 1);
+                       Display_ScrollDown(Term, (argc >= 1 ? args[0] : 1));
                        break;
                case 'm':
                        if( argc == 0 )
@@ -263,13 +286,19 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                                        case 0:
                                                Display_ResetAttributes(Term);
                                                break;
+                                       case 1:
+                                               _SysDebug("TODO: VT100 \\e[1m - Bold");
+                                               break;
+                                       case 2:
+                                               _SysDebug("TODO: VT100 \\e[1m - Reverse");
+                                               break;
                                        case 30 ... 37:
                                                // TODO: Bold/bright
                                                Display_SetForeground( Term, caVT100Colours[ args[i]-30 ] );
                                                break;
                                        case 40 ... 47:
                                                // TODO: Bold/bright
-                                               Display_SetBackground( Term, caVT100Colours[ args[i]-30 ] );
+                                               Display_SetBackground( Term, caVT100Colours[ args[i]-40 ] );
                                                break;
                                        default:
                                                _SysDebug("TODO: VT100 \\e[%im", args[i]);
@@ -280,7 +309,7 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                        break;
                // Set scrolling region
                case 'r':
-                       Display_SetScrollArea(Term, args[0], args[1] - args[0]);
+                       Display_SetScrollArea(Term, args[0], (args[1] - args[0]));
                        break;
                
                case 's':

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