summaryrefslogtreecommitdiffstats
path: root/tty-keys.c
diff options
context:
space:
mode:
authornicm <nicm>2020-01-13 08:12:53 +0000
committernicm <nicm>2020-01-13 08:12:53 +0000
commit835a6c0cf088437e318783c96b142c7dc26c290f (patch)
treec43c15d3f5df4d9e20351149ba2afd38243143d4 /tty-keys.c
parent04eee2410df4a85005c9562db13a1fec93d7c2e4 (diff)
Be more specific in the DSR we are looking for so it doesn't get
confused with mouse sequences. Also set a flag and don't bother checking for it if we have already seen it (same for DA), and don't check if we never asked for it.
Diffstat (limited to 'tty-keys.c')
-rw-r--r--tty-keys.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/tty-keys.c b/tty-keys.c
index 5054c424..968f67ca 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -1020,6 +1020,8 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
int flags = 0;
*size = 0;
+ if (tty->flags & TTY_HAVEDA)
+ return (-1);
/* First three bytes are always \033[?. */
if (buf[0] != '\033')
@@ -1064,7 +1066,10 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
for (i = 1; i < n; i++)
log_debug("%s: DA feature: %d", c->name, p[i]);
log_debug("%s: received DA %.*s", c->name, (int)*size, buf);
+
tty_set_flags(tty, flags);
+ tty->flags |= TTY_HAVEDA;
+
return (0);
}
@@ -1082,6 +1087,8 @@ tty_keys_device_status_report(struct tty *tty, const char *buf, size_t len,
int flags = 0;
*size = 0;
+ if (tty->flags & TTY_HAVEDSR)
+ return (-1);
/* First three bytes are always \033[. */
if (buf[0] != '\033')
@@ -1092,6 +1099,10 @@ tty_keys_device_status_report(struct tty *tty, const char *buf, size_t len,
return (-1);
if (len == 2)
return (1);
+ if (buf[2] != 'I')
+ return (-1);
+ if (len == 3)
+ return (1);
/* Copy the rest up to a 'n'. */
for (i = 0; i < (sizeof tmp) - 1 && buf[2 + i] != 'n'; i++) {
@@ -1108,6 +1119,9 @@ tty_keys_device_status_report(struct tty *tty, const char *buf, size_t len,
if (strncmp(tmp, "ITERM2 ", 7) == 0)
flags |= TERM_DECSLRM;
log_debug("%s: received DSR %.*s", c->name, (int)*size, buf);
+
tty_set_flags(tty, flags);
+ tty->flags |= TTY_HAVEDSR;
+
return (0);
}