0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.0.1359: libvterm ANSI colors can not always be recognized

Problem:    Libvterm ANSI colors can not always be recognized from the RGB
            values. The default color is wrong when t_RB is empty.
Solution:   Add the ANSI color index to VTermColor.
This commit is contained in:
Bram Moolenaar
2017-11-29 22:33:38 +01:00
parent 8b9e20afb0
commit 46359e198f
4 changed files with 82 additions and 104 deletions

View File

@@ -38,6 +38,8 @@
* in tl_scrollback are no longer used.
*
* TODO:
* - When using 'termguicolors' still use the 16 ANSI colors as-is. Helps for
* a job that uses 16 colors while Vim is using > 256.
* - in GUI vertical split causes problems. Cursor is flickering. (Hirohito
* Higashi, 2017 Sep 19)
* - Shift-Tab does not work.
@@ -48,7 +50,6 @@
* - When closing gvim with an active terminal buffer, the dialog suggests
* saving the buffer. Should say something else. (Manas Thakur, #2215)
* Also: #2223
* - implement term_setsize()
* - Termdebug does not work when Vim build with mzscheme. gdb hangs.
* - MS-Windows GUI: WinBar has tearoff item
* - Adding WinBar to terminal window doesn't display, text isn't shifted down.
@@ -57,6 +58,7 @@
* - What to store in a session file? Shell at the prompt would be OK to
* restore, but others may not. Open the window and let the user start the
* command?
* - implement term_setsize()
* - add test for giving error for invalid 'termsize' value.
* - support minimal size when 'termsize' is "rows*cols".
* - support minimal size when 'termsize' is empty?
@@ -1707,7 +1709,7 @@ may_toggle_cursor(term_T *term)
/*
* Reverse engineer the RGB value into a cterm color index.
* First color is 1. Return 0 if no match found.
* First color is 1. Return 0 if no match found (default color).
*/
static int
color2index(VTermColor *color, int fg, int *boldp)
@@ -1716,78 +1718,34 @@ color2index(VTermColor *color, int fg, int *boldp)
int blue = color->blue;
int green = color->green;
/* The argument for lookup_color() is for the color_names[] table. */
if (red == 0)
if (color->ansi_index != VTERM_ANSI_INDEX_NONE)
{
if (green == 0)
/* First 16 colors and default: use the ANSI index, because these
* colors can be redefined. */
if (t_colors >= 16)
return color->ansi_index;
switch (color->ansi_index)
{
if (blue == 0)
return lookup_color(0, fg, boldp) + 1; /* black */
if (blue == 224)
return lookup_color(1, fg, boldp) + 1; /* dark blue */
}
else if (green == 224)
{
if (blue == 0)
return lookup_color(2, fg, boldp) + 1; /* dark green */
if (blue == 224)
return lookup_color(3, fg, boldp) + 1; /* dark cyan */
}
}
else if (red == 224)
{
if (green == 0)
{
if (blue == 0)
return lookup_color(4, fg, boldp) + 1; /* dark red */
if (blue == 224)
return lookup_color(5, fg, boldp) + 1; /* dark magenta */
}
else if (green == 224)
{
if (blue == 0)
return lookup_color(6, fg, boldp) + 1; /* dark yellow / brown */
if (blue == 224)
return lookup_color(8, fg, boldp) + 1; /* white / light grey */
}
}
else if (red == 128)
{
if (green == 128 && blue == 128)
return lookup_color(12, fg, boldp) + 1; /* dark grey */
}
else if (red == 255)
{
if (green == 64)
{
if (blue == 64)
return lookup_color(20, fg, boldp) + 1; /* light red */
if (blue == 255)
return lookup_color(22, fg, boldp) + 1; /* light magenta */
}
else if (green == 255)
{
if (blue == 64)
return lookup_color(24, fg, boldp) + 1; /* yellow */
if (blue == 255)
return lookup_color(26, fg, boldp) + 1; /* white */
}
}
else if (red == 64)
{
if (green == 64)
{
if (blue == 255)
return lookup_color(14, fg, boldp) + 1; /* light blue */
}
else if (green == 255)
{
if (blue == 64)
return lookup_color(16, fg, boldp) + 1; /* light green */
if (blue == 255)
return lookup_color(18, fg, boldp) + 1; /* light cyan */
case 0: return 0;
case 1: return lookup_color( 0, fg, boldp) + 1;
case 2: return lookup_color( 4, fg, boldp) + 1; /* dark red */
case 3: return lookup_color( 2, fg, boldp) + 1; /* dark green */
case 4: return lookup_color( 6, fg, boldp) + 1; /* brown */
case 5: return lookup_color( 1, fg, boldp) + 1; /* dark blue*/
case 6: return lookup_color( 5, fg, boldp) + 1; /* dark magenta */
case 7: return lookup_color( 3, fg, boldp) + 1; /* dark cyan */
case 8: return lookup_color( 8, fg, boldp) + 1; /* light grey */
case 9: return lookup_color(12, fg, boldp) + 1; /* dark grey */
case 10: return lookup_color(20, fg, boldp) + 1; /* red */
case 11: return lookup_color(16, fg, boldp) + 1; /* green */
case 12: return lookup_color(24, fg, boldp) + 1; /* yellow */
case 13: return lookup_color(14, fg, boldp) + 1; /* blue */
case 14: return lookup_color(22, fg, boldp) + 1; /* magenta */
case 15: return lookup_color(18, fg, boldp) + 1; /* cyan */
case 16: return lookup_color(26, fg, boldp) + 1; /* white */
}
}
if (t_colors >= 256)
{
if (red == blue && red == green)
@@ -2447,23 +2405,23 @@ term_get_attr(buf_T *buf, linenr_T lnum, int col)
}
static VTermColor ansi_table[16] = {
{ 0, 0, 0}, /* black */
{224, 0, 0}, /* dark red */
{ 0, 224, 0}, /* dark green */
{224, 224, 0}, /* dark yellow / brown */
{ 0, 0, 224}, /* dark blue */
{224, 0, 224}, /* dark magenta */
{ 0, 224, 224}, /* dark cyan */
{224, 224, 224}, /* light grey */
{ 0, 0, 0, 1}, /* black */
{224, 0, 0, 2}, /* dark red */
{ 0, 224, 0, 3}, /* dark green */
{224, 224, 0, 4}, /* dark yellow / brown */
{ 0, 0, 224, 5}, /* dark blue */
{224, 0, 224, 6}, /* dark magenta */
{ 0, 224, 224, 7}, /* dark cyan */
{224, 224, 224, 8}, /* light grey */
{128, 128, 128}, /* dark grey */
{255, 64, 64}, /* light red */
{ 64, 255, 64}, /* light green */
{255, 255, 64}, /* yellow */
{ 64, 64, 255}, /* light blue */
{255, 64, 255}, /* light magenta */
{ 64, 255, 255}, /* light cyan */
{255, 255, 255}, /* white */
{128, 128, 128, 9}, /* dark grey */
{255, 64, 64, 10}, /* light red */
{ 64, 255, 64, 11}, /* light green */
{255, 255, 64, 12}, /* yellow */
{ 64, 64, 255, 13}, /* light blue */
{255, 64, 255, 14}, /* light magenta */
{ 64, 255, 255, 15}, /* light cyan */
{255, 255, 255, 16}, /* white */
};
static int cube_value[] = {
@@ -2549,7 +2507,7 @@ create_vterm(term_T *term, int rows, int cols)
/* The "Terminal" highlight group overrules the defaults. */
id = syn_name2id((char_u *)"Terminal");
/* Use the actual color for the GUI and when 'guitermcolors' is set. */
/* Use the actual color for the GUI and when 'termguicolors' is set. */
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
if (0
# ifdef FEAT_GUI