Mercurial > vim
diff src/terminal.c @ 12966:c5bccd50100e v8.0.1359
patch 8.0.1359: libvterm ANSI colors can not always be recognized
commit https://github.com/vim/vim/commit/46359e198f6d6884dc3d3c4a3e46625f1b2a2ad2
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Nov 29 22:33:38 2017 +0100
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 29 Nov 2017 22:45:05 +0100 |
parents | 32531a3eab1f |
children | a9f6a874b64f |
line wrap: on
line diff
--- a/src/terminal.c +++ b/src/terminal.c @@ -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, i 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) - { - 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) + /* 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(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 */ + 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 */ } } - 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 */ - } - } + if (t_colors >= 256) { if (red == blue && red == green) @@ -2447,23 +2405,23 @@ term_get_attr(buf_T *buf, linenr_T lnum, } 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 */ - - {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 */ + { 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, 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 /* 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