diff src/term.c @ 13314:65c3e8259124 v8.0.1531

patch 8.0.1531: cannot use 24 bit colors in MS-Windows console commit https://github.com/vim/vim/commit/cafafb381a04e33f3ce9cd15dd9f94b73226831f Author: Bram Moolenaar <Bram@vim.org> Date: Thu Feb 22 21:07:09 2018 +0100 patch 8.0.1531: cannot use 24 bit colors in MS-Windows console Problem: Cannot use 24 bit colors in MS-Windows console. Solution: Add support for vcon. (Nobuhiro Takasaki, Ken Takasaki, fixes #1270, fixes #2060)
author Christian Brabandt <cb@256bit.org>
date Thu, 22 Feb 2018 21:15:05 +0100
parents ac42c4b11dbc
children de19318319a6
line wrap: on
line diff
--- a/src/term.c
+++ b/src/term.c
@@ -76,7 +76,6 @@ struct builtin_term
 
 static struct builtin_term *find_builtin_term(char_u *name);
 static void parse_builtin_tcap(char_u *s);
-static void term_color(char_u *s, int n);
 static void gather_termleader(void);
 #ifdef FEAT_TERMRESPONSE
 static void req_codes_from_term(void);
@@ -600,6 +599,10 @@ static struct builtin_term builtin_termc
 #  else
     {(int)KS_CS,	"\033|%i%d;%dr"},/* scroll region */
 #  endif
+#  ifdef FEAT_TERMGUICOLORS
+    {(int)KS_8F,	"\033|38;2;%lu;%lu;%lum"},
+    {(int)KS_8B,	"\033|48;2;%lu;%lu;%lum"},
+#  endif
 
     {K_UP,		"\316H"},
     {K_DOWN,		"\316P"},
@@ -2007,6 +2010,11 @@ set_termname(char_u *term)
     may_req_termresponse();
 #endif
 
+#if defined(WIN3264) && !defined(FEAT_GUI) && defined(FEAT_TERMGUICOLORS)
+    if (STRCMP(term, "win32") == 0)
+	set_color_count((p_tgc) ? 256 : 16);
+#endif
+
     return OK;
 }
 
@@ -2818,31 +2826,12 @@ term_set_winsize(int height, int width)
 }
 #endif
 
-    void
-term_fg_color(int n)
-{
-    /* Use "AF" termcap entry if present, "Sf" entry otherwise */
-    if (*T_CAF)
-	term_color(T_CAF, n);
-    else if (*T_CSF)
-	term_color(T_CSF, n);
-}
-
-    void
-term_bg_color(int n)
-{
-    /* Use "AB" termcap entry if present, "Sb" entry otherwise */
-    if (*T_CAB)
-	term_color(T_CAB, n);
-    else if (*T_CSB)
-	term_color(T_CSB, n);
-}
-
     static void
 term_color(char_u *s, int n)
 {
     char	buf[20];
-    int i = 2;	/* index in s[] just after <Esc>[ or CSI */
+    int		i = *s == CSI ? 1 : 2;
+		/* index in s[] just after <Esc>[ or CSI */
 
     /* Special handling of 16 colors, because termcap can't handle it */
     /* Also accept "\e[3%dm" for TERMINFO, it is sometimes used */
@@ -2869,6 +2858,26 @@ term_color(char_u *s, int n)
 	OUT_STR(tgoto((char *)s, 0, n));
 }
 
+    void
+term_fg_color(int n)
+{
+    /* Use "AF" termcap entry if present, "Sf" entry otherwise */
+    if (*T_CAF)
+	term_color(T_CAF, n);
+    else if (*T_CSF)
+	term_color(T_CSF, n);
+}
+
+    void
+term_bg_color(int n)
+{
+    /* Use "AB" termcap entry if present, "Sb" entry otherwise */
+    if (*T_CAB)
+	term_color(T_CAB, n);
+    else if (*T_CSB)
+	term_color(T_CSB, n);
+}
+
 #if defined(FEAT_TERMGUICOLORS) || defined(PROTO)
 
 #define RED(rgb)   (((long_u)(rgb) >> 16) & 0xFF)
@@ -6614,6 +6623,106 @@ update_tcap(int attr)
       ++p;
     }
 }
+
+struct ks_tbl_s
+{
+    int code;	    /* value of KS_ */
+    char *vtp;	    /* code in vtp mode */
+    char *buf;	    /* buffer in non-vtp mode */
+    char *vbuf;	    /* buffer in vtp mode */
+};
+
+static struct ks_tbl_s ks_tbl[] =
+{
+    {(int)KS_ME,  "\033|0m" },	/* normal */
+    {(int)KS_MR,  "\033|7m" },	/* reverse */
+    {(int)KS_MD,  "\033|1m" },	/* bold */
+    {(int)KS_SO,  "\033|91m"},	/* standout: bright red text */
+    {(int)KS_SE,  "\033|39m"},	/* standout end: default color */
+    {(int)KS_CZH, "\033|95m"},	/* italic: bright magenta text */
+    {(int)KS_CZR, "\033|0m",},	/* italic end */
+    {(int)KS_US,  "\033|4m",},	/* underscore */
+    {(int)KS_UE,  "\033|24m"},	/* underscore end */
+    {(int)KS_NAME, NULL}
+};
+
+    static struct builtin_term *
+find_first_tcap(
+    char_u *name,
+    int code)
+{
+    struct builtin_term *p;
+
+    p = find_builtin_term(name);
+    while (p->bt_string != NULL)
+    {
+	if (p->bt_entry == code)
+	    return p;
+	p++;
+    }
+    return NULL;
+}
+
+/*
+ * For Win32 console: replace the sequence immediately after termguicolors.
+ */
+    void
+swap_tcap(void)
+{
+# ifdef FEAT_TERMGUICOLORS
+    static int init = 0;
+    static int last_tgc;
+    struct ks_tbl_s *ks;
+    struct builtin_term *bt;
+
+    /* buffer initialization */
+    if (init == 0)
+    {
+	ks = ks_tbl;
+	while (ks->vtp != NULL)
+	{
+	    bt = find_first_tcap(DEFAULT_TERM, ks->code);
+	    ks->buf = bt->bt_string;
+	    ks->vbuf = ks->vtp;
+	    ks++;
+	}
+	init++;
+	last_tgc = p_tgc;
+	return;
+    }
+
+    if (last_tgc != p_tgc)
+    {
+	if (p_tgc)
+	{
+	    /* switch to special character sequence */
+	    ks = ks_tbl;
+	    while (ks->vtp != NULL)
+	    {
+		bt = find_first_tcap(DEFAULT_TERM, ks->code);
+		ks->buf = bt->bt_string;
+		bt->bt_string = ks->vbuf;
+		ks++;
+	    }
+	}
+	else
+	{
+	    /* switch to index color */
+	    ks = ks_tbl;
+	    while (ks->vtp != NULL)
+	    {
+		bt = find_first_tcap(DEFAULT_TERM, ks->code);
+		ks->vbuf = bt->bt_string;
+		bt->bt_string = ks->buf;
+		ks++;
+	    }
+	}
+
+	last_tgc = p_tgc;
+    }
+# endif
+}
+
 #endif
 
 #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) || defined(PROTO)