about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2021-04-02 22:41:07 +0200
committerOliver Kiddle <opk@zsh.org>2021-04-03 00:58:45 +0200
commit0721060f3616deac84f82c4a97d75987e276fe0a (patch)
tree668cfd5065bd93d14e1cbe56dfbf210c926e79d3
parent714864a87b11b080da92dee7abc29b8bc64107a5 (diff)
downloadzsh-0721060f3616deac84f82c4a97d75987e276fe0a.tar.gz
zsh-0721060f3616deac84f82c4a97d75987e276fe0a.tar.xz
zsh-0721060f3616deac84f82c4a97d75987e276fe0a.zip
47510: drop code that avoided termcap for named colours
The inconsistency caused test failures where TERM is e.g. rxvt-unicode.
This also makes a couple of bits available in zattr by removing flags
indicating whether to use termcap which is not an attribute as such.
-rw-r--r--ChangeLog3
-rw-r--r--Src/prompt.c47
-rw-r--r--Src/zsh.h10
3 files changed, 16 insertions, 44 deletions
diff --git a/ChangeLog b/ChangeLog
index 8c97f651c..03ea15ad4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2021-04-02  Oliver Kiddle  <opk@zsh.org>
 
+	* 47510: Src/prompt.c, Src/zsh.h: drop code that avoided
+	termcap for named colours
+
 	* 48356: Doc/Zsh/compwid.yo: clarify (the intended)
 	behaviour for the two anchor forms of matching control
 
diff --git a/Src/prompt.c b/Src/prompt.c
index 997327e18..6943eabc3 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -1696,28 +1696,11 @@ match_colour(const char **teststrp, int is_fg, int colour)
 		return TXT_ERROR;
 	}
     }
-    /*
-     * Try termcap for numbered characters if possible.
-     * Don't for named characters, since our best bet
-     * of getting the names right is with ANSI sequences.
-     */
-    if (!named && tccan(tc)) {
-	if (tccolours >= 0 && colour >= tccolours) {
-	    /*
-	     * Out of range of termcap colours.
-	     * Can we assume ANSI colours work?
-	     */
-	    if (colour > 7)
-		return TXT_ERROR; /* No. */
-	} else {
-	    /*
-	     * We can handle termcap colours and the number
-	     * is in range, so use termcap.
-	     */
-	    on |= is_fg ? TXT_ATTR_FG_TERMCAP :
-		TXT_ATTR_BG_TERMCAP;
-	}
-    }
+
+    /* Out of range of termcap colours and basic ANSI set. */
+    if (tccan(tc) && colour > 7 && colour >= tccolours)
+	return TXT_ERROR;
+
     return on | (zattr)colour << shft;
 }
 
@@ -1781,7 +1764,7 @@ match_highlight(const char *teststr, zattr *on_var)
  */
 
 static int
-output_colour(int colour, int fg_bg, int use_tc, int truecol, char *buf)
+output_colour(int colour, int fg_bg, int truecol, char *buf)
 {
     int atrlen = 3, len;
     char *ptr = buf;
@@ -1799,7 +1782,7 @@ output_colour(int colour, int fg_bg, int use_tc, int truecol, char *buf)
      * used instead of termcap even for colour > 7. Here this just emits the
      * color number, so it works fine for both zle_highlight and tercap cases
      */
-    } else if (use_tc || colour > 7) {
+    } else if (colour > 7) {
 	char digbuf[DIGBUFSIZE];
 	sprintf(digbuf, "%d", colour);
 	len = strlen(digbuf);
@@ -1836,7 +1819,6 @@ output_highlight(zattr atr, char *buf)
     if (atr & TXTFGCOLOUR) {
 	len = output_colour(txtchangeget(atr, TXT_ATTR_FG_COL),
 			    COL_SEQ_FG,
-			    (atr & TXT_ATTR_FG_TERMCAP),
 			    (atr & TXT_ATTR_FG_24BIT),
 			    ptr);
 	atrlen += len;
@@ -1853,7 +1835,6 @@ output_highlight(zattr atr, char *buf)
 	}
 	len = output_colour(txtchangeget(atr, TXT_ATTR_BG_COL),
 			    COL_SEQ_BG,
-			    (atr & TXT_ATTR_BG_TERMCAP),
 			    (atr & TXT_ATTR_BG_24BIT),
 			    ptr);
 	atrlen += len;
@@ -2018,7 +1999,6 @@ free_colour_buffer(void)
  * fg_bg indicates if we're changing the foreground or background.
  * tc indicates the termcap code to use, if appropriate.
  * def indicates if we're resetting the default colour.
- * use_termcap indicates if we should use termcap to output colours.
  * flags is either 0 or TSC_PROMPT.
  */
 
@@ -2028,7 +2008,7 @@ set_colour_attribute(zattr atr, int fg_bg, int flags)
 {
     char *ptr;
     int do_free, is_prompt = (flags & TSC_PROMPT) ? 1 : 0;
-    int colour, tc, def, use_termcap, use_truecolor;
+    int colour, tc, def, use_truecolor;
     int is_default_zle_highlight = 1;
 
     if (fg_bg == COL_SEQ_FG) {
@@ -2036,13 +2016,11 @@ set_colour_attribute(zattr atr, int fg_bg, int flags)
 	tc = TCFGCOLOUR;
 	def = txtchangeisset(atr, TXTNOFGCOLOUR);
 	use_truecolor = txtchangeisset(atr, TXT_ATTR_FG_24BIT);
-	use_termcap = txtchangeisset(atr, TXT_ATTR_FG_TERMCAP);
     } else {
 	colour = txtchangeget(atr, TXT_ATTR_BG_COL);
 	tc = TCBGCOLOUR;
 	def = txtchangeisset(atr, TXTNOBGCOLOUR);
 	use_truecolor = txtchangeisset(atr, TXT_ATTR_BG_24BIT);
-	use_termcap = txtchangeisset(atr, TXT_ATTR_BG_TERMCAP);
     }
 
     /* Test if current zle_highlight settings are customized, or
@@ -2057,17 +2035,14 @@ set_colour_attribute(zattr atr, int fg_bg, int flags)
     }
 
     /*
-     * If we're not restoring the default, and either have a
-     * colour value that is too large for ANSI, or have been told
-     * to use the termcap sequence, try to use the termcap sequence.
-     * True color is not covered by termcap.
+     * If we're not restoring the default or applying true color,
+     * try to use the termcap sequence.
      *
      * We have already sanitised the values we allow from the
      * highlighting variables, so much of this shouldn't be
      * necessary at this point, but we might as well be safe.
      */
-    if (!def && !use_truecolor &&
-	(is_default_zle_highlight && (colour > 7 || use_termcap)))
+    if (!def && !use_truecolor && is_default_zle_highlight)
     {
 	/*
 	 * We can if it's available, and either we couldn't get
diff --git a/Src/zsh.h b/Src/zsh.h
index 6cf1b4186..a26b2d05b 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -2726,11 +2726,6 @@ struct ttyinfo {
 /* Bits to shift the background colour */
 #define TXT_ATTR_BG_COL_SHIFT    (40)
 
-/* Flag to use termcap AF sequence to set colour, if available */
-#define TXT_ATTR_FG_TERMCAP      0x1000
-/* Flag to use termcap AB sequence to set colour, if available */
-#define TXT_ATTR_BG_TERMCAP      0x2000
-
 /* Flag to indicate that foreground is a 24-bit colour */
 #define TXT_ATTR_FG_24BIT        0x4000
 /* Flag to indicate that background is a 24-bit colour */
@@ -2739,16 +2734,15 @@ struct ttyinfo {
 /* Things to turn on, including values for the colour elements */
 #define TXT_ATTR_ON_VALUES_MASK	\
     (TXT_ATTR_ON_MASK|TXT_ATTR_FG_COL_MASK|TXT_ATTR_BG_COL_MASK|\
-     TXT_ATTR_FG_TERMCAP|TXT_ATTR_BG_TERMCAP|\
      TXT_ATTR_FG_24BIT|TXT_ATTR_BG_24BIT)
 
 /* Mask out everything to do with setting a foreground colour */
 #define TXT_ATTR_FG_ON_MASK \
-    (TXTFGCOLOUR|TXT_ATTR_FG_COL_MASK|TXT_ATTR_FG_TERMCAP|TXT_ATTR_FG_24BIT)
+    (TXTFGCOLOUR|TXT_ATTR_FG_COL_MASK|TXT_ATTR_FG_24BIT)
 
 /* Mask out everything to do with setting a background colour */
 #define TXT_ATTR_BG_ON_MASK \
-    (TXTBGCOLOUR|TXT_ATTR_BG_COL_MASK|TXT_ATTR_BG_TERMCAP|TXT_ATTR_BG_24BIT)
+    (TXTBGCOLOUR|TXT_ATTR_BG_COL_MASK|TXT_ATTR_BG_24BIT)
 
 /* Mask out everything to do with activating colours */
 #define TXT_ATTR_COLOUR_ON_MASK			\