summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-06-04 14:15:51 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-06-04 14:15:51 +0000
commitcc78740c4c7f38d6418b210b4dd4a0146b7760d0 (patch)
tree60744b21f27815b921a67172704cdf4326093421 /usr.bin
parent5edc6eca609208efbc59b5e5eedf726085440b2b (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.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/input.c47
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;