Introduction
Introduction Statistics Contact Development Disclaimer Help
Measure the single advance width with a heuristic method - st - simple terminal
git clone git://git.suckless.org/st
Log
Files
Refs
README
LICENSE
---
commit 034a5c8a09e23ce0a410d0c608dd7e050b83681e
parent 30440295bc054f37a2a8275acca769cd83bcb780
Author: Ryusei Yamaguchi <[email protected]>
Date: Tue, 8 Mar 2016 12:26:04 +0900
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 <[email protected]>
Signed-off-by: Christoph Lohmann <[email protected]>
Diffstat:
M config.def.h | 8 ++++++++
M st.c | 8 +++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
---
diff --git 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{|}~";
diff --git a/st.c b/st.c
@@ -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;
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.