patch 7.4.1770

Problem:    Cannot use true color in the terminal.
Solution:   Add the 'guicolors' option. (Nikolai Pavlov)
This commit is contained in:
Bram Moolenaar
2016-04-21 21:10:14 +02:00
parent 6d4431e7b6
commit 8a633e3427
19 changed files with 644 additions and 120 deletions

View File

@@ -1,4 +1,4 @@
*options.txt* For Vim version 7.4. Last change: 2016 Apr 20 *options.txt* For Vim version 7.4. Last change: 2016 Apr 21
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -3477,6 +3477,18 @@ A jump table for the options with a short description can be found at |Q_op|.
This option cannot be set from a |modeline| or in the |sandbox|, for This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons. security reasons.
*'guicolors'* *'gcol'*
'guicolors' 'gcol' boolean (default off)
global
{not in Vi}
{not available when compiled without the
|+termtruecolor| feature}
When on, uses |highlight-guifg| and |highlight-guibg| attributes in
the terminal (thus using 24-bit color). Requires a ISO-8613-3
compatible terminal.
If setting this option does not work (produces a colorless UI)
reading |xterm-true-color| might help.
*'guicursor'* *'gcr'* *E545* *E546* *E548* *E549* *'guicursor'* *'gcr'* *E545* *E546* *E548* *E549*
'guicursor' 'gcr' string (default "n-v-c:block-Cursor/lCursor, 'guicursor' 'gcr' string (default "n-v-c:block-Cursor/lCursor,
ve:ver35-Cursor, ve:ver35-Cursor,

View File

@@ -1,4 +1,4 @@
*term.txt* For Vim version 7.4. Last change: 2015 Nov 24 *term.txt* For Vim version 7.4. Last change: 2016 Apr 21
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -303,6 +303,10 @@ Added by Vim (there are no standard codes for these):
see |'ambiwidth'| see |'ambiwidth'|
t_RB request terminal background color *t_RB* *'t_RB'* t_RB request terminal background color *t_RB* *'t_RB'*
see |'ambiwidth'| see |'ambiwidth'|
t_8f set foreground color (R, G, B) *t_8f* *'t_8f'*
|xterm-true-color|
t_8b set background color (R, G, B) *t_8b* *'t_8b'*
|xterm-true-color|
KEY CODES KEY CODES
Note: Use the <> form if possible Note: Use the <> form if possible
@@ -419,6 +423,22 @@ VT220, etc.). The result is that codes like <xF1> are no longer needed.
Note: This is only done on startup. If the xterm options are changed after Note: This is only done on startup. If the xterm options are changed after
Vim has started, the escape sequences may not be recognized anymore. Vim has started, the escape sequences may not be recognized anymore.
*xterm-true-color*
Vim supports using true colors in the terminal (taken from |highlight-guifg|
and |highlight-guibg|), given that terminal supports this. To make this
work, 'guicolors' option needs to be set.
Sometimes setting 'guicolors' is not enough and one has to set the |t_8f| and
|t_8b| options explicitly. Default values of these options are
`^[[38;2;%lu;%lu;%lum` and `^[[48;2;%lu;%lu;%lum` (replace `^[` with real
escape) respectively, but it is only set when `$TERM` is `xterm`. Some
terminals accept the same sequences, but with all semicolons replaced by
colons (this is actually more compatible, but less widely supported). These
options contain printf strings, with |printf()| (actually, its C equivalent
hence `l` modifier) invoked with the t_ option value and three unsigned long
integers that may have any value between 0 and 255 (inclusive) representing
red, green and blue colors respectively.
*xterm-resize* *xterm-resize*
Window resizing with xterm only works if the allowWindowOps resource is Window resizing with xterm only works if the allowWindowOps resource is
enabled. On some systems and versions of xterm it's disabled by default enabled. On some systems and versions of xterm it's disabled by default

View File

@@ -424,6 +424,7 @@ m *+tcl* Tcl interface |tcl|
m *+tcl/dyn* Tcl interface |tcl-dynamic| |/dyn| m *+tcl/dyn* Tcl interface |tcl-dynamic| |/dyn|
*+terminfo* uses |terminfo| instead of termcap *+terminfo* uses |terminfo| instead of termcap
N *+termresponse* support for |t_RV| and |v:termresponse| N *+termresponse* support for |t_RV| and |v:termresponse|
m *+termtruecolor* 24-bit color in xterm-compatible terminals support
N *+textobjects* |text-objects| selection N *+textobjects* |text-objects| selection
*+tgetent* non-Unix only: able to use external termcap *+tgetent* non-Unix only: able to use external termcap
N *+timers* the |timer_start()| function N *+timers* the |timer_start()| function

18
src/auto/configure vendored
View File

@@ -810,6 +810,7 @@ with_tclsh
enable_rubyinterp enable_rubyinterp
with_ruby_command with_ruby_command
enable_cscope enable_cscope
enable_termtruecolor
enable_workshop enable_workshop
enable_netbeans enable_netbeans
enable_channel enable_channel
@@ -1476,6 +1477,7 @@ Optional Features:
--enable-tclinterp=OPTS Include Tcl interpreter. default=no OPTS=no/yes/dynamic --enable-tclinterp=OPTS Include Tcl interpreter. default=no OPTS=no/yes/dynamic
--enable-rubyinterp=OPTS Include Ruby interpreter. default=no OPTS=no/yes/dynamic --enable-rubyinterp=OPTS Include Ruby interpreter. default=no OPTS=no/yes/dynamic
--enable-cscope Include cscope interface. --enable-cscope Include cscope interface.
--enable-termtruecolor Include support for 24-bit colors in ISO-8613-3 compatible terminals
--enable-workshop Include Sun Visual Workshop support. --enable-workshop Include Sun Visual Workshop support.
--disable-netbeans Disable NetBeans integration support. --disable-netbeans Disable NetBeans integration support.
--disable-channel Disable process communication support. --disable-channel Disable process communication support.
@@ -7216,6 +7218,22 @@ if test "$enable_cscope" = "yes"; then
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-termtruecolor argument" >&5
$as_echo_n "checking --enable-termtruecolor argument... " >&6; }
# Check whether --enable-termtruecolor was given.
if test "${enable_termtruecolor+set}" = set; then :
enableval=$enable_termtruecolor;
else
enable_termtruecolor="no"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_termtruecolor" >&5
$as_echo "$enable_termtruecolor" >&6; }
if test "$enable_termtruecolor" = "yes"; then
$as_echo "#define FEAT_TERMTRUECOLOR 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-workshop argument" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-workshop argument" >&5
$as_echo_n "checking --enable-workshop argument... " >&6; } $as_echo_n "checking --enable-workshop argument... " >&6; }
# Check whether --enable-workshop was given. # Check whether --enable-workshop was given.

View File

@@ -362,6 +362,9 @@
/* Define for linking via dlopen() or LoadLibrary() */ /* Define for linking via dlopen() or LoadLibrary() */
#undef DYNAMIC_TCL #undef DYNAMIC_TCL
/* Define if you want 24-bit colors in ISO-8613-3 compatible terminals. */
#undef FEAT_TERMTRUECOLOR
/* Define if you want to add support for ACL */ /* Define if you want to add support for ACL */
#undef HAVE_POSIX_ACL #undef HAVE_POSIX_ACL
#undef HAVE_SOLARIS_ZFS_ACL #undef HAVE_SOLARIS_ZFS_ACL

View File

@@ -1926,6 +1926,15 @@ if test "$enable_cscope" = "yes"; then
AC_DEFINE(FEAT_CSCOPE) AC_DEFINE(FEAT_CSCOPE)
fi fi
AC_MSG_CHECKING(--enable-termtruecolor argument)
AC_ARG_ENABLE(termtruecolor,
[ --enable-termtruecolor Include support for 24-bit colors in ISO-8613-3 compatible terminals], ,
[enable_termtruecolor="no"])
AC_MSG_RESULT($enable_termtruecolor)
if test "$enable_termtruecolor" = "yes"; then
AC_DEFINE(FEAT_TERMTRUECOLOR)
fi
AC_MSG_CHECKING(--enable-workshop argument) AC_MSG_CHECKING(--enable-workshop argument)
AC_ARG_ENABLE(workshop, AC_ARG_ENABLE(workshop,
[ --enable-workshop Include Sun Visual Workshop support.], , [ --enable-workshop Include Sun Visual Workshop support.], ,

View File

@@ -14044,6 +14044,9 @@ f_has(typval_T *argvars, typval_T *rettv)
#ifdef FEAT_TERMRESPONSE #ifdef FEAT_TERMRESPONSE
"termresponse", "termresponse",
#endif #endif
#ifdef FEAT_TERMTRUECOLOR
"termtruecolor",
#endif
#ifdef FEAT_TEXTOBJ #ifdef FEAT_TEXTOBJ
"textobjects", "textobjects",
#endif #endif

View File

@@ -369,6 +369,10 @@ EXTERN char_u *use_gvimrc INIT(= NULL); /* "-U" cmdline argument */
EXTERN int cterm_normal_fg_color INIT(= 0); EXTERN int cterm_normal_fg_color INIT(= 0);
EXTERN int cterm_normal_fg_bold INIT(= 0); EXTERN int cterm_normal_fg_bold INIT(= 0);
EXTERN int cterm_normal_bg_color INIT(= 0); EXTERN int cterm_normal_bg_color INIT(= 0);
#ifdef FEAT_TERMTRUECOLOR
EXTERN long_u cterm_normal_fg_gui_color INIT(= INVALCOLOR);
EXTERN long_u cterm_normal_bg_gui_color INIT(= INVALCOLOR);
#endif
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */ EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */

View File

@@ -164,7 +164,7 @@ parse_printoptions(void)
#if (defined(FEAT_MBYTE) && defined(FEAT_POSTSCRIPT)) || defined(PROTO) #if (defined(FEAT_MBYTE) && defined(FEAT_POSTSCRIPT)) || defined(PROTO)
/* /*
* Parse 'printoptions' and set the flags in "printer_opts". * Parse 'printmbfont' and set the flags in "mbfont_opts".
* Returns an error message or NULL; * Returns an error message or NULL;
*/ */
char_u * char_u *
@@ -307,8 +307,8 @@ prt_get_attr(
pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL); pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL);
pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL); pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL);
# ifdef FEAT_GUI # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
if (gui.in_use) if (USE_24BIT)
{ {
bg_color = highlight_gui_color_rgb(hl_id, FALSE); bg_color = highlight_gui_color_rgb(hl_id, FALSE);
if (bg_color == PRCOLOR_BLACK) if (bg_color == PRCOLOR_BLACK)

View File

@@ -1303,6 +1303,15 @@ static struct vimoption options[] =
#else #else
(char_u *)NULL, PV_NONE, (char_u *)NULL, PV_NONE,
{(char_u *)NULL, (char_u *)0L} {(char_u *)NULL, (char_u *)0L}
#endif
SCRIPTID_INIT},
{"guicolors", "gcol", P_BOOL|P_VI_DEF|P_VIM|P_RCLR,
#ifdef FEAT_TERMTRUECOLOR
(char_u *)&p_guicolors, PV_NONE,
{(char_u *)FALSE, (char_u *)FALSE}
#else
(char_u*)NULL, PV_NONE,
{(char_u *)FALSE, (char_u *)FALSE}
#endif #endif
SCRIPTID_INIT}, SCRIPTID_INIT},
{"guicursor", "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, {"guicursor", "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
@@ -3011,6 +3020,8 @@ static struct vimoption options[] =
p_term("t_xs", T_XS) p_term("t_xs", T_XS)
p_term("t_ZH", T_CZH) p_term("t_ZH", T_CZH)
p_term("t_ZR", T_CZR) p_term("t_ZR", T_CZR)
p_term("t_8f", T_8F)
p_term("t_8b", T_8B)
/* terminal key codes are not in here */ /* terminal key codes are not in here */
@@ -8353,6 +8364,17 @@ set_bool_option(
#endif #endif
#ifdef FEAT_TERMTRUECOLOR
/* 'guicolors' */
else if ((int *)varp == &p_guicolors)
{
# ifdef FEAT_GUI
if (!gui.in_use && !gui.starting)
# endif
highlight_gui_started();
}
#endif
/* /*
* End of handling side effects for bool options. * End of handling side effects for bool options.
*/ */

View File

@@ -527,6 +527,9 @@ EXTERN char_u *p_popt; /* 'printoptions' */
EXTERN char_u *p_header; /* 'printheader' */ EXTERN char_u *p_header; /* 'printheader' */
#endif #endif
EXTERN int p_prompt; /* 'prompt' */ EXTERN int p_prompt; /* 'prompt' */
#ifdef FEAT_TERMTRUECOLOR
EXTERN int p_guicolors; /* 'guicolors' */
#endif
#ifdef FEAT_GUI #ifdef FEAT_GUI
EXTERN char_u *p_guifont; /* 'guifont' */ EXTERN char_u *p_guifont; /* 'guifont' */
# ifdef FEAT_XFONTSET # ifdef FEAT_XFONTSET

View File

@@ -1,4 +1,7 @@
/* term.c */ /* term.c */
guicolor_T termtrue_mch_get_color(char_u *name);
guicolor_T termtrue_get_color(char_u *name);
long_u termtrue_mch_get_rgb(guicolor_T color);
int set_termname(char_u *term); int set_termname(char_u *term);
void set_mouse_termcode(int n, char_u *s); void set_mouse_termcode(int n, char_u *s);
void del_mouse_termcode(int n); void del_mouse_termcode(int n);
@@ -22,6 +25,8 @@ void term_set_winpos(int x, int y);
void term_set_winsize(int width, int height); void term_set_winsize(int width, int height);
void term_fg_color(int n); void term_fg_color(int n);
void term_bg_color(int n); void term_bg_color(int n);
void term_fg_rgb_color(long_u rgb);
void term_bg_rgb_color(long_u rgb);
void term_settitle(char_u *title); void term_settitle(char_u *title);
void ttest(int pairs); void ttest(int pairs);
void add_long_to_buf(long_u val, char_u *dst); void add_long_to_buf(long_u val, char_u *dst);

View File

@@ -7828,7 +7828,7 @@ screen_start_highlight(int attr)
{ {
if (attr > HL_ALL) /* special HL attr. */ if (attr > HL_ALL) /* special HL attr. */
{ {
if (t_colors > 1) if (IS_CTERM)
aep = syn_cterm_attr2entry(attr); aep = syn_cterm_attr2entry(attr);
else else
aep = syn_term_attr2entry(attr); aep = syn_term_attr2entry(attr);
@@ -7839,8 +7839,16 @@ screen_start_highlight(int attr)
} }
if ((attr & HL_BOLD) && T_MD != NULL) /* bold */ if ((attr & HL_BOLD) && T_MD != NULL) /* bold */
out_str(T_MD); out_str(T_MD);
else if (aep != NULL && t_colors > 1 && aep->ae_u.cterm.fg_color else if (aep != NULL && cterm_normal_fg_bold &&
&& cterm_normal_fg_bold) #ifdef FEAT_TERMTRUECOLOR
(p_guicolors ?
(aep->ae_u.cterm.fg_rgb != INVALCOLOR):
#endif
(t_colors > 1 && aep->ae_u.cterm.fg_color)
#ifdef FEAT_TERMTRUECOLOR
)
#endif
)
/* If the Normal FG color has BOLD attribute and the new HL /* If the Normal FG color has BOLD attribute and the new HL
* has a FG color defined, clear BOLD. */ * has a FG color defined, clear BOLD. */
out_str(T_ME); out_str(T_ME);
@@ -7860,6 +7868,17 @@ screen_start_highlight(int attr)
*/ */
if (aep != NULL) if (aep != NULL)
{ {
#ifdef FEAT_TERMTRUECOLOR
if (p_guicolors)
{
if (aep->ae_u.cterm.fg_rgb != INVALCOLOR)
term_fg_rgb_color(aep->ae_u.cterm.fg_rgb);
if (aep->ae_u.cterm.bg_rgb != INVALCOLOR)
term_bg_rgb_color(aep->ae_u.cterm.bg_rgb);
}
else
#endif
{
if (t_colors > 1) if (t_colors > 1)
{ {
if (aep->ae_u.cterm.fg_color) if (aep->ae_u.cterm.fg_color)
@@ -7875,6 +7894,7 @@ screen_start_highlight(int attr)
} }
} }
} }
}
} }
void void
@@ -7904,14 +7924,23 @@ screen_stop_highlight(void)
{ {
attrentry_T *aep; attrentry_T *aep;
if (t_colors > 1) if (IS_CTERM)
{ {
/* /*
* Assume that t_me restores the original colors! * Assume that t_me restores the original colors!
*/ */
aep = syn_cterm_attr2entry(screen_attr); aep = syn_cterm_attr2entry(screen_attr);
if (aep != NULL && (aep->ae_u.cterm.fg_color if (aep != NULL &&
|| aep->ae_u.cterm.bg_color)) #ifdef FEAT_TERMTRUECOLOR
(p_guicolors ?
(aep->ae_u.cterm.fg_rgb != INVALCOLOR ||
aep->ae_u.cterm.bg_rgb != INVALCOLOR):
#endif
(aep->ae_u.cterm.fg_color || aep->ae_u.cterm.bg_color)
#ifdef FEAT_TERMTRUECOLOR
)
#endif
)
do_ME = TRUE; do_ME = TRUE;
} }
else else
@@ -7959,6 +7988,17 @@ screen_stop_highlight(void)
if (do_ME || (screen_attr & (HL_BOLD | HL_INVERSE))) if (do_ME || (screen_attr & (HL_BOLD | HL_INVERSE)))
out_str(T_ME); out_str(T_ME);
#ifdef FEAT_TERMTRUECOLOR
if (p_guicolors)
{
if (cterm_normal_fg_gui_color != INVALCOLOR)
term_fg_rgb_color(cterm_normal_fg_gui_color);
if (cterm_normal_bg_gui_color != INVALCOLOR)
term_bg_rgb_color(cterm_normal_bg_gui_color);
}
else
#endif
{
if (t_colors > 1) if (t_colors > 1)
{ {
/* set Normal cterm colors */ /* set Normal cterm colors */
@@ -7971,6 +8011,7 @@ screen_stop_highlight(void)
} }
} }
} }
}
screen_attr = 0; screen_attr = 0;
} }
@@ -7981,10 +8022,17 @@ screen_stop_highlight(void)
void void
reset_cterm_colors(void) reset_cterm_colors(void)
{ {
if (t_colors > 1) if (IS_CTERM)
{ {
/* set Normal cterm colors */ /* set Normal cterm colors */
#ifdef FEAT_TERMTRUECOLOR
if (p_guicolors ?
(cterm_normal_fg_gui_color != INVALCOLOR
|| cterm_normal_bg_gui_color != INVALCOLOR):
(cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0))
#else
if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0) if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0)
#endif
{ {
out_str(T_OP); out_str(T_OP);
screen_attr = -1; screen_attr = -1;
@@ -8228,7 +8276,7 @@ screen_fill(
#ifdef FEAT_GUI #ifdef FEAT_GUI
!gui.in_use && !gui.in_use &&
#endif #endif
t_colors <= 1); !IS_CTERM);
for (row = start_row; row < end_row; ++row) for (row = start_row; row < end_row; ++row)
{ {
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
@@ -8910,6 +8958,9 @@ can_clear(char_u *p)
return (*p != NUL && (t_colors <= 1 return (*p != NUL && (t_colors <= 1
#ifdef FEAT_GUI #ifdef FEAT_GUI
|| gui.in_use || gui.in_use
#endif
#ifdef FEAT_TERMTRUECOLOR
|| (p_guicolors && cterm_normal_bg_gui_color != INVALCOLOR)
#endif #endif
|| cterm_normal_bg_color == 0 || *T_UT != NUL)); || cterm_normal_bg_color == 0 || *T_UT != NUL));
} }
@@ -10241,6 +10292,9 @@ draw_tabline(void)
int use_sep_chars = (t_colors < 8 int use_sep_chars = (t_colors < 8
#ifdef FEAT_GUI #ifdef FEAT_GUI
&& !gui.in_use && !gui.in_use
#endif
#ifdef FEAT_TERMTRUECOLOR
&& !p_guicolors
#endif #endif
); );

View File

@@ -84,7 +84,9 @@ typedef struct file_buffer buf_T; /* forward declaration */
# ifdef FEAT_XCLIPBOARD # ifdef FEAT_XCLIPBOARD
# include <X11/Intrinsic.h> # include <X11/Intrinsic.h>
# endif # endif
# define guicolor_T int /* avoid error in prototypes */ # define guicolor_T long_u /* avoid error in prototypes and
* make FEAT_TERMTRUECOLOR work */
# define INVALCOLOR ((guicolor_T)0x1ffffff)
#endif #endif
/* /*
@@ -911,6 +913,10 @@ typedef struct attr_entry
/* These colors need to be > 8 bits to hold 256. */ /* These colors need to be > 8 bits to hold 256. */
short_u fg_color; /* foreground color number */ short_u fg_color; /* foreground color number */
short_u bg_color; /* background color number */ short_u bg_color; /* background color number */
# ifdef FEAT_TERMTRUECOLOR
long_u fg_rgb; /* foreground color RGB */
long_u bg_rgb; /* background color RGB */
# endif
} cterm; } cterm;
# ifdef FEAT_GUI # ifdef FEAT_GUI
struct struct

View File

@@ -33,10 +33,12 @@ struct hl_group
int sg_cterm_fg; /* terminal fg color number + 1 */ int sg_cterm_fg; /* terminal fg color number + 1 */
int sg_cterm_bg; /* terminal bg color number + 1 */ int sg_cterm_bg; /* terminal bg color number + 1 */
int sg_cterm_attr; /* Screen attr for color term mode */ int sg_cterm_attr; /* Screen attr for color term mode */
#ifdef FEAT_GUI
/* for when using the GUI */ /* for when using the GUI */
#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
guicolor_T sg_gui_fg; /* GUI foreground color handle */ guicolor_T sg_gui_fg; /* GUI foreground color handle */
guicolor_T sg_gui_bg; /* GUI background color handle */ guicolor_T sg_gui_bg; /* GUI background color handle */
#endif
#ifdef FEAT_GUI
guicolor_T sg_gui_sp; /* GUI special color handle */ guicolor_T sg_gui_sp; /* GUI special color handle */
GuiFont sg_font; /* GUI font handle */ GuiFont sg_font; /* GUI font handle */
#ifdef FEAT_XFONTSET #ifdef FEAT_XFONTSET
@@ -97,10 +99,12 @@ static int syn_list_header(int did_header, int outlen, int id);
static int hl_has_settings(int idx, int check_link); static int hl_has_settings(int idx, int check_link);
static void highlight_clear(int idx); static void highlight_clear(int idx);
#ifdef FEAT_GUI #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
static void gui_do_one_color(int idx, int do_menu, int do_tooltip); static void gui_do_one_color(int idx, int do_menu, int do_tooltip);
static int set_group_colors(char_u *name, guicolor_T *fgp, guicolor_T *bgp, int do_menu, int use_norm, int do_tooltip);
static guicolor_T color_name2handle(char_u *name); static guicolor_T color_name2handle(char_u *name);
#endif
#ifdef FEAT_GUI
static int set_group_colors(char_u *name, guicolor_T *fgp, guicolor_T *bgp, int do_menu, int use_norm, int do_tooltip);
static GuiFont font_name2handle(char_u *name); static GuiFont font_name2handle(char_u *name);
# ifdef FEAT_XFONTSET # ifdef FEAT_XFONTSET
static GuiFontset fontset_name2handle(char_u *name, int fixed_width); static GuiFontset fontset_name2handle(char_u *name, int fixed_width);
@@ -7333,8 +7337,8 @@ do_highlight(
for (idx = 0; idx < highlight_ga.ga_len; ++idx) for (idx = 0; idx < highlight_ga.ga_len; ++idx)
highlight_clear(idx); highlight_clear(idx);
init_highlight(TRUE, TRUE); init_highlight(TRUE, TRUE);
#ifdef FEAT_GUI #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
if (gui.in_use) if (USE_24BIT)
highlight_gui_started(); highlight_gui_started();
#endif #endif
highlight_changed(); highlight_changed();
@@ -7788,10 +7792,16 @@ do_highlight(
if (!init) if (!init)
HL_TABLE()[idx].sg_set |= SG_GUI; HL_TABLE()[idx].sg_set |= SG_GUI;
# ifdef FEAT_GUI # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
/* In GUI guifg colors are only used when recognized */ /* In GUI guifg colors are only used when recognized */
i = color_name2handle(arg); i = color_name2handle(arg);
if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use) if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0
# ifdef FEAT_GUI
|| !(USE_24BIT)
# else
|| !p_guicolors
# endif
)
{ {
HL_TABLE()[idx].sg_gui_fg = i; HL_TABLE()[idx].sg_gui_fg = i;
# endif # endif
@@ -7800,7 +7810,7 @@ do_highlight(
HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg); HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg);
else else
HL_TABLE()[idx].sg_gui_fg_name = NULL; HL_TABLE()[idx].sg_gui_fg_name = NULL;
# ifdef FEAT_GUI # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
# ifdef FEAT_GUI_X11 # ifdef FEAT_GUI_X11
if (is_menu_group) if (is_menu_group)
gui.menu_fg_pixel = i; gui.menu_fg_pixel = i;
@@ -7825,10 +7835,10 @@ do_highlight(
if (!init) if (!init)
HL_TABLE()[idx].sg_set |= SG_GUI; HL_TABLE()[idx].sg_set |= SG_GUI;
# ifdef FEAT_GUI # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
/* In GUI guifg colors are only used when recognized */ /* In GUI guifg colors are only used when recognized */
i = color_name2handle(arg); i = color_name2handle(arg);
if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use) if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !USE_24BIT)
{ {
HL_TABLE()[idx].sg_gui_bg = i; HL_TABLE()[idx].sg_gui_bg = i;
# endif # endif
@@ -7837,7 +7847,7 @@ do_highlight(
HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg); HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg);
else else
HL_TABLE()[idx].sg_gui_bg_name = NULL; HL_TABLE()[idx].sg_gui_bg_name = NULL;
# ifdef FEAT_GUI # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
# ifdef FEAT_GUI_X11 # ifdef FEAT_GUI_X11
if (is_menu_group) if (is_menu_group)
gui.menu_bg_pixel = i; gui.menu_bg_pixel = i;
@@ -7997,7 +8007,9 @@ do_highlight(
* Need to update all groups, because they might be using "bg" * Need to update all groups, because they might be using "bg"
* and/or "fg", which have been changed now. * and/or "fg", which have been changed now.
*/ */
if (gui.in_use) #endif
#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
if (USE_24BIT)
highlight_gui_started(); highlight_gui_started();
#endif #endif
} }
@@ -8068,6 +8080,10 @@ restore_cterm_colors(void)
cterm_normal_fg_color = 0; cterm_normal_fg_color = 0;
cterm_normal_fg_bold = 0; cterm_normal_fg_bold = 0;
cterm_normal_bg_color = 0; cterm_normal_bg_color = 0;
# ifdef FEAT_TERMTRUECOLOR
cterm_normal_fg_gui_color = INVALCOLOR;
cterm_normal_bg_gui_color = INVALCOLOR;
# endif
#endif #endif
} }
@@ -8118,9 +8134,11 @@ highlight_clear(int idx)
vim_free(HL_TABLE()[idx].sg_gui_sp_name); vim_free(HL_TABLE()[idx].sg_gui_sp_name);
HL_TABLE()[idx].sg_gui_sp_name = NULL; HL_TABLE()[idx].sg_gui_sp_name = NULL;
#endif #endif
#ifdef FEAT_GUI #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
HL_TABLE()[idx].sg_gui_fg = INVALCOLOR; HL_TABLE()[idx].sg_gui_fg = INVALCOLOR;
HL_TABLE()[idx].sg_gui_bg = INVALCOLOR; HL_TABLE()[idx].sg_gui_bg = INVALCOLOR;
#endif
#ifdef FEAT_GUI
HL_TABLE()[idx].sg_gui_sp = INVALCOLOR; HL_TABLE()[idx].sg_gui_sp = INVALCOLOR;
gui_mch_free_font(HL_TABLE()[idx].sg_font); gui_mch_free_font(HL_TABLE()[idx].sg_font);
HL_TABLE()[idx].sg_font = NOFONT; HL_TABLE()[idx].sg_font = NOFONT;
@@ -8140,7 +8158,7 @@ highlight_clear(int idx)
#endif #endif
} }
#if defined(FEAT_GUI) || defined(PROTO) #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
/* /*
* Set the normal foreground and background colors according to the "Normal" * Set the normal foreground and background colors according to the "Normal"
* highlighting group. For X11 also set "Menu", "Scrollbar", and * highlighting group. For X11 also set "Menu", "Scrollbar", and
@@ -8149,6 +8167,11 @@ highlight_clear(int idx)
void void
set_normal_colors(void) set_normal_colors(void)
{ {
#ifdef FEAT_GUI
# ifdef FEAT_TERMTRUECOLOR
if (gui.in_use)
# endif
{
if (set_group_colors((char_u *)"Normal", if (set_group_colors((char_u *)"Normal",
&gui.norm_pixel, &gui.back_pixel, &gui.norm_pixel, &gui.back_pixel,
FALSE, TRUE, FALSE)) FALSE, TRUE, FALSE))
@@ -8156,7 +8179,7 @@ set_normal_colors(void)
gui_mch_new_colors(); gui_mch_new_colors();
must_redraw = CLEAR; must_redraw = CLEAR;
} }
#ifdef FEAT_GUI_X11 # ifdef FEAT_GUI_X11
if (set_group_colors((char_u *)"Menu", if (set_group_colors((char_u *)"Menu",
&gui.menu_fg_pixel, &gui.menu_bg_pixel, &gui.menu_fg_pixel, &gui.menu_bg_pixel,
TRUE, FALSE, FALSE)) TRUE, FALSE, FALSE))
@@ -8176,7 +8199,7 @@ set_normal_colors(void)
# endif # endif
must_redraw = CLEAR; must_redraw = CLEAR;
} }
#endif # endif
if (set_group_colors((char_u *)"Scrollbar", if (set_group_colors((char_u *)"Scrollbar",
&gui.scroll_fg_pixel, &gui.scroll_bg_pixel, &gui.scroll_fg_pixel, &gui.scroll_bg_pixel,
FALSE, FALSE, FALSE)) FALSE, FALSE, FALSE))
@@ -8184,9 +8207,38 @@ set_normal_colors(void)
gui_new_scrollbar_colors(); gui_new_scrollbar_colors();
must_redraw = CLEAR; must_redraw = CLEAR;
} }
# endif
}
#endif
#ifdef FEAT_TERMTRUECOLOR
# ifdef FEAT_GUI
else
# endif
{
int idx;
idx = syn_name2id((char_u *)"Normal") - 1;
if (idx >= 0)
{
gui_do_one_color(idx, FALSE, FALSE);
if (HL_TABLE()[idx].sg_gui_fg != INVALCOLOR)
{
cterm_normal_fg_gui_color = HL_TABLE()[idx].sg_gui_fg;
must_redraw = CLEAR;
}
if (HL_TABLE()[idx].sg_gui_bg != INVALCOLOR)
{
cterm_normal_bg_gui_color = HL_TABLE()[idx].sg_gui_bg;
must_redraw = CLEAR;
}
}
}
#endif #endif
} }
#endif
#if defined(FEAT_GUI) || defined(PROTO)
/* /*
* Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar". * Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar".
*/ */
@@ -8298,24 +8350,6 @@ hl_set_fg_color_name(
} }
} }
/*
* Return the handle for a color name.
* Returns INVALCOLOR when failed.
*/
static guicolor_T
color_name2handle(char_u *name)
{
if (STRCMP(name, "NONE") == 0)
return INVALCOLOR;
if (STRICMP(name, "fg") == 0 || STRICMP(name, "foreground") == 0)
return gui.norm_pixel;
if (STRICMP(name, "bg") == 0 || STRICMP(name, "background") == 0)
return gui.back_pixel;
return gui_get_color(name);
}
/* /*
* Return the handle for a font name. * Return the handle for a font name.
* Returns NOFONT when failed. * Returns NOFONT when failed.
@@ -8439,6 +8473,52 @@ hl_do_font(
#endif /* FEAT_GUI */ #endif /* FEAT_GUI */
#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
/*
* Return the handle for a color name.
* Returns INVALCOLOR when failed.
*/
static guicolor_T
color_name2handle(char_u *name)
{
if (STRCMP(name, "NONE") == 0)
return INVALCOLOR;
if (STRICMP(name, "fg") == 0 || STRICMP(name, "foreground") == 0)
{
#if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI)
if (gui.in_use)
#endif
#ifdef FEAT_GUI
return gui.norm_pixel;
#endif
#if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI)
else
#endif
#ifdef FEAT_TERMTRUECOLOR
return cterm_normal_fg_gui_color;
#endif
}
if (STRICMP(name, "bg") == 0 || STRICMP(name, "background") == 0)
{
#if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI)
if (gui.in_use)
#endif
#ifdef FEAT_GUI
return gui.back_pixel;
#endif
#if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI)
else
#endif
#ifdef FEAT_TERMTRUECOLOR
return cterm_normal_bg_gui_color;
#endif
}
return GUI_GET_COLOR(name);
}
#endif
/* /*
* Table with the specifications for an attribute number. * Table with the specifications for an attribute number.
* Note that this table is used by ALL buffers. This is required because the * Note that this table is used by ALL buffers. This is required because the
@@ -8514,8 +8594,15 @@ get_attr_entry(garray_T *table, attrentry_T *aep)
&& aep->ae_u.cterm.fg_color && aep->ae_u.cterm.fg_color
== taep->ae_u.cterm.fg_color == taep->ae_u.cterm.fg_color
&& aep->ae_u.cterm.bg_color && aep->ae_u.cterm.bg_color
== taep->ae_u.cterm.bg_color) == taep->ae_u.cterm.bg_color
)) #ifdef FEAT_TERMTRUECOLOR
&& aep->ae_u.cterm.fg_rgb
== taep->ae_u.cterm.fg_rgb
&& aep->ae_u.cterm.bg_rgb
== taep->ae_u.cterm.bg_rgb
#endif
)))
return i + ATTR_OFF; return i + ATTR_OFF;
} }
@@ -8580,6 +8667,10 @@ get_attr_entry(garray_T *table, attrentry_T *aep)
{ {
taep->ae_u.cterm.fg_color = aep->ae_u.cterm.fg_color; taep->ae_u.cterm.fg_color = aep->ae_u.cterm.fg_color;
taep->ae_u.cterm.bg_color = aep->ae_u.cterm.bg_color; taep->ae_u.cterm.bg_color = aep->ae_u.cterm.bg_color;
#ifdef FEAT_TERMTRUECOLOR
taep->ae_u.cterm.fg_rgb = aep->ae_u.cterm.fg_rgb;
taep->ae_u.cterm.bg_rgb = aep->ae_u.cterm.bg_rgb;
#endif
} }
++table->ga_len; ++table->ga_len;
return (table->ga_len - 1 + ATTR_OFF); return (table->ga_len - 1 + ATTR_OFF);
@@ -8671,7 +8762,7 @@ hl_combine_attr(int char_attr, int prim_attr)
} }
#endif #endif
if (t_colors > 1) if (IS_CTERM)
{ {
if (char_attr > HL_ALL) if (char_attr > HL_ALL)
char_aep = syn_cterm_attr2entry(char_attr); char_aep = syn_cterm_attr2entry(char_attr);
@@ -8696,6 +8787,12 @@ hl_combine_attr(int char_attr, int prim_attr)
new_en.ae_u.cterm.fg_color = spell_aep->ae_u.cterm.fg_color; new_en.ae_u.cterm.fg_color = spell_aep->ae_u.cterm.fg_color;
if (spell_aep->ae_u.cterm.bg_color > 0) if (spell_aep->ae_u.cterm.bg_color > 0)
new_en.ae_u.cterm.bg_color = spell_aep->ae_u.cterm.bg_color; new_en.ae_u.cterm.bg_color = spell_aep->ae_u.cterm.bg_color;
#ifdef FEAT_TERMTRUECOLOR
if (spell_aep->ae_u.cterm.fg_rgb != INVALCOLOR)
new_en.ae_u.cterm.fg_rgb = spell_aep->ae_u.cterm.fg_rgb;
if (spell_aep->ae_u.cterm.bg_rgb != INVALCOLOR)
new_en.ae_u.cterm.bg_rgb = spell_aep->ae_u.cterm.bg_rgb;
#endif
} }
} }
return get_attr_entry(&cterm_attr_table, &new_en); return get_attr_entry(&cterm_attr_table, &new_en);
@@ -8757,7 +8854,7 @@ syn_attr2attr(int attr)
aep = syn_gui_attr2entry(attr); aep = syn_gui_attr2entry(attr);
else else
#endif #endif
if (t_colors > 1) if (IS_CTERM)
aep = syn_cterm_attr2entry(attr); aep = syn_cterm_attr2entry(attr);
else else
aep = syn_term_attr2entry(attr); aep = syn_term_attr2entry(attr);
@@ -8959,13 +9056,15 @@ highlight_color(
return NULL; return NULL;
if (modec == 'g') if (modec == 'g')
{ {
# if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
# ifdef FEAT_GUI # ifdef FEAT_GUI
/* return font name */ /* return font name */
if (font) if (font)
return HL_TABLE()[id - 1].sg_font_name; return HL_TABLE()[id - 1].sg_font_name;
# endif
/* return #RRGGBB form (only possible when GUI is running) */ /* return #RRGGBB form (only possible when GUI is running) */
if (gui.in_use && what[2] == '#') if ((USE_24BIT) && what[2] == '#')
{ {
guicolor_T color; guicolor_T color;
long_u rgb; long_u rgb;
@@ -8974,19 +9073,23 @@ highlight_color(
if (fg) if (fg)
color = HL_TABLE()[id - 1].sg_gui_fg; color = HL_TABLE()[id - 1].sg_gui_fg;
else if (sp) else if (sp)
# ifdef FEAT_GUI
color = HL_TABLE()[id - 1].sg_gui_sp; color = HL_TABLE()[id - 1].sg_gui_sp;
# else
color = INVALCOLOR;
# endif
else else
color = HL_TABLE()[id - 1].sg_gui_bg; color = HL_TABLE()[id - 1].sg_gui_bg;
if (color == INVALCOLOR) if (color == INVALCOLOR)
return NULL; return NULL;
rgb = gui_mch_get_rgb(color); rgb = GUI_MCH_GET_RGB(color);
sprintf((char *)buf, "#%02x%02x%02x", sprintf((char *)buf, "#%02x%02x%02x",
(unsigned)(rgb >> 16), (unsigned)(rgb >> 16),
(unsigned)(rgb >> 8) & 255, (unsigned)(rgb >> 8) & 255,
(unsigned)rgb & 255); (unsigned)rgb & 255);
return buf; return buf;
} }
#endif # endif
if (fg) if (fg)
return (HL_TABLE()[id - 1].sg_gui_fg_name); return (HL_TABLE()[id - 1].sg_gui_fg_name);
if (sp) if (sp)
@@ -9011,8 +9114,9 @@ highlight_color(
} }
#endif #endif
#if (defined(FEAT_SYN_HL) && defined(FEAT_GUI) && defined(FEAT_PRINTER)) \ #if (defined(FEAT_SYN_HL) \
|| defined(PROTO) && (defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)) \
&& defined(FEAT_PRINTER)) || defined(PROTO)
/* /*
* Return color name of highlight group "id" as RGB value. * Return color name of highlight group "id" as RGB value.
*/ */
@@ -9034,7 +9138,7 @@ highlight_gui_color_rgb(
if (color == INVALCOLOR) if (color == INVALCOLOR)
return 0L; return 0L;
return gui_mch_get_rgb(color); return GUI_MCH_GET_RGB(color);
} }
#endif #endif
@@ -9150,13 +9254,22 @@ set_hl_attr(
* For the color term mode: If there are other than "normal" * For the color term mode: If there are other than "normal"
* highlighting attributes, need to allocate an attr number. * highlighting attributes, need to allocate an attr number.
*/ */
if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0) if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0
# ifdef FEAT_TERMTRUECOLOR
&& sgp->sg_gui_fg == INVALCOLOR
&& sgp->sg_gui_bg == INVALCOLOR
# endif
)
sgp->sg_cterm_attr = sgp->sg_cterm; sgp->sg_cterm_attr = sgp->sg_cterm;
else else
{ {
at_en.ae_attr = sgp->sg_cterm; at_en.ae_attr = sgp->sg_cterm;
at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg; at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg;
at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg; at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg;
# ifdef FEAT_TERMTRUECOLOR
at_en.ae_u.cterm.fg_rgb = GUI_MCH_GET_RGB(sgp->sg_gui_fg);
at_en.ae_u.cterm.bg_rgb = GUI_MCH_GET_RGB(sgp->sg_gui_bg);
# endif
sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en); sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en);
} }
} }
@@ -9307,10 +9420,12 @@ syn_add_group(char_u *name)
vim_memset(&(HL_TABLE()[highlight_ga.ga_len]), 0, sizeof(struct hl_group)); vim_memset(&(HL_TABLE()[highlight_ga.ga_len]), 0, sizeof(struct hl_group));
HL_TABLE()[highlight_ga.ga_len].sg_name = name; HL_TABLE()[highlight_ga.ga_len].sg_name = name;
HL_TABLE()[highlight_ga.ga_len].sg_name_u = vim_strsave_up(name); HL_TABLE()[highlight_ga.ga_len].sg_name_u = vim_strsave_up(name);
#ifdef FEAT_GUI #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR;
HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR;
# ifdef FEAT_GUI
HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR;
# endif
#endif #endif
++highlight_ga.ga_len; ++highlight_ga.ga_len;
@@ -9349,7 +9464,7 @@ syn_id2attr(int hl_id)
attr = sgp->sg_gui_attr; attr = sgp->sg_gui_attr;
else else
#endif #endif
if (t_colors > 1) if (IS_CTERM)
attr = sgp->sg_cterm_attr; attr = sgp->sg_cterm_attr;
else else
attr = sgp->sg_term_attr; attr = sgp->sg_term_attr;
@@ -9403,7 +9518,7 @@ syn_get_final_id(int hl_id)
return hl_id; return hl_id;
} }
#ifdef FEAT_GUI #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
/* /*
* Call this function just after the GUI has started. * Call this function just after the GUI has started.
* It finds the font and color handles for the highlighting groups. * It finds the font and color handles for the highlighting groups.
@@ -9414,7 +9529,12 @@ highlight_gui_started(void)
int idx; int idx;
/* First get the colors from the "Normal" and "Menu" group, if set */ /* First get the colors from the "Normal" and "Menu" group, if set */
# if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)
# ifdef FEAT_TERMTRUECOLOR
if (USE_24BIT)
# endif
set_normal_colors(); set_normal_colors();
# endif
for (idx = 0; idx < highlight_ga.ga_len; ++idx) for (idx = 0; idx < highlight_ga.ga_len; ++idx)
gui_do_one_color(idx, FALSE, FALSE); gui_do_one_color(idx, FALSE, FALSE);
@@ -9430,12 +9550,17 @@ gui_do_one_color(
{ {
int didit = FALSE; int didit = FALSE;
# ifdef FEAT_GUI
# ifdef FEAT_TERMTRUECOLOR
if (gui.in_use)
# endif
if (HL_TABLE()[idx].sg_font_name != NULL) if (HL_TABLE()[idx].sg_font_name != NULL)
{ {
hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu,
do_tooltip, TRUE); do_tooltip, TRUE);
didit = TRUE; didit = TRUE;
} }
# endif
if (HL_TABLE()[idx].sg_gui_fg_name != NULL) if (HL_TABLE()[idx].sg_gui_fg_name != NULL)
{ {
HL_TABLE()[idx].sg_gui_fg = HL_TABLE()[idx].sg_gui_fg =
@@ -9448,16 +9573,17 @@ gui_do_one_color(
color_name2handle(HL_TABLE()[idx].sg_gui_bg_name); color_name2handle(HL_TABLE()[idx].sg_gui_bg_name);
didit = TRUE; didit = TRUE;
} }
# ifdef FEAT_GUI
if (HL_TABLE()[idx].sg_gui_sp_name != NULL) if (HL_TABLE()[idx].sg_gui_sp_name != NULL)
{ {
HL_TABLE()[idx].sg_gui_sp = HL_TABLE()[idx].sg_gui_sp =
color_name2handle(HL_TABLE()[idx].sg_gui_sp_name); color_name2handle(HL_TABLE()[idx].sg_gui_sp_name);
didit = TRUE; didit = TRUE;
} }
# endif
if (didit) /* need to get a new attr number */ if (didit) /* need to get a new attr number */
set_hl_attr(idx); set_hl_attr(idx);
} }
#endif #endif
/* /*

View File

@@ -77,6 +77,9 @@ struct builtin_term
static struct builtin_term *find_builtin_term(char_u *name); static struct builtin_term *find_builtin_term(char_u *name);
static void parse_builtin_tcap(char_u *s); static void parse_builtin_tcap(char_u *s);
static void term_color(char_u *s, int n); static void term_color(char_u *s, int n);
#ifdef FEAT_TERMTRUECOLOR
static void term_rgb_color(char_u *s, long_u rgb);
#endif
static void gather_termleader(void); static void gather_termleader(void);
#ifdef FEAT_TERMRESPONSE #ifdef FEAT_TERMRESPONSE
static void req_codes_from_term(void); static void req_codes_from_term(void);
@@ -382,9 +385,9 @@ static struct builtin_term builtin_termcaps[] =
# else # else
{(int)KS_CRI, "\033[%dC"}, {(int)KS_CRI, "\033[%dC"},
# endif # endif
#if defined(BEOS_DR8) # if defined(BEOS_DR8)
{(int)KS_DB, ""}, /* hack! see screen.c */ {(int)KS_DB, ""}, /* hack! see screen.c */
#endif # endif
{K_UP, "\033[A"}, {K_UP, "\033[A"},
{K_DOWN, "\033[B"}, {K_DOWN, "\033[B"},
@@ -790,8 +793,10 @@ static struct builtin_term builtin_termcaps[] =
# endif # endif
# endif # endif
# if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__) # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__) || defined(FEAT_TERMTRUECOLOR)
{(int)KS_NAME, "xterm"}, {(int)KS_NAME, "xterm"},
# endif
# if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__)
{(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")},
{(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")},
# ifdef TERMINFO # ifdef TERMINFO
@@ -939,6 +944,10 @@ static struct builtin_term builtin_termcaps[] =
{TERMCAP2KEY('F', 'Q'), IF_EB("\033[57;*~", ESC_STR "[57;*~")}, /* F36 */ {TERMCAP2KEY('F', 'Q'), IF_EB("\033[57;*~", ESC_STR "[57;*~")}, /* F36 */
{TERMCAP2KEY('F', 'R'), IF_EB("\033[58;*~", ESC_STR "[58;*~")}, /* F37 */ {TERMCAP2KEY('F', 'R'), IF_EB("\033[58;*~", ESC_STR "[58;*~")}, /* F37 */
# endif # endif
# ifdef FEAT_TERMTRUECOLOR
{(int)KS_8F, IF_EB("\033[38;2;%lu;%lu;%lum", ESC_STR "[38;2;%lu;%lu;%lum")},
{(int)KS_8B, IF_EB("\033[48;2;%lu;%lu;%lum", ESC_STR "[48;2;%lu;%lu;%lum")},
# endif
# if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS)
/* /*
@@ -1257,6 +1266,171 @@ static struct builtin_term builtin_termcaps[] =
}; /* end of builtin_termcaps */ }; /* end of builtin_termcaps */
#if defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
# define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
struct rgbcolor_table_S {
char_u *color_name;
guicolor_T color;
};
static struct rgbcolor_table_S rgb_table[] = {
{(char_u *)"black", RGB(0x00, 0x00, 0x00)},
{(char_u *)"blue", RGB(0x00, 0x00, 0xD4)},
{(char_u *)"brown", RGB(0x80, 0x40, 0x40)},
{(char_u *)"cyan", RGB(0x02, 0xAB, 0xEA)},
{(char_u *)"darkblue", RGB(0x00, 0x00, 0x80)},
{(char_u *)"darkcyan", RGB(0x00, 0x80, 0x80)},
{(char_u *)"darkgray", RGB(0x80, 0x80, 0x80)},
{(char_u *)"darkgreen", RGB(0x00, 0x80, 0x00)},
{(char_u *)"darkgrey", RGB(0x80, 0x80, 0x80)},
{(char_u *)"darkmagenta", RGB(0x80, 0x00, 0x80)},
{(char_u *)"darkred", RGB(0x80, 0x00, 0x00)},
{(char_u *)"darkyellow", RGB(0xBB, 0xBB, 0x00)},
{(char_u *)"gray", RGB(0xC0, 0xC0, 0xC0)},
{(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)},
{(char_u *)"gray20", RGB(0x33, 0x33, 0x33)},
{(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)},
{(char_u *)"gray40", RGB(0x66, 0x66, 0x66)},
{(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)},
{(char_u *)"gray60", RGB(0x99, 0x99, 0x99)},
{(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)},
{(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)},
{(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)},
{(char_u *)"green", RGB(0x00, 0x64, 0x11)},
{(char_u *)"grey", RGB(0xC0, 0xC0, 0xC0)},
{(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)},
{(char_u *)"grey20", RGB(0x33, 0x33, 0x33)},
{(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)},
{(char_u *)"grey40", RGB(0x66, 0x66, 0x66)},
{(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)},
{(char_u *)"grey60", RGB(0x99, 0x99, 0x99)},
{(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)},
{(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)},
{(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)},
{(char_u *)"lightblue", RGB(0xA0, 0xA0, 0xFF)},
{(char_u *)"lightcyan", RGB(0xA0, 0xFF, 0xFF)},
{(char_u *)"lightgray", RGB(0xE0, 0xE0, 0xE0)},
{(char_u *)"lightgreen", RGB(0xA0, 0xFF, 0xA0)},
{(char_u *)"lightgrey", RGB(0xE0, 0xE0, 0xE0)},
{(char_u *)"lightmagenta",RGB(0xF0, 0xA0, 0xF0)},
{(char_u *)"lightred", RGB(0xFF, 0xA0, 0xA0)},
{(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xA0)},
{(char_u *)"magenta", RGB(0xF2, 0x08, 0x84)},
{(char_u *)"orange", RGB(0xFC, 0x80, 0x00)},
{(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)},
{(char_u *)"red", RGB(0xDD, 0x08, 0x06)},
{(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)},
{(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)},
{(char_u *)"violet", RGB(0x8D, 0x38, 0xC9)},
{(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)},
{(char_u *)"yellow", RGB(0xFC, 0xF3, 0x05)},
};
static int
hex_digit(int c)
{
if (isdigit(c))
return c - '0';
c = TOLOWER_ASC(c);
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return 0x1ffffff;
}
guicolor_T
termtrue_mch_get_color(char_u *name)
{
guicolor_T color;
int i;
if (*name == '#' && strlen((char *) name) == 7)
{
color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])),
((hex_digit(name[3])<<4) + hex_digit(name[4])),
((hex_digit(name[5])<<4) + hex_digit(name[6])));
if (color > 0xffffff)
return INVALCOLOR;
return color;
}
else
{
/* Check if the name is one of the colors we know */
for (i = 0; i < sizeof(rgb_table) / sizeof(rgb_table[0]); i++)
if (STRICMP(name, rgb_table[i].color_name) == 0)
return rgb_table[i].color;
}
/*
* Last attempt. Look in the file "$VIM/rgb.txt".
*/
{
#define LINE_LEN 100
FILE *fd;
char line[LINE_LEN];
char_u *fname;
int r, g, b;
fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
if (fname == NULL)
return INVALCOLOR;
fd = fopen((char *)fname, "rt");
vim_free(fname);
if (fd == NULL)
return INVALCOLOR;
while (!feof(fd))
{
int len;
int pos;
char *color;
fgets(line, LINE_LEN, fd);
len = strlen(line);
if (len <= 1 || line[len-1] != '\n')
continue;
line[len-1] = '\0';
i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
if (i != 3)
continue;
color = line + pos;
if (STRICMP(color, name) == 0)
{
fclose(fd);
return (guicolor_T) RGB(r, g, b);
}
}
fclose(fd);
}
return INVALCOLOR;
}
guicolor_T
termtrue_get_color(char_u *name)
{
guicolor_T t;
if (*name == NUL)
return INVALCOLOR;
t = termtrue_mch_get_color(name);
if (t == INVALCOLOR)
EMSG2(_("E254: Cannot allocate color %s"), name);
return t;
}
long_u
termtrue_mch_get_rgb(guicolor_T color)
{
return (long_u) color;
}
#endif
/* /*
* DEFAULT_TERM is used, when no terminal is specified with -T option or $TERM. * DEFAULT_TERM is used, when no terminal is specified with -T option or $TERM.
*/ */
@@ -1512,6 +1686,7 @@ set_termname(char_u *term)
{KS_CWP, "WP"}, {KS_CWS, "WS"}, {KS_CWP, "WP"}, {KS_CWS, "WS"},
{KS_CSI, "SI"}, {KS_CEI, "EI"}, {KS_CSI, "SI"}, {KS_CEI, "EI"},
{KS_U7, "u7"}, {KS_RBG, "RB"}, {KS_U7, "u7"}, {KS_RBG, "RB"},
{KS_8F, "8f"}, {KS_8B, "8b"},
{(enum SpecialKey)0, NULL} {(enum SpecialKey)0, NULL}
}; };
@@ -2608,6 +2783,33 @@ term_color(char_u *s, int n)
OUT_STR(tgoto((char *)s, 0, n)); OUT_STR(tgoto((char *)s, 0, n));
} }
#if defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
void
term_fg_rgb_color(long_u rgb)
{
term_rgb_color(T_8F, rgb);
}
void
term_bg_rgb_color(long_u rgb)
{
term_rgb_color(T_8B, rgb);
}
#define RED(rgb) ((rgb>>16)&0xFF)
#define GREEN(rgb) ((rgb>> 8)&0xFF)
#define BLUE(rgb) ((rgb )&0xFF)
static void
term_rgb_color(char_u *s, long_u rgb)
{
char buf[7+3*3+2+1+1];
sprintf(buf, (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb));
OUT_STR(buf);
}
#endif
#if (defined(FEAT_TITLE) && (defined(UNIX) || defined(VMS) \ #if (defined(FEAT_TITLE) && (defined(UNIX) || defined(VMS) \
|| defined(MACOS_X))) || defined(PROTO) || defined(MACOS_X))) || defined(PROTO)
/* /*

View File

@@ -87,10 +87,12 @@ enum SpecialKey
KS_CSV, /* scroll region vertical */ KS_CSV, /* scroll region vertical */
#endif #endif
KS_OP, /* original color pair */ KS_OP, /* original color pair */
KS_U7 /* request cursor position */ KS_U7, /* request cursor position */
KS_8F, /* set foreground color (RGB) */
KS_8B /* set background color (RGB) */
}; };
#define KS_LAST KS_U7 #define KS_LAST KS_8B
/* /*
* the terminal capabilities are stored in this array * the terminal capabilities are stored in this array
@@ -166,6 +168,8 @@ extern char_u *(term_strings[]); /* current terminal strings */
#define T_RBG (term_str(KS_RBG)) /* request background RGB */ #define T_RBG (term_str(KS_RBG)) /* request background RGB */
#define T_OP (term_str(KS_OP)) /* original color pair */ #define T_OP (term_str(KS_OP)) /* original color pair */
#define T_U7 (term_str(KS_U7)) /* request cursor position */ #define T_U7 (term_str(KS_U7)) /* request cursor position */
#define T_8F (term_str(KS_8F)) /* set foreground color (RGB) */
#define T_8B (term_str(KS_8B)) /* set background color (RGB) */
#define TMODE_COOK 0 /* terminal mode for external cmds and Ex mode */ #define TMODE_COOK 0 /* terminal mode for external cmds and Ex mode */
#define TMODE_SLEEP 1 /* terminal mode for sleeping (cooked but no echo) */ #define TMODE_SLEEP 1 /* terminal mode for sleeping (cooked but no echo) */

View File

@@ -621,6 +621,11 @@ static char *(features[]) =
#else #else
"-termresponse", "-termresponse",
#endif #endif
#ifdef FEAT_TERMTRUECOLOR
"+termtruecolor",
#else
"-termtruecolor",
#endif
#ifdef FEAT_TEXTOBJ #ifdef FEAT_TEXTOBJ
"+textobjects", "+textobjects",
#else #else
@@ -748,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1770,
/**/ /**/
1769, 1769,
/**/ /**/

View File

@@ -1558,6 +1558,31 @@ typedef UINT32_TYPEDEF UINT32_T;
#define MSG_PUTS_LONG(s) msg_puts_long_attr((char_u *)(s), 0) #define MSG_PUTS_LONG(s) msg_puts_long_attr((char_u *)(s), 0)
#define MSG_PUTS_LONG_ATTR(s, a) msg_puts_long_attr((char_u *)(s), (a)) #define MSG_PUTS_LONG_ATTR(s, a) msg_puts_long_attr((char_u *)(s), (a))
#ifdef FEAT_GUI
# ifdef FEAT_TERMTRUECOLOR
# define GUI_FUNCTION(f) (gui.in_use ? gui_##f : termtrue_##f)
# define USE_24BIT (gui.in_use || p_guicolors)
# else
# define GUI_FUNCTION(f) gui_##f
# define USE_24BIT gui.in_use
# endif
#else
# ifdef FEAT_TERMTRUECOLOR
# define GUI_FUNCTION(f) termtrue_##f
# define USE_24BIT p_guicolors
# endif
#endif
#ifdef FEAT_TERMTRUECOLOR
# define IS_CTERM (t_colors > 1 || p_guicolors)
#else
# define IS_CTERM (t_colors > 1)
#endif
#ifdef GUI_FUNCTION
# define GUI_MCH_GET_RGB GUI_FUNCTION(mch_get_rgb)
# define GUI_MCH_GET_COLOR GUI_FUNCTION(mch_get_color)
# define GUI_GET_COLOR GUI_FUNCTION(get_color)
#endif
/* Prefer using emsg3(), because perror() may send the output to the wrong /* Prefer using emsg3(), because perror() may send the output to the wrong
* destination and mess up the screen. */ * destination and mess up the screen. */
#ifdef HAVE_STRERROR #ifdef HAVE_STRERROR