]> granicus.if.org Git - vim/commitdiff
patch 8.1.2382: MS-Windows: When using VTP bold+inverse doesn't work v8.1.2382
authorBram Moolenaar <Bram@vim.org>
Mon, 2 Dec 2019 20:35:31 +0000 (21:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 2 Dec 2019 20:35:31 +0000 (21:35 +0100)
Problem:    MS-Windows: When using VTP bold+inverse doesn't work.
Solution:   Compare with the default colors. (Nobuhiro Takasaki, closes #5303)

src/os_win32.c
src/proto/os_win32.pro
src/screen.c
src/version.c

index e281b373cefe310e902b256a275aa2515f9092b2..ff37f54b271add6dc246277b9f0eedbb0a104cde 100644 (file)
@@ -7414,34 +7414,14 @@ set_console_color_rgb(void)
 {
 # ifdef FEAT_TERMGUICOLORS
     DYN_CONSOLE_SCREEN_BUFFER_INFOEX csbi;
-    int id;
-    guicolor_T fg = INVALCOLOR;
-    guicolor_T bg = INVALCOLOR;
-    int ctermfg;
-    int ctermbg;
+    guicolor_T fg, bg;
+    int                ctermfg, ctermbg;
 
     if (!USE_VTP)
        return;
 
-    id = syn_name2id((char_u *)"Normal");
-    if (id > 0 && p_tgc)
-       syn_id2colors(id, &fg, &bg);
-    if (fg == INVALCOLOR)
-    {
-       ctermfg = -1;
-       if (id > 0)
-           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
-       fg = ctermfg != -1 ? ctermtoxterm(ctermfg) : default_console_color_fg;
-       cterm_normal_fg_gui_color = fg;
-    }
-    if (bg == INVALCOLOR)
-    {
-       ctermbg = -1;
-       if (id > 0)
-           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
-       bg = ctermbg != -1 ? ctermtoxterm(ctermbg) : default_console_color_bg;
-       cterm_normal_bg_gui_color = bg;
-    }
+    get_default_console_color(&ctermfg, &ctermbg, &fg, &bg);
+
     fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
     bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
 
@@ -7459,6 +7439,51 @@ set_console_color_rgb(void)
 # endif
 }
 
+# if defined(FEAT_TERMGUICOLORS) || defined(PROTO)
+    void
+get_default_console_color(
+    int *cterm_fg,
+    int *cterm_bg,
+    guicolor_T *gui_fg,
+    guicolor_T *gui_bg)
+{
+    int id;
+    guicolor_T guifg = INVALCOLOR;
+    guicolor_T guibg = INVALCOLOR;
+    int ctermfg = 0;
+    int ctermbg = 0;
+
+    id = syn_name2id((char_u *)"Normal");
+    if (id > 0 && p_tgc)
+       syn_id2colors(id, &guifg, &guibg);
+    if (guifg == INVALCOLOR)
+    {
+       ctermfg = -1;
+       if (id > 0)
+           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
+       guifg = ctermfg != -1 ? ctermtoxterm(ctermfg)
+                                                   : default_console_color_fg;
+       cterm_normal_fg_gui_color = guifg;
+       ctermfg = ctermfg < 0 ? 0 : ctermfg;
+    }
+    if (guibg == INVALCOLOR)
+    {
+       ctermbg = -1;
+       if (id > 0)
+           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
+       guibg = ctermbg != -1 ? ctermtoxterm(ctermbg)
+                                                   : default_console_color_bg;
+       cterm_normal_bg_gui_color = guibg;
+       ctermbg = ctermbg < 0 ? 0 : ctermbg;
+    }
+
+    *cterm_fg = ctermfg;
+    *cterm_bg = ctermbg;
+    *gui_fg = guifg;
+    *gui_bg = guibg;
+}
+# endif
+
     static void
 reset_console_color_rgb(void)
 {
index 94b2f7200543e2d6cebb7ef503303fc7252d651d..e60ce92ca10cc1129779787f57b02539037090f0 100644 (file)
@@ -71,6 +71,7 @@ void used_file_arg(char *name, int literal, int full_path, int diff_mode);
 void set_alist_count(void);
 void fix_arg_enc(void);
 int mch_setenv(char *var, char *value, int x);
+void get_default_console_color(int *cterm_fg, int *cterm_bg, guicolor_T *gui_fg, guicolor_T *gui_bg);
 void control_console_color_rgb(void);
 int use_vtp(void);
 int is_term_win32(void);
index 4a702951871a3c0ab8bafe3c6e30ef696e48c766..17b1ff2192206be3ff003308d13efd152282dcb7 100644 (file)
@@ -1777,6 +1777,33 @@ screen_start_highlight(int attr)
                else
                    attr = aep->ae_attr;
            }
+#if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
+           if (use_vtp())
+           {
+               guicolor_T  defguifg, defguibg;
+               int         defctermfg, defctermbg;
+
+               // If FG and BG are unset, the color is undefined when
+               // BOLD+INVERSE. Use Normal as the default value.
+               get_default_console_color(&defctermfg, &defctermbg, &defguifg,
+                                                                   &defguibg);
+
+               if (p_tgc)
+               {
+                   if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.fg_rgb))
+                       term_fg_rgb_color(defguifg);
+                   if (aep == NULL || COLOR_INVALID(aep->ae_u.cterm.bg_rgb))
+                       term_bg_rgb_color(defguibg);
+               }
+               else if (t_colors >= 256)
+               {
+                   if (aep == NULL || aep->ae_u.cterm.fg_color == 0)
+                       term_fg_color(defctermfg);
+                   if (aep == NULL || aep->ae_u.cterm.bg_color == 0)
+                       term_bg_color(defctermbg);
+               }
+           }
+#endif
            if ((attr & HL_BOLD) && *T_MD != NUL)       /* bold */
                out_str(T_MD);
            else if (aep != NULL && cterm_normal_fg_bold && (
index 62bf063207550be39c8416ac0c218b57c83cbaf6..066e2093aae2613843f1a3bc9ea53ba3a3ce4c98 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2382,
 /**/
     2381,
 /**/