From: nicm Date: Sun, 28 May 2017 23:23:40 +0000 (+0000) Subject: Support OSC 10 and 11 to set foreground and background colours, from X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=681fc18f1093037ee1a1bb2ca89e370e3643a28a;p=openbsd Support OSC 10 and 11 to set foreground and background colours, from "bertnp" in GitHub issue 942. --- diff --git a/usr.bin/tmux/input.c b/usr.bin/tmux/input.c index 0d2d8eba5e8..54eb8607675 100644 --- a/usr.bin/tmux/input.c +++ b/usr.bin/tmux/input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input.c,v 1.121 2017/05/12 13:00:56 nicm Exp $ */ +/* $OpenBSD: input.c,v 1.122 2017/05/28 23:23:40 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -110,6 +110,8 @@ static void input_set_state(struct window_pane *, static void input_reset_cell(struct input_ctx *); static void input_osc_4(struct window_pane *, const char *); +static void input_osc_10(struct window_pane *, const char *); +static void input_osc_11(struct window_pane *, const char *); static void input_osc_52(struct window_pane *, const char *); static void input_osc_104(struct window_pane *, const char *); @@ -1900,13 +1902,19 @@ input_exit_osc(struct input_ctx *ictx) case 4: input_osc_4(ictx->wp, p); break; - case 52: - input_osc_52(ictx->wp, p); + case 10: + input_osc_10(ictx->wp, p); + break; + case 11: + input_osc_11(ictx->wp, p); break; case 12: if (*p != '?') /* ? is colour request */ screen_set_cursor_colour(ictx->ctx.s, p); break; + case 52: + input_osc_52(ictx->wp, p); + break; case 104: input_osc_104(ictx->wp, p); break; @@ -2052,6 +2060,42 @@ bad: free(copy); } +/* Handle the OSC 10 sequence for setting background colour. */ +static void +input_osc_10(struct window_pane *wp, const char *p) +{ + u_int r, g, b; + + if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3) + goto bad; + + wp->colgc.fg = colour_join_rgb(r, g, b); + wp->flags |= PANE_REDRAW; + + return; + +bad: + log_debug("bad OSC 10: %s", p); +} + +/* Handle the OSC 11 sequence for setting background colour. */ +static void +input_osc_11(struct window_pane *wp, const char *p) +{ + u_int r, g, b; + + if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3) + goto bad; + + wp->colgc.bg = colour_join_rgb(r, g, b); + wp->flags |= PANE_REDRAW; + + return; + +bad: + log_debug("bad OSC 11: %s", p); +} + /* Handle the OSC 52 sequence for setting the clipboard. */ static void input_osc_52(struct window_pane *wp, const char *p)