emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3] Let user turn 24-bit terminal colors on.


From: Filipe Silva
Subject: Re: [PATCH 3/3] Let user turn 24-bit terminal colors on.
Date: Sun, 12 Feb 2017 16:00:19 -0200

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 <address@hidden> wrote:
From: Rami Ylimäki <address@hidden>

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]