Support OSC 10 and 11 to set foreground and background colours, from
authornicm <nicm@openbsd.org>
Sun, 28 May 2017 23:23:40 +0000 (23:23 +0000)
committernicm <nicm@openbsd.org>
Sun, 28 May 2017 23:23:40 +0000 (23:23 +0000)
"bertnp" in GitHub issue 942.

usr.bin/tmux/input.c

index 0d2d8eb..54eb860 100644 (file)
@@ -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 <nicholas.marriott@gmail.com>
@@ -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)