aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Rameau <quinq@fifth.space>2016-10-22 16:36:10 +0200
committerQuentin Rameau <quinq@fifth.space>2016-10-23 17:56:46 +0200
commit8c99915608beee03eca3bae6ed92264a0da87e2f (patch)
tree4015d54adca3c9480c2c2f7459d85272c4c96013
parent7854fde1ff95ba85239ccfe1b59b555bd245d0db (diff)
downloadst-8c99915608beee03eca3bae6ed92264a0da87e2f.tar.gz
st-8c99915608beee03eca3bae6ed92264a0da87e2f.zip
Do not use color when font attributes are supported
If fontconfig gives us a font without the attributes we asked for, display an alternative color instead.
-rw-r--r--config.def.h8
-rw-r--r--st.c40
2 files changed, 35 insertions, 13 deletions
diff --git a/config.def.h b/config.def.h
index c2e4ffd..7f465d1 100644
--- a/config.def.h
+++ b/config.def.h
@@ -138,12 +138,10 @@ static unsigned int mousefg = 7;
138static unsigned int mousebg = 0; 138static unsigned int mousebg = 0;
139 139
140/* 140/*
141 * Colors used, when the specific fg == defaultfg. So in reverse mode this 141 * Color used to display font attributes when fontconfig selected a font which
142 * will reverse too. Another logic would only make the simple feature too 142 * doesn't match the ones requested.
143 * complex.
144 */ 143 */
145static unsigned int defaultitalic = 11; 144static unsigned int defaultattr = 11;
146static unsigned int defaultunderline = 7;
147 145
148/* 146/*
149 * Internal mouse shortcuts. 147 * Internal mouse shortcuts.
diff --git a/st.c b/st.c
index c67623f..4d44388 100644
--- a/st.c
+++ b/st.c
@@ -354,6 +354,8 @@ typedef struct {
354 int width; 354 int width;
355 int ascent; 355 int ascent;
356 int descent; 356 int descent;
357 int badslant;
358 int badweight;
357 short lbearing; 359 short lbearing;
358 short rbearing; 360 short rbearing;
359 XftFont *match; 361 XftFont *match;
@@ -3373,6 +3375,7 @@ xloadfont(Font *f, FcPattern *pattern)
3373 FcPattern *match; 3375 FcPattern *match;
3374 FcResult result; 3376 FcResult result;
3375 XGlyphInfo extents; 3377 XGlyphInfo extents;
3378 int wantattr, haveattr;
3376 3379
3377 match = XftFontMatch(xw.dpy, xw.scr, pattern, &result); 3380 match = XftFontMatch(xw.dpy, xw.scr, pattern, &result);
3378 if (!match) 3381 if (!match)
@@ -3383,6 +3386,28 @@ xloadfont(Font *f, FcPattern *pattern)
3383 return 1; 3386 return 1;
3384 } 3387 }
3385 3388
3389 if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) ==
3390 XftResultMatch)) {
3391 /*
3392 * Check if xft was unable to find a font with the appropriate
3393 * slant but gave us one anyway. Try to mitigate.
3394 */
3395 if ((XftPatternGetInteger(f->match->pattern, "slant", 0,
3396 &haveattr) != XftResultMatch) || haveattr < wantattr) {
3397 f->badslant = 1;
3398 fputs("st: font slant does not match\n", stderr);
3399 }
3400 }
3401
3402 if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) ==
3403 XftResultMatch)) {
3404 if ((XftPatternGetInteger(f->match->pattern, "weight", 0,
3405 &haveattr) != XftResultMatch) || haveattr != wantattr) {
3406 f->badweight = 1;
3407 fputs("st: font weight does not match\n", stderr);
3408 }
3409 }
3410
3386 XftTextExtentsUtf8(xw.dpy, f->match, 3411 XftTextExtentsUtf8(xw.dpy, f->match,
3387 (const FcChar8 *) ascii_printable, 3412 (const FcChar8 *) ascii_printable,
3388 strlen(ascii_printable), &extents); 3413 strlen(ascii_printable), &extents);
@@ -3780,14 +3805,13 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
3780 XRenderColor colfg, colbg; 3805 XRenderColor colfg, colbg;
3781 XRectangle r; 3806 XRectangle r;
3782 3807
3783 /* Determine foreground and background colors based on mode. */ 3808 /* Fallback on color display for attributes not supported by the font */
3784 if (base.fg == defaultfg) { 3809 if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) {
3785 if (base.mode & ATTR_ITALIC) 3810 if (dc.ibfont.badslant || dc.ibfont.badweight)
3786 base.fg = defaultitalic; 3811 base.fg = defaultattr;
3787 else if ((base.mode & ATTR_ITALIC) && (base.mode & ATTR_BOLD)) 3812 } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) ||
3788 base.fg = defaultitalic; 3813 (base.mode & ATTR_BOLD && dc.bfont.badweight)) {
3789 else if (base.mode & ATTR_UNDERLINE) 3814 base.fg = defaultattr;
3790 base.fg = defaultunderline;
3791 } 3815 }
3792 3816
3793 if (IS_TRUECOL(base.fg)) { 3817 if (IS_TRUECOL(base.fg)) {