Thanks for this Rami, I've being itching to get 24 bit colors in terminal emacs for years. ​ On Sun, Feb 12, 2017 at 8:05 AM, Rami Ylimäki wrote: > From: Rami Ylimäki > > ITU-T T.412 9.1.4 and ITU-T T.416 13.1.8 specify control function for > changing terminal foreground and background colors. One possible format > for the control function parameters is: 2:n:r:g:b, where 2 is color > access mode indicating direct RGB space, n is an indentifier that gives > detailed information about the color space and r, g, b are the color > values. > > Most 24-bit terminals implement this function as 2;r;g;b. Color space > identifier has been omitted because of its complexity and rgb values are > assumed to be in range 0-255. Parameters are separated by semicolons > instead of colons for historical reasons. > > The terminfo database supports only indexed color control functions and > can't be used to determine whether a terminal has implemented direct > color control functions. > > However, this can be worked around by creating user defined functions > for setting 24-bit foreground and background colors. This can be done by > creating a terminfo source file with the required capabilities and > compiling a custom terminal type definition. > > For example: > > $ cat xterm-24bit > > # Replace semicolons with colons in setab24 and setaf24 on terminals > # that use ITU-T separators (iTerm2). A 24-bit integer (p1) is given > # as a parameter to the control functions which calculate rgb > # component values with following formulas: > # r = p1 / 65536, g = (p1 / 256) & 255, b = p1 & 255 > xterm-24bit|xterm with 16777216 colors, > use=xterm-256color, > setab24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm, > setaf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm, > > $ tic -x -o ~/.terminfo xterm-24bit > > $ TERM=xterm-24bit emacs > > * src/term.c (init_tty): Use 24-bit terminal colors if corresponding > foreground and background functions are present in terminal type > definition. > * src/tparam.h: Define prototype for tigetstr. > --- > src/term.c | 14 ++++++++++++++ > src/tparam.h | 4 ++++ > 2 files changed, 18 insertions(+) > > diff --git a/src/term.c b/src/term.c > index b0ff9cb..9d1c3c1 100644 > --- a/src/term.c > +++ b/src/term.c > @@ -4131,6 +4131,20 @@ use the Bourne shell command 'TERM=...; export > TERM' (C-shell:\n\ > > tty->TN_max_colors = tgetnum ("Co"); > > +#if TERMINFO > + /* Non-standard support for 24-bit colors. */ > + { > + const char* fg = tigetstr ("setaf24"); > + const char* bg = tigetstr ("setab24"); > + if (fg && bg && fg != (char *)-1 && bg != (char *)-1) > + { > + tty->TS_set_foreground = fg; > + tty->TS_set_background = bg; > + tty->TN_max_colors = 16777216; > + } > + } > +#endif > + > tty->TN_no_color_video = tgetnum ("NC"); > if (tty->TN_no_color_video == -1) > tty->TN_no_color_video = 0; > diff --git a/src/tparam.h b/src/tparam.h > index 15664d6..8e34c9e 100644 > --- a/src/tparam.h > +++ b/src/tparam.h > @@ -36,4 +36,8 @@ extern char PC; > extern char *BC; > extern char *UP; > > +#if TERMINFO > +char *tigetstr(const char *); > +#endif > + > #endif /* EMACS_TPARAM_H */ > -- > 2.7.4 > > >