X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Fgui_terminal_src%2Fvt100.c;h=69296bdb2615c1d782e5e6a09fe0edff7423df95;hb=9c7941ada7cdbcfbf995372436a91005ba943687;hp=cad4119494d3f705d7c705b5868cd59a0212df29;hpb=3a6a04204acae8bc2ccfce7d0be1f1ba75744bb5;p=tpg%2Facess2.git diff --git a/Usermode/Applications/gui_terminal_src/vt100.c b/Usermode/Applications/gui_terminal_src/vt100.c index cad41194..69296bdb 100644 --- a/Usermode/Applications/gui_terminal_src/vt100.c +++ b/Usermode/Applications/gui_terminal_src/vt100.c @@ -11,6 +11,7 @@ #include "include/display.h" #include // isalpha #include // _SysDebug +#include const uint32_t caVT100Colours[] = { // Black, Red, Green, Yellow, Blue, Purple, Cyan, Gray @@ -36,10 +37,17 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) { // Handle VT100 (like) escape sequence int new_bytes = min(MAX_VT100_ESCAPE_LEN - inc_len, Len); - int ret = 0, old_inc_len = inc_len; + int ret = 0; + int old_inc_len = inc_len; memcpy(inc_buf + inc_len, Buf, new_bytes); + if( new_bytes == 0 ) { + inc_len = 0; + return 0; + } + inc_len += new_bytes; + //_SysDebug("inc_buf = %i '%.*s'", inc_len, inc_len, inc_buf); if( inc_len <= 1 ) return 1; // Skip 1 character (the '\x1b') @@ -52,6 +60,14 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) ret += 2; } break; + case 'D': + Display_ScrollDown(Term, 1); + ret = 2; + break; + case 'M': + Display_ScrollDown(Term, -1); + ret = 2; + break; default: ret = 2; break; @@ -59,17 +75,22 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) if( ret != 0 ) { inc_len = 0; + assert(ret > old_inc_len); + //_SysDebug("%i bytes of escape code '%.*s' (return %i)", + // ret, ret, inc_buf, ret-old_inc_len); ret -= old_inc_len; // counter cached bytes } + else + ret = new_bytes; return ret; } switch( *Buf ) { case '\b': - Display_MoveCursor(Term, -1, 0); + Display_MoveCursor(Term, 0, -1); Display_AddText(Term, 1, " "); - Display_MoveCursor(Term, -1, 0); + Display_MoveCursor(Term, 0, -1); // TODO: Need to handle \t and ^A-Z return 1; case '\t': @@ -79,7 +100,7 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) Display_Newline(Term, 1); return 1; case '\r': - Display_MoveCursor(Term, INT_MIN, 0); + Display_MoveCursor(Term, 0, INT_MIN); return 1; } @@ -140,8 +161,9 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) // Get Command if( !isalpha(c) ) { // Bother. - _SysDebug("Unexpected char 0x%x in VT100 escape code", c); - return 1; + _SysDebug("Unexpected char 0x%x in VT100 escape code '\\e[%.*s'", c, + Len, Buffer); + return j; } if( bQuestionMark ) @@ -184,15 +206,36 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) } break; case 'J': - if( argc == 0 ) - Display_ClearLine(Term, 0); - else if( args[0] == 2 ) - Display_ClearLines(Term, 0); // Entire screen! - else + switch( args[0] ) + { + case 0: + case 1: _SysDebug("TODO: VT100 %i J", args[0]); + break; + case 2: // Everything + Display_ClearLines(Term, 0); + break; + default: + _SysDebug("Unknown VT100 %i J", args[0]); + break; + } break; + case 'K': + switch( args[0] ) + { + case 0: // To EOL + case 1: // To SOL + _SysDebug("TODO: VT100 %i K", args[0]); + break; + case 2: + Display_ClearLine(Term, 0); + break; + default: + _SysDebug("Unknown VT100 %i K", args[0]); + break; + } case 'T': // Scroll down n=1 - _SysDebug("TODO: \\x1B[nT - Scroll down"); + Display_ScrollDown(Term, 1); break; case 'm': if( argc == 0 ) @@ -223,8 +266,14 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) break; // Set scrolling region case 'r': - _SysDebug("TODO: \\x1B[%i;%ir - Set Scroll Region", - args[0], args[1]); + Display_SetScrollArea(Term, args[0], args[1]); + break; + + case 's': + Display_SaveCursor(Term); + break; + case 'u': + Display_RestoreCursor(Term); break; default: _SysDebug("Unknown VT100 long escape char 0x%x '%c'", c, c);