git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Usermode/GUI Terminal - Fixed some crashes and implimentation issues
[tpg/acess2.git]
/
Usermode
/
Applications
/
gui_terminal_src
/
vt100.c
diff --git
a/Usermode/Applications/gui_terminal_src/vt100.c
b/Usermode/Applications/gui_terminal_src/vt100.c
index
cad4119
..
69296bd
100644
(file)
--- 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 <ctype.h> // isalpha
#include <acess/sys.h> // _SysDebug
#include "include/display.h"
#include <ctype.h> // isalpha
#include <acess/sys.h> // _SysDebug
+#include <assert.h>
const uint32_t caVT100Colours[] = {
// Black, Red, Green, Yellow, Blue, Purple, Cyan, Gray
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);
{
// 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);
memcpy(inc_buf + inc_len, Buf, new_bytes);
+ if( new_bytes == 0 ) {
+ inc_len = 0;
+ return 0;
+ }
+
inc_len += new_bytes;
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')
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;
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;
default:
ret = 2;
break;
@@
-59,17
+75,22
@@
int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
if( ret != 0 ) {
inc_len = 0;
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
}
ret -= old_inc_len; // counter cached bytes
}
+ else
+ ret = new_bytes;
return ret;
}
switch( *Buf )
{
case '\b':
return ret;
}
switch( *Buf )
{
case '\b':
- Display_MoveCursor(Term,
-1, 0
);
+ Display_MoveCursor(Term,
0, -1
);
Display_AddText(Term, 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':
// 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_Newline(Term, 1);
return 1;
case '\r':
- Display_MoveCursor(Term,
INT_MIN, 0
);
+ Display_MoveCursor(Term,
0, INT_MIN
);
return 1;
}
return 1;
}
@@
-140,8
+161,9
@@
int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
// Get Command
if( !isalpha(c) ) {
// Bother.
// 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 )
}
if( bQuestionMark )
@@
-184,15
+206,36
@@
int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
}
break;
case 'J':
}
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]);
_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;
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
case 'T': // Scroll down n=1
-
_SysDebug("TODO: \\x1B[nT - Scroll down"
);
+
Display_ScrollDown(Term, 1
);
break;
case 'm':
if( argc == 0 )
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':
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);
break;
default:
_SysDebug("Unknown VT100 long escape char 0x%x '%c'", c, c);
UCC
git Repository :: git.ucc.asn.au