changeset 13339:da2a9e217200 v8.0.1544

patch 8.0.1544: when using 'termguicolors' SpellBad doesn't show commit https://github.com/vim/vim/commit/d4fc577e60d325777d38c00bd78fb9a32c7b1dfa Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 27 14:39:03 2018 +0100 patch 8.0.1544: when using 'termguicolors' SpellBad doesn't show Problem: When using 'termguicolors' SpellBad doesn't show. Solution: When the GUI colors are not set fall back to the cterm colors.
author Christian Brabandt <cb@256bit.org>
date Tue, 27 Feb 2018 14:45:06 +0100
parents 0afa358885dc
children 549abff14a6d
files src/gui.h src/screen.c src/structs.h src/syntax.c src/version.c
diffstat 5 files changed, 86 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui.h
+++ b/src/gui.h
@@ -207,6 +207,8 @@ typedef long	    guicolor_T;	/* handle f
 #define INVALCOLOR (guicolor_T)-11111	/* number for invalid color; on 32 bit
 				   displays there is a tiny chance this is an
 				   actual color */
+#define CTERMCOLOR (guicolor_T)-11110	/* only used for cterm.bg_rgb and
+					   cterm.fg_rgb: use cterm color */
 
 #ifdef FEAT_GUI_GTK
   typedef PangoFontDescription	*GuiFont;       /* handle for a GUI font */
--- a/src/screen.c
+++ b/src/screen.c
@@ -8066,16 +8066,13 @@ screen_start_highlight(int attr)
 	    }
 	    if ((attr & HL_BOLD) && *T_MD != NUL)	/* bold */
 		out_str(T_MD);
-	    else if (aep != NULL && cterm_normal_fg_bold &&
+	    else if (aep != NULL && cterm_normal_fg_bold && (
 #ifdef FEAT_TERMGUICOLORS
-			(p_tgc ?
-			    (aep->ae_u.cterm.fg_rgb != INVALCOLOR):
-#endif
-			    (t_colors > 1 && aep->ae_u.cterm.fg_color)
-#ifdef FEAT_TERMGUICOLORS
-			)
-#endif
-		    )
+			p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR
+			  ? aep->ae_u.cterm.fg_rgb != INVALCOLOR
+			  :
+#endif
+			    t_colors > 1 && aep->ae_u.cterm.fg_color))
 		/* If the Normal FG color has BOLD attribute and the new HL
 		 * has a FG color defined, clear BOLD. */
 		out_str(T_ME);
@@ -8101,28 +8098,39 @@ screen_start_highlight(int attr)
 	    if (aep != NULL)
 	    {
 #ifdef FEAT_TERMGUICOLORS
-		if (p_tgc)
+		/* When 'termguicolors' is set but fg or bg is unset,
+		 * fall back to the cterm colors.   This helps for SpellBad,
+		 * where the GUI uses a red undercurl. */
+		if (p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR)
 		{
 		    if (aep->ae_u.cterm.fg_rgb != INVALCOLOR)
 			term_fg_rgb_color(aep->ae_u.cterm.fg_rgb);
+		}
+		else
+#endif
+		if (t_colors > 1)
+		{
+		    if (aep->ae_u.cterm.fg_color)
+			term_fg_color(aep->ae_u.cterm.fg_color - 1);
+		}
+#ifdef FEAT_TERMGUICOLORS
+		if (p_tgc && aep->ae_u.cterm.bg_rgb != CTERMCOLOR)
+		{
 		    if (aep->ae_u.cterm.bg_rgb != INVALCOLOR)
 			term_bg_rgb_color(aep->ae_u.cterm.bg_rgb);
 		}
 		else
 #endif
-		{
-		    if (t_colors > 1)
-		    {
-			if (aep->ae_u.cterm.fg_color)
-			    term_fg_color(aep->ae_u.cterm.fg_color - 1);
-			if (aep->ae_u.cterm.bg_color)
-			    term_bg_color(aep->ae_u.cterm.bg_color - 1);
-		    }
-		    else
-		    {
-			if (aep->ae_u.term.start != NULL)
-			    out_str(aep->ae_u.term.start);
-		    }
+		if (t_colors > 1)
+		{
+		    if (aep->ae_u.cterm.bg_color)
+			term_bg_color(aep->ae_u.cterm.bg_color - 1);
+		}
+
+		if (t_colors <= 1)
+		{
+		    if (aep->ae_u.term.start != NULL)
+			out_str(aep->ae_u.term.start);
 		}
 	    }
 	}
@@ -8162,17 +8170,19 @@ screen_stop_highlight(void)
 		     * Assume that t_me restores the original colors!
 		     */
 		    aep = syn_cterm_attr2entry(screen_attr);
-		    if (aep != NULL &&
+		    if (aep != NULL && ((
 #ifdef FEAT_TERMGUICOLORS
-			    (p_tgc ?
-				(aep->ae_u.cterm.fg_rgb != INVALCOLOR
-				 || aep->ae_u.cterm.bg_rgb != INVALCOLOR):
-#endif
-				(aep->ae_u.cterm.fg_color || aep->ae_u.cterm.bg_color)
+			    p_tgc && aep->ae_u.cterm.fg_rgb != CTERMCOLOR
+				? aep->ae_u.cterm.fg_rgb != INVALCOLOR
+				:
+#endif
+				aep->ae_u.cterm.fg_color) || (
 #ifdef FEAT_TERMGUICOLORS
-			    )
-#endif
-			)
+			    p_tgc && aep->ae_u.cterm.bg_rgb != CTERMCOLOR
+				? aep->ae_u.cterm.bg_rgb != INVALCOLOR
+				:
+#endif
+				aep->ae_u.cterm.bg_color)))
 			do_ME = TRUE;
 		}
 		else
--- a/src/structs.h
+++ b/src/structs.h
@@ -101,7 +101,10 @@ typedef struct {
 # endif
 # define guicolor_T long
 # define INVALCOLOR ((guicolor_T)0x1ffffff)
+    /* only used for cterm.bg_rgb and cterm.fg_rgb: use cterm color */
+# define CTERMCOLOR ((guicolor_T)0x1fffffe)
 #endif
+#define COLOR_INVALID(x) ((x) == INVALCOLOR || (x) == CTERMCOLOR)
 
 /*
  * marks: positions in a file
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -8952,8 +8952,18 @@ get_tgc_attr_idx(int attr, guicolor_T fg
 
     vim_memset(&at_en, 0, sizeof(attrentry_T));
     at_en.ae_attr = attr;
-    at_en.ae_u.cterm.fg_rgb = fg;
-    at_en.ae_u.cterm.bg_rgb = bg;
+    if (fg == INVALCOLOR && bg == INVALCOLOR)
+    {
+	/* If both GUI colors are not set fall back to the cterm colors.  Helps
+	 * if the GUI only has an attribute, such as undercurl. */
+	at_en.ae_u.cterm.fg_rgb = CTERMCOLOR;
+	at_en.ae_u.cterm.bg_rgb = CTERMCOLOR;
+    }
+    else
+    {
+	at_en.ae_u.cterm.fg_rgb = fg;
+	at_en.ae_u.cterm.bg_rgb = bg;
+    }
     return get_attr_entry(&cterm_attr_table, &at_en);
 }
 #endif
@@ -9094,10 +9104,23 @@ hl_combine_attr(int char_attr, int prim_
 		if (spell_aep->ae_u.cterm.bg_color > 0)
 		    new_en.ae_u.cterm.bg_color = spell_aep->ae_u.cterm.bg_color;
 #ifdef FEAT_TERMGUICOLORS
-		if (spell_aep->ae_u.cterm.fg_rgb != INVALCOLOR)
-		    new_en.ae_u.cterm.fg_rgb = spell_aep->ae_u.cterm.fg_rgb;
-		if (spell_aep->ae_u.cterm.bg_rgb != INVALCOLOR)
-		    new_en.ae_u.cterm.bg_rgb = spell_aep->ae_u.cterm.bg_rgb;
+		/* If both fg and bg are not set fall back to cterm colors.
+		 * Helps for SpellBad which uses undercurl in the GUI. */
+		if (COLOR_INVALID(spell_aep->ae_u.cterm.fg_rgb)
+			&& COLOR_INVALID(spell_aep->ae_u.cterm.bg_rgb))
+		{
+		    if (spell_aep->ae_u.cterm.fg_color > 0)
+			new_en.ae_u.cterm.fg_rgb = CTERMCOLOR;
+		    if (spell_aep->ae_u.cterm.bg_color > 0)
+			new_en.ae_u.cterm.bg_rgb = CTERMCOLOR;
+		}
+		else
+		{
+		    if (spell_aep->ae_u.cterm.fg_rgb != INVALCOLOR)
+			new_en.ae_u.cterm.fg_rgb = spell_aep->ae_u.cterm.fg_rgb;
+		    if (spell_aep->ae_u.cterm.bg_rgb != INVALCOLOR)
+			new_en.ae_u.cterm.bg_rgb = spell_aep->ae_u.cterm.bg_rgb;
+		}
 #endif
 	    }
 	}
@@ -9592,6 +9615,14 @@ set_hl_attr(
 #  endif
 	at_en.ae_u.cterm.fg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_fg);
 	at_en.ae_u.cterm.bg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_bg);
+	if (at_en.ae_u.cterm.fg_rgb == INVALCOLOR
+		&& at_en.ae_u.cterm.bg_rgb == INVALCOLOR)
+	{
+	    /* If both fg and bg are invalid fall back to the cterm colors.
+	     * Helps when the GUI only uses an attribute, e.g. undercurl. */
+	    at_en.ae_u.cterm.fg_rgb = CTERMCOLOR;
+	    at_en.ae_u.cterm.bg_rgb = CTERMCOLOR;
+	}
 # endif
 	sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en);
     }
--- a/src/version.c
+++ b/src/version.c
@@ -779,6 +779,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1544,
+/**/
     1543,
 /**/
     1542,