summaryrefslogtreecommitdiff
path: root/usr.bin/tmux
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2020-01-12 22:00:21 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2020-01-12 22:00:21 +0000
commit270676d23a63568d3205a2fe696937f4ce608ce2 (patch)
tree0f8c0d3cf4a52564980eceb385a3b876933149b1 /usr.bin/tmux
parenteaed6de2b0f3a5fa24216f02a247329be9f727cd (diff)
Detect iTerm2 and enable DECSLRM.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r--usr.bin/tmux/tty-keys.c59
-rw-r--r--usr.bin/tmux/tty.c4
2 files changed, 60 insertions, 3 deletions
diff --git a/usr.bin/tmux/tty-keys.c b/usr.bin/tmux/tty-keys.c
index aed381eaf5d..7fdc23ceb2a 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.118 2020/01/12 21:07:07 nicm Exp $ */
+/* $OpenBSD: tty-keys.c,v 1.119 2020/01/12 22:00:20 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -52,6 +52,8 @@ static int tty_keys_clipboard(struct tty *, const char *, size_t,
size_t *);
static int tty_keys_device_attributes(struct tty *, const char *, size_t,
size_t *);
+static int tty_keys_device_status_report(struct tty *, const char *,
+ size_t, size_t *);
/* Default raw keys. */
struct tty_default_key_raw {
@@ -607,6 +609,17 @@ tty_keys_next(struct tty *tty)
goto partial_key;
}
+ /* Is this a device status report response? */
+ switch (tty_keys_device_status_report(tty, buf, len, &size)) {
+ case 0: /* yes */
+ key = KEYC_UNKNOWN;
+ goto complete_key;
+ case -1: /* no, or not valid */
+ break;
+ case 1: /* partial */
+ goto partial_key;
+ }
+
/* Is this a mouse key press? */
switch (tty_keys_mouse(tty, buf, len, &size, &m)) {
case 0: /* yes */
@@ -1054,3 +1067,47 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
tty_set_flags(tty, flags);
return (0);
}
+
+/*
+ * Handle device status report input. Returns 0 for success, -1 for failure, 1
+ * for partial.
+ */
+static int
+tty_keys_device_status_report(struct tty *tty, const char *buf, size_t len,
+ size_t *size)
+{
+ struct client *c = tty->client;
+ u_int i;
+ char tmp[64];
+ int flags = 0;
+
+ *size = 0;
+
+ /* First three bytes are always \033[. */
+ if (buf[0] != '\033')
+ return (-1);
+ if (len == 1)
+ return (1);
+ if (buf[1] != '[')
+ return (-1);
+ if (len == 2)
+ return (1);
+
+ /* Copy the rest up to a 'n'. */
+ for (i = 0; i < (sizeof tmp) - 1 && buf[2 + i] != 'n'; i++) {
+ if (2 + i == len)
+ return (1);
+ tmp[i] = buf[2 + i];
+ }
+ if (i == (sizeof tmp) - 1)
+ return (-1);
+ tmp[i] = '\0';
+ *size = 3 + i;
+
+ /* Set terminal flags. */
+ 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);
+ return (0);
+}
diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c
index 387627f884b..5178bd3ae4c 100644
--- a/usr.bin/tmux/tty.c
+++ b/usr.bin/tmux/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.337 2020/01/12 21:07:07 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.338 2020/01/12 22:00:20 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -327,7 +327,7 @@ tty_start_tty(struct tty *tty)
tty->flags |= TTY_FOCUS;
tty_puts(tty, "\033[?1004h");
}
- tty_puts(tty, "\033[c");
+ tty_puts(tty, "\033[c\033[1337n");
}
tty->flags |= TTY_STARTED;