Look for setrgbf and setrgbb terminfo extensions for RGB colour. This is
authornicm <nicm@openbsd.org>
Wed, 31 May 2017 08:43:44 +0000 (08:43 +0000)
committernicm <nicm@openbsd.org>
Wed, 31 May 2017 08:43:44 +0000 (08:43 +0000)
the most reasonable of the various (some bizarre) suggestions for
capabilities.

usr.bin/tmux/tmux.h
usr.bin/tmux/tty-term.c
usr.bin/tmux/tty.c

index a4c11b6..eca50eb 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.775 2017/05/30 21:44:59 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.776 2017/05/31 08:43:44 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -204,67 +204,67 @@ enum {
 /* Termcap codes. */
 enum tty_code_code {
        TTYC_AX = 0,
-       TTYC_ACSC,      /* acs_chars, ac */
-       TTYC_BCE,       /* back_color_erase, ut */
-       TTYC_BEL,       /* bell, bl */
-       TTYC_BLINK,     /* enter_blink_mode, mb */
-       TTYC_BOLD,      /* enter_bold_mode, md */
-       TTYC_CIVIS,     /* cursor_invisible, vi */
-       TTYC_CLEAR,     /* clear_screen, cl */
-       TTYC_CNORM,     /* cursor_normal, ve */
-       TTYC_COLORS,    /* max_colors, Co */
-       TTYC_CR,        /* restore cursor colour, Cr */
-       TTYC_CS,        /* set cursor colour, Cs */
-       TTYC_CSR,       /* change_scroll_region, cs */
-       TTYC_CUB,       /* parm_left_cursor, LE */
-       TTYC_CUB1,      /* cursor_left, le */
-       TTYC_CUD,       /* parm_down_cursor, DO */
-       TTYC_CUD1,      /* cursor_down, do */
-       TTYC_CUF,       /* parm_right_cursor, RI */
-       TTYC_CUF1,      /* cursor_right, nd */
-       TTYC_CUP,       /* cursor_address, cm */
-       TTYC_CUU,       /* parm_up_cursor, UP */
-       TTYC_CUU1,      /* cursor_up, up */
-       TTYC_CVVIS,     /* cursor_visible, vs */
-       TTYC_DCH,       /* parm_dch, DC */
-       TTYC_DCH1,      /* delete_character, dc */
-       TTYC_DIM,       /* enter_dim_mode, mh */
-       TTYC_DL,        /* parm_delete_line, DL */
-       TTYC_DL1,       /* delete_line, dl */
+       TTYC_ACSC,
+       TTYC_BCE,
+       TTYC_BEL,
+       TTYC_BLINK,
+       TTYC_BOLD,
+       TTYC_CIVIS,
+       TTYC_CLEAR,
+       TTYC_CNORM,
+       TTYC_COLORS,
+       TTYC_CR,
+       TTYC_CS,
+       TTYC_CSR,
+       TTYC_CUB,
+       TTYC_CUB1,
+       TTYC_CUD,
+       TTYC_CUD1,
+       TTYC_CUF,
+       TTYC_CUF1,
+       TTYC_CUP,
+       TTYC_CUU,
+       TTYC_CUU1,
+       TTYC_CVVIS,
+       TTYC_DCH,
+       TTYC_DCH1,
+       TTYC_DIM,
+       TTYC_DL,
+       TTYC_DL1,
        TTYC_E3,
-       TTYC_ECH,       /* erase_chars, ec */
-       TTYC_ED,        /* clr_eos, cd */
-       TTYC_EL,        /* clr_eol, ce */
-       TTYC_EL1,       /* clr_bol, cb */
-       TTYC_ENACS,     /* ena_acs, eA */
-       TTYC_FSL,       /* from_status_line, fsl */
-       TTYC_HOME,      /* cursor_home, ho */
-       TTYC_HPA,       /* column_address, ch */
-       TTYC_ICH,       /* parm_ich, IC */
-       TTYC_ICH1,      /* insert_character, ic */
-       TTYC_IL,        /* parm_insert_line, IL */
-       TTYC_IL1,       /* insert_line, il */
-       TTYC_INDN,      /* parm_index, indn */
-       TTYC_INVIS,     /* enter_secure_mode, mk */
-       TTYC_KCBT,      /* key_btab, kB */
-       TTYC_KCUB1,     /* key_left, kl */
-       TTYC_KCUD1,     /* key_down, kd */
-       TTYC_KCUF1,     /* key_right, kr */
-       TTYC_KCUU1,     /* key_up, ku */
+       TTYC_ECH,
+       TTYC_ED,
+       TTYC_EL,
+       TTYC_EL1,
+       TTYC_ENACS,
+       TTYC_FSL,
+       TTYC_HOME,
+       TTYC_HPA,
+       TTYC_ICH,
+       TTYC_ICH1,
+       TTYC_IL,
+       TTYC_IL1,
+       TTYC_INDN,
+       TTYC_INVIS,
+       TTYC_KCBT,
+       TTYC_KCUB1,
+       TTYC_KCUD1,
+       TTYC_KCUF1,
+       TTYC_KCUU1,
        TTYC_KDC2,
        TTYC_KDC3,
        TTYC_KDC4,
        TTYC_KDC5,
        TTYC_KDC6,
        TTYC_KDC7,
-       TTYC_KDCH1,     /* key_dc, kD */
+       TTYC_KDCH1,
        TTYC_KDN2,
        TTYC_KDN3,
        TTYC_KDN4,
        TTYC_KDN5,
        TTYC_KDN6,
        TTYC_KDN7,
-       TTYC_KEND,      /* key_end, ke */
+       TTYC_KEND,
        TTYC_KEND2,
        TTYC_KEND3,
        TTYC_KEND4,
@@ -340,29 +340,29 @@ enum tty_code_code {
        TTYC_KHOM5,
        TTYC_KHOM6,
        TTYC_KHOM7,
-       TTYC_KHOME,     /* key_home, kh */
+       TTYC_KHOME,
        TTYC_KIC2,
        TTYC_KIC3,
        TTYC_KIC4,
        TTYC_KIC5,
        TTYC_KIC6,
        TTYC_KIC7,
-       TTYC_KICH1,     /* key_ic, kI */
+       TTYC_KICH1,
        TTYC_KLFT2,
        TTYC_KLFT3,
        TTYC_KLFT4,
        TTYC_KLFT5,
        TTYC_KLFT6,
        TTYC_KLFT7,
-       TTYC_KMOUS,     /* key_mouse, Km */
-       TTYC_KNP,       /* key_npage, kN */
+       TTYC_KMOUS,
+       TTYC_KNP,
        TTYC_KNXT2,
        TTYC_KNXT3,
        TTYC_KNXT4,
        TTYC_KNXT5,
        TTYC_KNXT6,
        TTYC_KNXT7,
-       TTYC_KPP,       /* key_ppage, kP */
+       TTYC_KPP,
        TTYC_KPRV2,
        TTYC_KPRV3,
        TTYC_KPRV4,
@@ -381,31 +381,33 @@ enum tty_code_code {
        TTYC_KUP5,
        TTYC_KUP6,
        TTYC_KUP7,
-       TTYC_MS,        /* modify xterm(1) selection */
-       TTYC_OP,        /* orig_pair, op */
-       TTYC_REV,       /* enter_reverse_mode, mr */
-       TTYC_RI,        /* scroll_reverse, sr */
-       TTYC_RMACS,     /* exit_alt_charset_mode */
-       TTYC_RMCUP,     /* exit_ca_mode, te */
-       TTYC_RMKX,      /* keypad_local, ke */
-       TTYC_SE,        /* reset cursor style, Se */
-       TTYC_SETAB,     /* set_a_background, AB */
-       TTYC_SETAF,     /* set_a_foreground, AF */
-       TTYC_SGR0,      /* exit_attribute_mode, me */
-       TTYC_SITM,      /* enter_italics_mode, it */
-       TTYC_SMACS,     /* enter_alt_charset_mode, as */
-       TTYC_SMCUP,     /* enter_ca_mode, ti */
-       TTYC_SMKX,      /* keypad_xmit, ks */
-       TTYC_SMSO,      /* enter_standout_mode, so */
-       TTYC_SMUL,      /* enter_underline_mode, us */
+       TTYC_MS,
+       TTYC_OP,
+       TTYC_REV,
+       TTYC_RI,
+       TTYC_RMACS,
+       TTYC_RMCUP,
+       TTYC_RMKX,
+       TTYC_SE,
+       TTYC_SETAB,
+       TTYC_SETAF,
+       TTYC_SETRGBB,
+       TTYC_SETRGBF,
+       TTYC_SGR0,
+       TTYC_SITM,
+       TTYC_SMACS,
+       TTYC_SMCUP,
+       TTYC_SMKX,
+       TTYC_SMSO,
+       TTYC_SMUL,
        TTYC_SMXX,
-       TTYC_SS,        /* set cursor style, Ss */
-       TTYC_TC,        /* 24-bit "true" colour, Tc */
-       TTYC_TSL,       /* to_status_line, tsl */
+       TTYC_SS,
+       TTYC_TC,
+       TTYC_TSL,
        TTYC_U8,
-       TTYC_VPA,       /* row_address, cv */
-       TTYC_XENL,      /* eat_newline_glitch, xn */
-       TTYC_XT,        /* xterm(1)-compatible title, XT */
+       TTYC_VPA,
+       TTYC_XENL,
+       TTYC_XT,
 };
 
 /* Message codes. */
@@ -1648,6 +1650,7 @@ void      tty_cursor(struct tty *, u_int, u_int);
 void   tty_putcode(struct tty *, enum tty_code_code);
 void   tty_putcode1(struct tty *, enum tty_code_code, int);
 void   tty_putcode2(struct tty *, enum tty_code_code, int, int);
+void   tty_putcode3(struct tty *, enum tty_code_code, int, int, int);
 void   tty_putcode_ptr1(struct tty *, enum tty_code_code, const void *);
 void   tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *,
            const void *);
@@ -1702,6 +1705,8 @@ const char        *tty_term_string(struct tty_term *, enum tty_code_code);
 const char     *tty_term_string1(struct tty_term *, enum tty_code_code, int);
 const char     *tty_term_string2(struct tty_term *, enum tty_code_code, int,
                     int);
+const char     *tty_term_string3(struct tty_term *, enum tty_code_code, int,
+                    int, int);
 const char     *tty_term_ptr1(struct tty_term *, enum tty_code_code,
                     const void *);
 const char     *tty_term_ptr2(struct tty_term *, enum tty_code_code,
index 4918afd..1b07aef 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty-term.c,v 1.54 2017/05/15 16:44:04 nicm Exp $ */
+/* $OpenBSD: tty-term.c,v 1.55 2017/05/31 08:43:44 nicm Exp $ */
 
 /*
  * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -242,6 +242,8 @@ static const struct tty_term_code_entry tty_term_codes[] = {
        [TTYC_SE] = { TTYCODE_STRING, "Se" },
        [TTYC_SETAB] = { TTYCODE_STRING, "setab" },
        [TTYC_SETAF] = { TTYCODE_STRING, "setaf" },
+       [TTYC_SETRGBB] = { TTYCODE_STRING, "setrgbb" },
+       [TTYC_SETRGBF] = { TTYCODE_STRING, "setrgbf" },
        [TTYC_SGR0] = { TTYCODE_STRING, "sgr0" },
        [TTYC_SITM] = { TTYCODE_STRING, "sitm" },
        [TTYC_SMACS] = { TTYCODE_STRING, "smacs" },
@@ -521,6 +523,18 @@ tty_term_find(char *name, int fd, char **cause)
                code->type = TTYCODE_STRING;
        }
 
+       /* On terminals with RGB colour (TC), fill in setrgbf and setrgbb. */
+       if (tty_term_flag(term, TTYC_TC) &&
+           !tty_term_has(term, TTYC_SETRGBF) &&
+           !tty_term_has(term, TTYC_SETRGBB)) {
+               code = &term->codes[TTYC_SETRGBF];
+               code->value.string = xstrdup("\033[38;2;%p1%d;%p2%d;%p3%dm");
+               code->type = TTYCODE_STRING;
+               code = &term->codes[TTYC_SETRGBB];
+               code->value.string = xstrdup("\033[48;2;%p1%d;%p2%d;%p3%dm");
+               code->type = TTYCODE_STRING;
+       }
+
        return (term);
 
 error:
@@ -576,6 +590,12 @@ tty_term_string2(struct tty_term *term, enum tty_code_code code, int a, int b)
        return (tparm((char *) tty_term_string(term, code), a, b));
 }
 
+const char *
+tty_term_string3(struct tty_term *term, enum tty_code_code code, int a, int b, int c)
+{
+       return (tparm((char *) tty_term_string(term, code), a, b, c));
+}
+
 const char *
 tty_term_ptr1(struct tty_term *term, enum tty_code_code code, const void *a)
 {
index 0537223..1df7456 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.285 2017/05/15 16:44:04 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.286 2017/05/31 08:43:44 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -472,6 +472,14 @@ tty_putcode2(struct tty *tty, enum tty_code_code code, int a, int b)
        tty_puts(tty, tty_term_string2(tty->term, code, a, b));
 }
 
+void
+tty_putcode3(struct tty *tty, enum tty_code_code code, int a, int b, int c)
+{
+       if (a < 0 || b < 0 || c < 0)
+               return;
+       tty_puts(tty, tty_term_string3(tty->term, code, a, b, c));
+}
+
 void
 tty_putcode_ptr1(struct tty *tty, enum tty_code_code code, const void *a)
 {
@@ -1847,7 +1855,7 @@ tty_check_fg(struct tty *tty, const struct window_pane *wp,
        /* Is this a 24-bit colour? */
        if (gc->fg & COLOUR_FLAG_RGB) {
                /* Not a 24-bit terminal? Translate to 256-colour palette. */
-               if (!tty_term_flag(tty->term, TTYC_TC)) {
+               if (!tty_term_has(tty->term, TTYC_SETRGBF)) {
                        colour_split_rgb(gc->fg, &r, &g, &b);
                        gc->fg = colour_find_rgb(r, g, b);
                } else
@@ -1900,7 +1908,7 @@ tty_check_bg(struct tty *tty, const struct window_pane *wp,
        /* Is this a 24-bit colour? */
        if (gc->bg & COLOUR_FLAG_RGB) {
                /* Not a 24-bit terminal? Translate to 256-colour palette. */
-               if (!tty_term_flag(tty->term, TTYC_TC)) {
+               if (!tty_term_has(tty->term, TTYC_SETRGBB)) {
                        colour_split_rgb(gc->bg, &r, &g, &b);
                        gc->bg = colour_find_rgb(r, g, b);
                } else
@@ -2031,13 +2039,17 @@ tty_try_colour(struct tty *tty, int colour, const char *type)
        }
 
        if (colour & COLOUR_FLAG_RGB) {
-               if (!tty_term_flag(tty->term, TTYC_TC))
-                       return (-1);
-
-               colour_split_rgb(colour & 0xffffff, &r, &g, &b);
-               xsnprintf(s, sizeof s, "\033[%s;2;%hhu;%hhu;%hhum", type,
-                   r, g, b);
-               tty_puts(tty, s);
+               if (*type == '3') {
+                       if (!tty_term_has(tty->term, TTYC_SETRGBF))
+                               return (-1);
+                       colour_split_rgb(colour & 0xffffff, &r, &g, &b);
+                       tty_putcode3(tty, TTYC_SETRGBF, r, g, b);
+               } else {
+                       if (!tty_term_has(tty->term, TTYC_SETRGBB))
+                               return (-1);
+                       colour_split_rgb(colour & 0xffffff, &r, &g, &b);
+                       tty_putcode3(tty, TTYC_SETRGBB, r, g, b);
+               }
                return (0);
        }