diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2020-01-12 22:00:21 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2020-01-12 22:00:21 +0000 |
commit | 270676d23a63568d3205a2fe696937f4ce608ce2 (patch) | |
tree | 0f8c0d3cf4a52564980eceb385a3b876933149b1 /usr.bin/tmux | |
parent | eaed6de2b0f3a5fa24216f02a247329be9f727cd (diff) |
Detect iTerm2 and enable DECSLRM.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r-- | usr.bin/tmux/tty-keys.c | 59 | ||||
-rw-r--r-- | usr.bin/tmux/tty.c | 4 |
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; |