From 8dd2f0da3f9fbb6a08aa1438c83e0c9a1b7f4565 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 4 Jun 2009 14:15:50 +0000 Subject: [PATCH] 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. --- input.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/input.c b/input.c index c635a842..07e6db0b 100644 --- a/input.c +++ b/input.c @@ -394,15 +394,28 @@ input_state_sequence_first(u_char ch, struct input_ctx *ictx) ictx->private = '\0'; ARRAY_CLEAR(&ictx->args); + /* 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); - if (INPUT_PARAMETER(ch)) { - input_new_argument(ictx); - if (ch >= 0x3c && ch <= 0x3f) { - /* Private control sequence. */ - ictx->private = ch; - return; - } + /* 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;