summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/tty-keys.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2020-01-13 08:12:53 +0000
committernicm <nicm@openbsd.org>2020-01-13 08:12:53 +0000
commit6648e05c361782d3305dd00273b5cede027dc497 (patch)
tree9655e0d11b14080ada4b81adaca076b97a7e3701 /usr.bin/tmux/tty-keys.c
parentTreat plausible but invalid keys (like C-BSpace) as literal like any (diff)
downloadwireguard-openbsd-6648e05c361782d3305dd00273b5cede027dc497.tar.xz
wireguard-openbsd-6648e05c361782d3305dd00273b5cede027dc497.zip
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 'usr.bin/tmux/tty-keys.c')
-rw-r--r--usr.bin/tmux/tty-keys.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/usr.bin/tmux/tty-keys.c b/usr.bin/tmux/tty-keys.c
index 7fdc23ceb2a..3075acb51bf 100644
--- a/usr.bin/tmux/tty-keys.c
+++ b/usr.bin/tmux/tty-keys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty-keys.c,v 1.119 2020/01/12 22:00:20 nicm Exp $ */
+/* $OpenBSD: tty-keys.c,v 1.120 2020/01/13 08:12:53 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);
}