diff -r c5a118daa7d5 -r 14cb714c4444 st.c --- a/st.c Thu Jan 27 17:51:01 2011 +0100 +++ b/st.c Thu Feb 03 12:14:02 2011 +0100 @@ -142,6 +142,7 @@ short lbearing; short rbearing; XFontSet set; + XFontStruct *xfont; } font, bfont; } DC; @@ -1474,6 +1475,15 @@ } void +xgetxfontinfo(XFontStruct *font, int *ascent, int *descent, short *lbearing, short *rbearing) +{ + *ascent = font->ascent; + *descent = font->descent; + *lbearing = font->min_bounds.lbearing; + *rbearing = font->max_bounds.rbearing; +} + +void xgetfontinfo(XFontSet set, int *ascent, int *descent, short *lbearing, short *rbearing) { XFontStruct **xfonts; @@ -1494,13 +1504,22 @@ void initfonts(char *fontstr, char *bfontstr) { - if((dc.font.set = xinitfont(fontstr)) == NULL || - (dc.bfont.set = xinitfont(bfontstr)) == NULL) - die("Can't load font %s\n", dc.font.set ? BOLDFONT : FONT); - xgetfontinfo(dc.font.set, &dc.font.ascent, &dc.font.descent, - &dc.font.lbearing, &dc.font.rbearing); - xgetfontinfo(dc.bfont.set, &dc.bfont.ascent, &dc.bfont.descent, - &dc.bfont.lbearing, &dc.bfont.rbearing); + if((dc.font.set = xinitfont(fontstr)) != NULL && + (dc.bfont.set = xinitfont(bfontstr)) != NULL) { + xgetfontinfo(dc.font.set, &dc.font.ascent, &dc.font.descent, + &dc.font.lbearing, &dc.font.rbearing); + xgetfontinfo(dc.bfont.set, &dc.bfont.ascent, &dc.bfont.descent, + &dc.bfont.lbearing, &dc.bfont.rbearing); + } + else if ((dc.font.xfont = XLoadQueryFont(xw.dpy, fontstr)) != NULL && + (dc.bfont.xfont = XLoadQueryFont(xw.dpy, bfontstr)) != NULL) { + xgetxfontinfo(dc.font.xfont, &dc.font.ascent, &dc.font.descent, + &dc.font.lbearing, &dc.font.rbearing); + xgetxfontinfo(dc.bfont.xfont, &dc.bfont.ascent, &dc.bfont.descent, + &dc.bfont.lbearing, &dc.bfont.rbearing); + } + else + die("Can't load font %s\n", dc.font.xfont ? BOLDFONT : FONT); } void @@ -1591,8 +1610,15 @@ } } - XmbDrawImageString(xw.dpy, xw.buf, base.mode & ATTR_BOLD ? dc.bfont.set : dc.font.set, - dc.gc, winx, winy, s, bytelen); + if (((base.mode & ATTR_BOLD) && dc.bfont.set) || dc.font.set) { + XmbDrawImageString(xw.dpy, xw.buf, + base.mode & ATTR_BOLD ? dc.bfont.set : dc.font.set, + dc.gc, winx, winy, s, bytelen); + } + else { + XSetFont(xw.dpy, dc.gc, (base.mode & ATTR_BOLD ? dc.bfont : dc.font).xfont->fid); + XDrawImageString(xw.dpy, xw.buf, dc.gc, winx, winy, s, bytelen); + } if(base.mode & ATTR_UNDERLINE) XDrawLine(xw.dpy, xw.buf, dc.gc, winx, winy+1, winx+width-1, winy+1);