mirror of
https://github.com/tmux/tmux.git
synced 2024-12-12 17:38:48 +00:00
Look for setrgbf and setrgbb terminfo extensions for RGB colour. This is
the most reasonable of the various (some bizarre) suggestions for capabilities.
This commit is contained in:
parent
aad4e4ddb1
commit
7eb496c00c
157
tmux.h
157
tmux.h
@ -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,
|
||||
|
20
tty-term.c
20
tty-term.c
@ -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)
|
||||
{
|
||||
|
30
tty.c
30
tty.c
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user