summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-10-08 10:26:49 +0000
committered <ed@FreeBSD.org>2009-10-08 10:26:49 +0000
commitc13fa86fe325139aafcf4a6f4fb01b61792ba63b (patch)
treedec6c814949ad26e59f2f60fff269001547f4666
parent9fa7d8b89bc54e635e532fede4cf46c06ec0c45d (diff)
downloadFreeBSD-src-c13fa86fe325139aafcf4a6f4fb01b61792ba63b.zip
FreeBSD-src-c13fa86fe325139aafcf4a6f4fb01b61792ba63b.tar.gz
Discard Device Control Strings and Operating System Commands.
These strings often contain things like: - Window titles. - Extended key map functionality. - Color palette switching. We could look at these features in the future (if people consider them to be important enough), but we'd better discard them now. This fixes some artifacts people reported when using TERM=xterm. Reported by: des@, Paul B. Mahol
-rw-r--r--sys/teken/sequences1
-rw-r--r--sys/teken/teken.c19
-rw-r--r--sys/teken/teken_subr.h18
3 files changed, 35 insertions, 3 deletions
diff --git a/sys/teken/sequences b/sys/teken/sequences
index 957665a..cf720b0 100644
--- a/sys/teken/sequences
+++ b/sys/teken/sequences
@@ -88,6 +88,7 @@ ICH Insert character ^[ [ @ n
IL Insert line ^[ [ L n
IND Index ^[ D
NEL Next line ^[ E
+OSC Operating System Command ^[ ]
RI Reverse index ^[ M
RIS Reset to Initial State ^[ c
RM Reset Mode ^[ [ l r
diff --git a/sys/teken/teken.c b/sys/teken/teken.c
index c8d6b09..81b8ac0 100644
--- a/sys/teken/teken.c
+++ b/sys/teken/teken.c
@@ -56,6 +56,7 @@ static FILE *df;
#define TS_WRAPPED 0x10 /* Next character should be printed on col 0. */
#define TS_8BIT 0x20 /* UTF-8 disabled. */
#define TS_CONS25 0x40 /* cons25 emulation. */
+#define TS_INSTRING 0x80 /* Inside string. */
/* Character that blanks a cell. */
#define BLANK ' '
@@ -176,6 +177,24 @@ static void
teken_input_char(teken_t *t, teken_char_t c)
{
+ /*
+ * There is no support for DCS and OSC. Just discard strings
+ * until we receive characters that may indicate string
+ * termination.
+ */
+ if (t->t_stateflags & TS_INSTRING) {
+ switch (c) {
+ case '\x1B':
+ t->t_stateflags &= ~TS_INSTRING;
+ break;
+ case '\a':
+ t->t_stateflags &= ~TS_INSTRING;
+ return;
+ default:
+ return;
+ }
+ }
+
switch (c) {
case '\0':
break;
diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h
index b8ebcdc..ad10abb 100644
--- a/sys/teken/teken_subr.h
+++ b/sys/teken/teken_subr.h
@@ -425,10 +425,11 @@ teken_subr_delete_line(teken_t *t, unsigned int nrows)
}
static void
-teken_subr_device_control_string(teken_t *t __unused)
+teken_subr_device_control_string(teken_t *t)
{
- teken_printf("device control string???\n");
+ teken_printf("Unsupported device control string\n");
+ t->t_stateflags |= TS_INSTRING;
}
static void
@@ -744,6 +745,14 @@ teken_subr_next_line(teken_t *t)
}
static void
+teken_subr_operating_system_command(teken_t *t)
+{
+
+ teken_printf("Unsupported operating system command\n");
+ t->t_stateflags |= TS_INSTRING;
+}
+
+static void
teken_subr_pan_down(teken_t *t, unsigned int nrows)
{
@@ -1258,7 +1267,10 @@ static void
teken_subr_string_terminator(teken_t *t __unused)
{
- teken_printf("string terminator???\n");
+ /*
+ * Strings are already terminated in teken_input_char() when ^[
+ * is inserted.
+ */
}
static void
OpenPOWER on IntegriCloud