X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Fgui_terminal_src%2Fvt100.c;h=6a2321ea7e91f88168ef81e50e333434229f7297;hb=845b6f9d90bb87b5e760e4d49aa93b0e003ab750;hp=4e7f70f4b6815166fdc2661b6ab3a31cccf935bf;hpb=573469df47d366903d780ca563c9f2da18f2bf62;p=tpg%2Facess2.git diff --git a/Usermode/Applications/gui_terminal_src/vt100.c b/Usermode/Applications/gui_terminal_src/vt100.c index 4e7f70f4..6a2321ea 100644 --- a/Usermode/Applications/gui_terminal_src/vt100.c +++ b/Usermode/Applications/gui_terminal_src/vt100.c @@ -17,6 +17,8 @@ # include # include // malloc/free +# define ASSERTC(a, r, b) assert(a r b) + static inline int MIN(int a, int b) { return a < b ? a : b; @@ -77,6 +79,14 @@ int _locate_eos(size_t Len, const char *Buf) return -1; } +/** + * \brief Detect and handle VT100/ANSI/xterm escape sequences + * \param Term Terminal handle (opaque) + * \param Len Number of avaliable bytes + * \param Buf Input buffer (\a Len bytes long) + * \return -ve : Number of bytes that should be sent to screen + * \return +ve/0 : Number of bytes consumed by this function + */ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) { tVT100State *st = Display_GetTermState(Term); @@ -162,7 +172,7 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) if( ret <= old_inc_len ) { _SysDebug("Term_HandleVT100: ret(%i) <= old_inc_len(%i), inc_len=%i, '%*C'", ret, old_inc_len, st->cache_len, st->cache_len, st->cache); - assert(ret > old_inc_len); + ASSERTC(ret, >, old_inc_len); } st->cache_len = 0; //_SysDebug("%i bytes of escape code '%.*s' (return %i)", @@ -178,11 +188,13 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) switch( *Buf ) { + case '\a': + // Alarm, aka bell + //Display_SoundBell(Term); + break; case '\b': // backspace is aprarently just supposed to cursor left (if possible) Display_MoveCursor(Term, 0, -1); - //Display_AddText(Term, 1, " "); - //Display_MoveCursor(Term, 0, -1); return 1; case '\t': // TODO: tab (get current cursor pos, space until multiple of 8) @@ -225,6 +237,11 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf) return -ret; } +/** + * \brief Handle an escape code beginning with '\x1b' + * \return 0 : Insufficient data in buffer, wait for more + * \return +ve : Number of bytes in escape sequence + */ int Term_HandleVT100_Short(tTerminal *Term, int Len, const char *Buf) { int tmp; @@ -310,6 +327,11 @@ int Term_HandleVT100_Short(tTerminal *Term, int Len, const char *Buf) } } +/** + * \brief Handle CSI escape sequences '\x1b[' + * \return 0 : insufficient data + * \return +ve : Number of bytes consumed + */ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) { tVT100State *st = Display_GetTermState(Term); @@ -426,9 +448,13 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) Display_MoveCursor(Term, 0, -(args[0] != 0 ? args[0] : 1)); break; case 'H': - if( argc != 2 ) { + if( argc == 0 ) { + Display_SetCursor(Term, 0, 0); } - else { + else if( argc == 1 ) { + Display_SetCursor(Term, args[0]-1, 0); + } + else if( argc == 2 ) { // Adjust 1-based cursor position to 0-based Display_SetCursor(Term, args[0]-1, args[1]-1); } @@ -466,10 +492,11 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) _SysDebug("Unknown VT100 %i K", args[0]); break; } - case 'S': // Scroll up n=1 + break; + case 'S': // Scroll text up n=1 (expose bottom) Display_ScrollDown(Term, -(argc >= 1 ? args[0] : 1)); break; - case 'T': // Scroll down n=1 + case 'T': // Scroll text down n=1 (expose top) Display_ScrollDown(Term, (argc >= 1 ? args[0] : 1)); break; case 'c': // Send Device Attributes @@ -512,6 +539,40 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) // Reset Display_ResetAttributes(Term); } + else if( args[0] == 48 ) + { + // ISO-8613-3 Background + if( args[1] == 2 ) { + uint32_t col = 0; + col |= (uint32_t)args[2] << 16; + col |= (uint32_t)args[3] << 8; + col |= (uint32_t)args[4] << 0; + Display_SetBackground(Term, col); + } + else if( args[1] == 5 ) { + _SysDebug("TODO: Support xterm palette BG %i", args[2]); + } + else { + _SysDebug("VT100 Unknown mode set \e[48;%im", args[1]); + } + } + else if( args[0] == 38 ) + { + // ISO-8613-3 Foreground + if( args[1] == 2 ) { + uint32_t col = 0; + col |= (uint32_t)args[2] << 16; + col |= (uint32_t)args[3] << 8; + col |= (uint32_t)args[4] << 0; + Display_SetForeground(Term, col); + } + else if( args[1] == 5 ) { + _SysDebug("TODO: Support xterm palette FG %i", args[2]); + } + else { + _SysDebug("VT100 Unknown mode set \e[38;%im", args[1]); + } + } else { for( int i = 0; i < argc; i ++ ) @@ -532,6 +593,9 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) case 4: _SysDebug("TODO: \\e[4m - Underscore"); break; + //case 5: + // _SysDebug("TODO: \\e[5m - Blink/bold"); + // break; case 7: _SysDebug("TODO: \\e[7m - Reverse"); break; @@ -553,6 +617,14 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer) st->CurBG = 0; Display_SetBackground( Term, caVT100Colours[ st->CurBG ] ); break; + case 90 ... 97: + st->CurFG = args[i]-90 + 8; + Display_SetForeground( Term, caVT100Colours[ st->CurBG ] ); + break;; + case 100 ... 107: + st->CurBG = args[i]-100 + 8; + Display_SetBackground( Term, caVT100Colours[ st->CurBG ] ); + break;; default: _SysDebug("Unknown mode set \\e[%im", args[i]); break; @@ -565,7 +637,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]-1, (args[1] - args[0])+1); break; case 's':