summaryrefslogtreecommitdiffstats
path: root/tty-keys.c
diff options
context:
space:
mode:
authornicm <nicm>2017-04-18 18:21:37 +0000
committernicm <nicm>2017-04-18 18:21:37 +0000
commit623e35f5946498d0e89127756fb49258f768a6d0 (patch)
tree0ed3f18a5f28719f2f9590379dca2f2863ff0688 /tty-keys.c
parentfb3c5efa503214b08cae72f89e73ed4eb1bf957c (diff)
Detect iTerm2 and use DECSLRM for it as well.
Diffstat (limited to 'tty-keys.c')
-rw-r--r--tty-keys.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/tty-keys.c b/tty-keys.c
index a011fcab..9cd61e19 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -46,6 +46,8 @@ static void tty_keys_callback(int, short, void *);
static int tty_keys_mouse(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_iterm2_version(struct tty *, const char *, size_t,
+ size_t *);
/* Default raw keys. */
struct tty_default_key_raw {
@@ -553,6 +555,17 @@ tty_keys_next(struct tty *tty)
goto partial_key;
}
+ /* Or a response from iTerm2? */
+ switch (tty_keys_iterm2_version(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)) {
case 0: /* yes */
@@ -912,3 +925,34 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
types[type]);
return (0);
}
+
+/*
+ * Handle a version response from iTerm2. Returns 0 for success, -1 for
+ * failure, 1 for partial.
+ */
+static int
+tty_keys_iterm2_version(struct tty *tty, const char *buf, size_t len,
+ size_t *size)
+{
+ struct client *c = tty->client;
+ u_int i;
+
+ *size = 0;
+
+ if (memcmp("\033[ITERM2 ", buf, (len > 9) ? 9 : len) != 0)
+ return (-1);
+ if (len < 10)
+ return (1);
+ for (i = 9; i < len; i++) {
+ if (buf[i] == 'n')
+ break;
+ }
+ if (i == len)
+ return (1);
+ *size = i + 1;
+
+ tty_set_type(tty, TTY_ITERM2);
+
+ log_debug("%s: this is iTerm2", c->name);
+ return (0);
+}