More input compatibility love. Support C0 within escape sequences, and the C0

control character VT (vertical tab, \013), which is treated as LF like
VT102. Makes another vttest happy.
This commit is contained in:
Nicholas Marriott 2009-06-04 14:15:50 +00:00
parent 0ba85cc326
commit 8dd2f0da3f

45
input.c
View File

@ -394,15 +394,28 @@ input_state_sequence_first(u_char ch, struct input_ctx *ictx)
ictx->private = '\0';
ARRAY_CLEAR(&ictx->args);
input_state(ictx, input_state_sequence_next);
if (INPUT_PARAMETER(ch)) {
input_new_argument(ictx);
if (ch >= 0x3c && ch <= 0x3f) {
/* Private control sequence. */
ictx->private = ch;
/* Most C0 control are accepted within CSI. */
if (INPUT_C0CONTROL(ch)) {
if (ch == 0x1b) { /* ESC */
/* Abort sequence and begin with new. */
input_state(ictx, input_state_escape);
} else if (ch != 0x18 && ch != 0x1a) { /* CAN and SUB */
/* Handle C0 immediately. */
input_handle_c0_control(ch, ictx);
}
/*
* Just come back to this state, in case the next character
* is the start of a private sequence.
*/
return;
}
input_state(ictx, input_state_sequence_next);
/* Private sequence: always the first character. */
if (ch >= 0x3c && ch <= 0x3f) {
ictx->private = ch;
return;
}
/* Pass character on directly. */
@ -423,6 +436,9 @@ input_state_sequence_next(u_char ch, struct input_ctx *ictx)
}
if (INPUT_PARAMETER(ch)) {
if (ARRAY_EMPTY(&ictx->args))
input_new_argument(ictx);
if (ch == ';') {
if (input_add_argument(ictx, '\0') != 0)
input_state(ictx, input_state_first);
@ -443,6 +459,18 @@ input_state_sequence_next(u_char ch, struct input_ctx *ictx)
return;
}
/* Most C0 control are accepted within CSI. */
if (INPUT_C0CONTROL(ch)) {
if (ch == 0x1b) { /* ESC */
/* Abort sequence and begin with new. */
input_state(ictx, input_state_escape);
} else if (ch != 0x18 && ch != 0x1a) { /* CAN and SUB */
/* Handle C0 immediately. */
input_handle_c0_control(ch, ictx);
}
return;
}
input_state(ictx, input_state_first);
}
@ -612,6 +640,9 @@ input_handle_c0_control(u_char ch, struct input_ctx *ictx)
}
screen_write_cursormove(&ictx->ctx, s->cx, s->cy);
break;
case '\013': /* VT */
screen_write_linefeed(&ictx->ctx);
break;
case '\016': /* SO */
ictx->cell.attr |= GRID_ATTR_CHARSET;
break;