Skip to content

Commit

Permalink
Support standard Terminfo direct mode terminals
Browse files Browse the repository at this point in the history
Latest Terminfo introduces terminal definitions that support direct
color mode.  The "Co"/"colors" capability is set to 0x1000000 on these
terminals and Emacs is already compatible with them.
However, if used Terminfo library hasn't been compiled with 32-bit
value support, "Co"/"colors" is truncated to 0x7fff.  In this case
direct color mode support can be detected from the "RGB" capability
flag.
There are some minor problems if the color count isn't corrected from
0x7fff.  First eight standard colors defined in xterm-standard-colors
are shown correctly.  However, their RGB values match the terminal
settings, not the RGB values defined in xterm-standard-colors.  Bright
versions of these colors are shown incorrectly.  They are interpreted
as pixels #8 - #15, which are very dark shades of blue.

* src/term.c (init_tty): Force terminal color count to 0x1000000 if
"RGB" capability is present.
* src/tparam.h: Define prototype for tigetflag.  (Bug#30308)

* doc/misc/efaq.texi (Colors on a TTY): Add information about direct
mode terminals supported by Terminfo.
  • Loading branch information
rylimaki authored and Eli-Zaretskii committed Feb 10, 2018
1 parent 6dcfdb1 commit 7f6153d
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 20 deletions.
45 changes: 27 additions & 18 deletions doc/misc/efaq.texi
Original file line number Diff line number Diff line change
Expand Up @@ -1496,32 +1496,41 @@ direct color mode is used. The capability strings are expected to
take one 24-bit pixel value as argument and transform the pixel to a
string that can be used to send 24-bit colors to the terminal.

There aren't yet any standard terminal type definitions that would
support the capabilities, but Emacs can be invoked with a custom
definition as shown below.
Standard terminal definitions don't support these capabilities and
therefore custom definition is needed.

@example
$ cat terminfo-24bit.src
$ cat terminfo-custom.src
# Use colon separators.
xterm-24bit|xterm with 24-bit direct color mode,
xterm-emacs|xterm with 24-bit direct color mode for Emacs,
use=xterm-256color,
setb24=\E[48:2:%p1%@{65536@}%/%d:%p1%@{256@}%/%@{255@}%&%d:%p1%@{255@}%&%dm,
setf24=\E[38:2:%p1%@{65536@}%/%d:%p1%@{256@}%/%@{255@}%&%d:%p1%@{255@}%&%dm,
# Use semicolon separators.
xterm-24bits|xterm with 24-bit direct color mode,
use=xterm-256color,
setb24=\E[48;2;%p1%@{65536@}%/%d;%p1%@{256@}%/%@{255@}%&%d;%p1%@{255@}%&%dm,
setf24=\E[38;2;%p1%@{65536@}%/%d;%p1%@{256@}%/%@{255@}%&%d;%p1%@{255@}%&%dm,
setb24=\E[48\:2\:\:%p1%@{65536@}%/%d\:%p1%@{256@}%/%@{255@}%&%d\:%p1%@{255@}%&%dm,
setf24=\E[38\:2\:\:%p1%@{65536@}%/%d\:%p1%@{256@}%/%@{255@}%&%d\:%p1%@{255@}%&%dm,
$ tic -x -o ~/.terminfo terminfo-custom.src
$ TERM=xterm-emacs emacs -nw
@end example

Emacs 27.1 and later support Terminfo capability @samp{RGB} for
detecting 24-bit direct color mode. Multiple standard terminal
definitions support this capability.

@example
$ TERM=xterm-direct infocmp | grep seta[bf]
$ tic -x -o ~/.terminfo terminfo-24bit.src
setab=\E[%?%p1%@{8@}%<%t4%p1%d%e48\:2\:\:%p1%@{65536@}%/%d\:%p1%@{256@}%/%@{255@}%&%d\:%p1%@{255@}%&%d%;m,
setaf=\E[%?%p1%@{8@}%<%t3%p1%d%e38\:2\:\:%p1%@{65536@}%/%d\:%p1%@{256@}%/%@{255@}%&%d\:%p1%@{255@}%&%d%;m,
$ TERM=xterm-24bit emacs -nw
$ TERM=xterm-direct emacs -nw
@end example

Currently there's no standard way to determine whether a terminal
supports direct color mode. If such standard arises later on, support
for @samp{setb24} and @samp{setf24} may be removed.
Terminals with @samp{RGB} capability treat pixels #000001 - #000007 as
indexed colors to maintain backward compatibility with applications
that are unaware of direct color mode. Therefore the seven darkest
blue shades may not be available. If this is a problem, you can
always use custom terminal definition with @samp{setb24} and
@samp{setf24}.

@node Debugging a customization file
@section How do I debug a @file{.emacs} file?
Expand Down
10 changes: 9 additions & 1 deletion src/term.c
Original file line number Diff line number Diff line change
Expand Up @@ -4144,10 +4144,10 @@ use the Bourne shell command 'TERM=...; export TERM' (C-shell:\n\
tty->TN_max_colors = tgetnum ("Co");

#ifdef TERMINFO
/* Non-standard support for 24-bit colors. */
{
const char *fg = tigetstr ("setf24");
const char *bg = tigetstr ("setb24");
/* Non-standard support for 24-bit colors. */
if (fg && bg
&& fg != (char *) (intptr_t) -1
&& bg != (char *) (intptr_t) -1)
Expand All @@ -4156,6 +4156,14 @@ use the Bourne shell command 'TERM=...; export TERM' (C-shell:\n\
tty->TS_set_background = bg;
tty->TN_max_colors = 16777216;
}
/* Standard support for 24-bit colors. */
else if (tigetflag ("RGB") > 0)
{
/* If the used Terminfo library supports only 16-bit
signed values, tgetnum("Co") and tigetnum("colors")
could return 32767. */
tty->TN_max_colors = 16777216;
}
}
#endif

Expand Down
3 changes: 2 additions & 1 deletion src/tparam.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ extern char *BC;
extern char *UP;

#ifdef TERMINFO
char *tigetstr(const char *);
int tigetflag (const char *);
char *tigetstr (const char *);
#endif

#endif /* EMACS_TPARAM_H */

0 comments on commit 7f6153d

Please sign in to comment.