diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-06-04 14:15:51 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-06-04 14:15:51 +0000 |
commit | cc78740c4c7f38d6418b210b4dd4a0146b7760d0 (patch) | |
tree | 60744b21f27815b921a67172704cdf4326093421 | |
parent | 5edc6eca609208efbc59b5e5eedf726085440b2b (diff) |
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.
-rw-r--r-- | usr.bin/tmux/input.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/usr.bin/tmux/input.c b/usr.bin/tmux/input.c index 388e306bd08..a4557838aca 100644 --- a/usr.bin/tmux/input.c +++ b/usr.bin/tmux/input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input.c,v 1.3 2009/06/03 23:30:40 nicm Exp $ */ +/* $OpenBSD: input.c,v 1.4 2009/06/04 14:15:50 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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; |