// Set cursor position
case 'H':
if( Term->Flags & VT_FLAG_ALTBUF )
- Term->AltWritePos = args[0] + args[1]*Term->TextWidth;
+ Term->AltWritePos = args[1] + args[0]*Term->TextWidth;
else
- Term->WritePos = args[0] + args[1]*Term->TextWidth;
+ Term->WritePos = args[1] + args[0]*Term->TextWidth;
//Log_Debug("VTerm", "args = {%i, %i}", args[0], args[1]);
break;
-
// Scroll up `n` lines
case 'S':
tmp = -1;
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--; )
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;
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)
//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 ++;
// 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 )
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");
{
}
//Log_Debug("VTerm", "j = %i, Buffer = '%s'", j, Buffer);
- return j;
+ Term->EscapeCodeLen = 0;
+ return j-ofs;
}