diff options
author | 2011-05-20 19:03:58 +0000 | |
---|---|---|
committer | 2011-05-20 19:03:58 +0000 | |
commit | e417d1c041380aefdd3e131c1b9d0e8b1f82b725 (patch) | |
tree | adad5ee6f34c81a09c5b8feaeed98fefcf2deea4 /usr.bin/tmux/input.c | |
parent | Avoid panic'ing on a bad pointer passed in by callers of msgsnd; (diff) | |
download | wireguard-openbsd-e417d1c041380aefdd3e131c1b9d0e8b1f82b725.tar.xz wireguard-openbsd-e417d1c041380aefdd3e131c1b9d0e8b1f82b725.zip |
Support xterm(1) cursor colour change sequences through terminfo(5) Cc
(set) and Cr (reset) extensions. Originally by Sean Estabrooks, tweaked
by me and Ailin Nemui.
Diffstat (limited to 'usr.bin/tmux/input.c')
-rw-r--r-- | usr.bin/tmux/input.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/usr.bin/tmux/input.c b/usr.bin/tmux/input.c index 5cd01460385..c465df2efd8 100644 --- a/usr.bin/tmux/input.c +++ b/usr.bin/tmux/input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input.c,v 1.37 2011/03/07 23:46:27 nicm Exp $ */ +/* $OpenBSD: input.c,v 1.38 2011/05/20 19:03:58 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1445,17 +1445,39 @@ input_enter_osc(struct input_ctx *ictx) void input_exit_osc(struct input_ctx *ictx) { - if (ictx->flags & INPUT_DISCARD) - return; - log_debug("%s: \"%s\"", __func__, ictx->input_buf); + u_char *p = ictx->input_buf; + int option; - if (ictx->input_len < 2 || ictx->input_buf[1] != ';') + if (ictx->flags & INPUT_DISCARD) return; - if (ictx->input_buf[0] != '0' && ictx->input_buf[0] != '2') + if (ictx->input_len < 1 || *p < '0' || *p > '9') return; - screen_set_title(ictx->ctx.s, ictx->input_buf + 2); - server_status_window(ictx->wp->window); + log_debug("%s: \"%s\"", __func__, p); + + option = 0; + while (*p >= '0' && *p <= '9') + option = option * 10 + *p++ - '0'; + if (*p == ';') + p++; + + switch (option) { + case 0: + case 2: + screen_set_title(ictx->ctx.s, p); + server_status_window(ictx->wp->window); + break; + case 12: + screen_set_cursor_colour(ictx->ctx.s, p); + break; + case 112: + if (*p == '\0') /* No arguments allowed. */ + screen_set_cursor_colour(ictx->ctx.s, ""); + break; + default: + log_debug("%s: unknown '%u'", __func__, option); + break; + } } /* APC string started. */ |