0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.0.1783: cannot use 256 colors in a MS-Windows console

Problem:    Cannot use 256 colors in a MS-Windows console.
Solution:   Add 256 color support. (Nobuhiro Takasaki, closes #2821)
This commit is contained in:
Bram Moolenaar
2018-05-01 15:47:38 +02:00
parent d76ce85266
commit c5cd88554f
8 changed files with 238 additions and 112 deletions

View File

@@ -214,7 +214,7 @@ static guicolor_T save_console_bg_rgb;
static guicolor_T save_console_fg_rgb;
# ifdef FEAT_TERMGUICOLORS
# define USE_VTP (vtp_working && p_tgc)
# define USE_VTP (vtp_working && is_term_win32() && (p_tgc || (!p_tgc && t_colors >= 256)))
# else
# define USE_VTP 0
# endif
@@ -2630,7 +2630,6 @@ mch_init(void)
/* set termcap codes to current text attributes */
update_tcap(g_attrCurrent);
swap_tcap();
GetConsoleCursorInfo(g_hConOut, &g_cci);
GetConsoleMode(g_hConIn, &g_cmodein);
@@ -5763,7 +5762,11 @@ clear_chars(
if (!USE_VTP)
FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, n, coord, &dwDummy);
else
FillConsoleOutputAttribute(g_hConOut, 0, n, coord, &dwDummy);
{
set_console_color_rgb();
gotoxy(coord.X + 1, coord.Y + 1);
vtp_printf("\033[%dX", n);
}
}
@@ -7653,6 +7656,16 @@ vtp_sgr_bulks(
vtp_printf((char *)buf);
}
static int
ctermtoxterm(
int cterm)
{
uint8_t r, g, b, idx;
cterm_color2rgb(cterm, &r, &g, &b, &idx);
return (((int)r << 16) | ((int)g << 8) | (int)b);
}
static void
set_console_color_rgb(void)
{
@@ -7661,6 +7674,8 @@ set_console_color_rgb(void)
int id;
guicolor_T fg = INVALCOLOR;
guicolor_T bg = INVALCOLOR;
int ctermfg;
int ctermbg;
if (!USE_VTP)
return;
@@ -7669,9 +7684,19 @@ set_console_color_rgb(void)
if (id > 0)
syn_id2colors(id, &fg, &bg);
if (fg == INVALCOLOR)
fg = 0xc0c0c0; /* white text */
{
ctermfg = -1;
if (id > 0)
syn_id2cterm_bg(id, &ctermfg, &ctermbg);
fg = ctermfg != -1 ? ctermtoxterm(ctermfg) : 0xc0c0c0; /* white */
}
if (bg == INVALCOLOR)
bg = 0x000000; /* black background */
{
ctermbg = -1;
if (id > 0)
syn_id2cterm_bg(id, &ctermfg, &ctermbg);
bg = ctermbg != -1 ? ctermtoxterm(ctermbg) : 0x000000; /* black */
}
fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
@@ -7730,4 +7755,10 @@ use_vtp(void)
return USE_VTP;
}
int
is_term_win32(void)
{
return T_NAME != NULL && STRCMP(T_NAME, "win32") == 0;
}
#endif