diff options
| author | Ryusei Yamaguchi <mandel59@gmail.com> | 2016-03-08 12:26:04 +0900 | 
|---|---|---|
| committer | Christoph Lohmann <20h@r-36.net> | 2016-03-08 13:46:42 +0100 | 
| commit | 034a5c8a09e23ce0a410d0c608dd7e050b83681e (patch) | |
| tree | 6e5baa21a777ccac547125653c4389ecc18b6e6c | |
| parent | 30440295bc054f37a2a8275acca769cd83bcb780 (diff) | |
Measure the single advance width with a heuristic method
This fix is needed to use dual-width fonts, which have double-width
glyphs (e.g. CJK unified ideographs).
Signed-off-by: Ryusei Yamaguchi <mandel59@gmail.com>
Signed-off-by: Christoph Lohmann <20h@r-36.net>
| -rw-r--r-- | config.def.h | 8 | ||||
| -rw-r--r-- | st.c | 8 | 
2 files changed, 15 insertions, 1 deletions
diff --git a/config.def.h b/config.def.h index fd09d72..a1e7d5a 100644 --- a/config.def.h +++ b/config.def.h @@ -417,3 +417,11 @@ static uint selmasks[] = {  	[SEL_RECTANGULAR] = Mod1Mask,  }; +/* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +static char ascii_printable[] = +	" !\"#$%&'()*+,-./0123456789:;<=>?" +	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +	"`abcdefghijklmnopqrstuvwxyz{|}~"; @@ -68,6 +68,7 @@ char *argv0;  #define LEN(a)			(sizeof(a) / sizeof(a)[0])  #define DEFAULT(a, b)		(a) = (a) ? (a) : (b)  #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b)) +#define DIVCEIL(n, d)		(((n) + ((d) - 1)) / (d))  #define ISCONTROLC0(c)		(BETWEEN(c, 0, 0x1f) || (c) == '\177')  #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f))  #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c)) @@ -3277,6 +3278,7 @@ xloadfont(Font *f, FcPattern *pattern)  {  	FcPattern *match;  	FcResult result; +	XGlyphInfo extents;  	match = FcFontMatch(NULL, pattern, &result);  	if (!match) @@ -3287,6 +3289,10 @@ xloadfont(Font *f, FcPattern *pattern)  		return 1;  	} +	XftTextExtentsUtf8(xw.dpy, f->match, +		(const FcChar8 *) ascii_printable, +		LEN(ascii_printable), &extents); +  	f->set = NULL;  	f->pattern = FcPatternDuplicate(pattern); @@ -3296,7 +3302,7 @@ xloadfont(Font *f, FcPattern *pattern)  	f->rbearing = f->match->max_advance_width;  	f->height = f->ascent + f->descent; -	f->width = f->lbearing + f->rbearing; +	f->width = DIVCEIL(extents.xOff, LEN(ascii_printable));  	return 0;  }  | 
