From: Yuri Karaban <d...@dev97.com>

This makes behavior consistent with XTerm and RXVT. When default
foreground color is black (implicit):

echo -e "\033[1m Bold but not bright"

should show bold black string, and when color is explicit (black too):

echo -e "\033[30;1m Bold and bright"
or
echo -e "\033[30m\033[1m Bold and bright"

should show bold gray (brightened) string.
---
 st.c | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/st.c b/st.c
index df660ff..accba74 100644
--- a/st.c
+++ b/st.c
@@ -185,6 +185,7 @@ typedef struct {
        ushort mode;      /* attribute flags */
        uint32_t fg;      /* foreground  */
        uint32_t bg;      /* background  */
+       bool fgcustcolor;  /* custom foreground color is in effect */
 } Glyph;
 
 typedef Glyph *Line;
@@ -1703,6 +1704,7 @@ tsetattr(int *attr, int l) {
                                        | ATTR_BLINK);
                        term.c.attr.fg = defaultfg;
                        term.c.attr.bg = defaultbg;
+                       term.c.attr.fgcustcolor = False;
                        break;
                case 1:
                        term.c.attr.mode |= ATTR_BOLD;
@@ -1738,11 +1740,14 @@ tsetattr(int *attr, int l) {
                        term.c.attr.mode &= ~ATTR_REVERSE;
                        break;
                case 38:
-                       if ((idx = tdefcolor(attr, &i, l)) >= 0)
+                       if ((idx = tdefcolor(attr, &i, l)) >= 0) {
                                term.c.attr.fg = idx;
+                               term.c.attr.fgcustcolor = True;
+                       }
                        break;
                case 39:
                        term.c.attr.fg = defaultfg;
+                       term.c.attr.fgcustcolor = False;
                        break;
                case 48:
                        if ((idx = tdefcolor(attr, &i, l)) >= 0)
@@ -1754,10 +1759,12 @@ tsetattr(int *attr, int l) {
                default:
                        if(BETWEEN(attr[i], 30, 37)) {
                                term.c.attr.fg = attr[i] - 30;
+                               term.c.attr.fgcustcolor = True;
                        } else if(BETWEEN(attr[i], 40, 47)) {
                                term.c.attr.bg = attr[i] - 40;
                        } else if(BETWEEN(attr[i], 90, 97)) {
                                term.c.attr.fg = attr[i] - 90 + 8;
+                               term.c.attr.fgcustcolor = True;
                        } else if(BETWEEN(attr[i], 100, 107)) {
                                term.c.attr.bg = attr[i] - 100 + 8;
                        } else {
@@ -3153,15 +3160,17 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, 
int bytelen) {
        }
 
        if(base.mode & ATTR_BOLD) {
-               if(BETWEEN(base.fg, 0, 7)) {
-                       /* basic system colors */
-                       fg = &dc.col[base.fg + 8];
-               } else if(BETWEEN(base.fg, 16, 195)) {
-                       /* 256 colors */
-                       fg = &dc.col[base.fg + 36];
-               } else if(BETWEEN(base.fg, 232, 251)) {
-                       /* greyscale */
-                       fg = &dc.col[base.fg + 4];
+               if (base.fgcustcolor) {
+                       if(BETWEEN(base.fg, 0, 7)) {
+                               /* basic system colors */
+                               fg = &dc.col[base.fg + 8];
+                       } else if(BETWEEN(base.fg, 16, 195)) {
+                               /* 256 colors */
+                               fg = &dc.col[base.fg + 36];
+                       } else if(BETWEEN(base.fg, 232, 251)) {
+                               /* greyscale */
+                               fg = &dc.col[base.fg + 4];
+                       }
                }
                /*
                 * Those ranges will not be brightened:
-- 
1.9.2


Reply via email to