X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=031272ff41a7c468414c02442f9abe3234553794;hb=fa9a4599720703932d1c4f16b9aeee1f91f96263;hp=4d4438816e38ff7d1c836b03e11973fb36419177;hpb=8c99915608beee03eca3bae6ed92264a0da87e2f;p=st.git diff --git a/st.c b/st.c index 4d44388..031272f 100644 --- a/st.c +++ b/st.c @@ -2490,22 +2490,22 @@ csidump(void) int i; uint c; - printf("ESC["); + fprintf(stderr, "ESC["); for (i = 0; i < csiescseq.len; i++) { c = csiescseq.buf[i] & 0xff; if (isprint(c)) { - putchar(c); + putc(c, stderr); } else if (c == '\n') { - printf("(\\n)"); + fprintf(stderr, "(\\n)"); } else if (c == '\r') { - printf("(\\r)"); + fprintf(stderr, "(\\r)"); } else if (c == 0x1b) { - printf("(\\e)"); + fprintf(stderr, "(\\e)"); } else { - printf("(%02x)", c); + fprintf(stderr, "(%02x)", c); } } - putchar('\n'); + putc('\n', stderr); } void @@ -2594,24 +2594,25 @@ strdump(void) int i; uint c; - printf("ESC%c", strescseq.type); + fprintf(stderr, "ESC%c", strescseq.type); for (i = 0; i < strescseq.len; i++) { c = strescseq.buf[i] & 0xff; if (c == '\0') { + putc('\n', stderr); return; } else if (isprint(c)) { - putchar(c); + putc(c, stderr); } else if (c == '\n') { - printf("(\\n)"); + fprintf(stderr, "(\\n)"); } else if (c == '\r') { - printf("(\\r)"); + fprintf(stderr, "(\\r)"); } else if (c == 0x1b) { - printf("(\\e)"); + fprintf(stderr, "(\\e)"); } else { - printf("(%02x)", c); + fprintf(stderr, "(%02x)", c); } } - printf("ESC\\\n"); + fprintf(stderr, "ESC\\\n"); } void @@ -3372,16 +3373,32 @@ xgeommasktogravity(int mask) int xloadfont(Font *f, FcPattern *pattern) { + FcPattern *configured; FcPattern *match; FcResult result; XGlyphInfo extents; int wantattr, haveattr; - match = XftFontMatch(xw.dpy, xw.scr, pattern, &result); - if (!match) + /* + * Manually configure instead of calling XftMatchFont + * so that we can use the configured pattern for + * "missing glyph" lookups. + */ + configured = FcPatternDuplicate(pattern); + if (!configured) + return 1; + + FcConfigSubstitute(NULL, configured, FcMatchPattern); + XftDefaultSubstitute(xw.dpy, xw.scr, configured); + + match = FcFontMatch(NULL, configured, &result); + if (!match) { + FcPatternDestroy(configured); return 1; + } if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { + FcPatternDestroy(configured); FcPatternDestroy(match); return 1; } @@ -3413,7 +3430,7 @@ xloadfont(Font *f, FcPattern *pattern) strlen(ascii_printable), &extents); f->set = NULL; - f->pattern = FcPatternDuplicate(pattern); + f->pattern = configured; f->ascent = f->match->ascent; f->descent = f->match->descent; @@ -3471,6 +3488,9 @@ xloadfonts(char *fontstr, double fontsize) if (usedfontsize < 0) { FcPatternGetDouble(dc.font.match->pattern, FC_PIXEL_SIZE, 0, &fontval); + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); + if (xloadfont(&dc.font, pattern)) + die("st: can't open font %s\n", fontstr); usedfontsize = fontval; if (fontsize == 0) defaultfontsize = fontval;