@@ -360,9 +360,40 @@ void win_clear(win_t *win)
XFillRectangle(e->dpy, win->buf.pm, gc, 0, 0, win->buf.w, win->buf.h);
}
void win_draw_bar_text(win_t *win, XftDraw *d, XftColor *color, XftFont *font, int x, int y, char *text, int maxlen, int maximum_x)
{
size_t len = 0;
int xshift = 0, newshift;
long codep;
char *p, *nextp;
FcCharSet* fccharset;
XftFont* fallback = NULL;
for (p = text; *p && (len < maxlen); p = nextp, len++) {
nextp = utf8codepoint(p, &codep);
if (!XftCharExists(win->env.dpy, font, codep)) {
fccharset = FcCharSetCreate();
FcCharSetAddChar(fccharset, codep);
fallback = XftFontOpen(win->env.dpy, win->env.scr,
FC_CHARSET, FcTypeCharSet, fccharset,
FC_SCALABLE, FcTypeBool, FcTrue,
NULL);
FcCharSetDestroy(fccharset);
}
newshift = win_textwidth(&win->env, p, (int) (nextp-p), false, (fallback ? fallback : font));
if (xshift + newshift <= maximum_x)
XftDrawStringUtf8(d, color, (fallback ? fallback : font), x + xshift, y, (XftChar8*)p, (int) (nextp-p));
xshift += newshift;
if (fallback) {
XftFontClose(win->env.dpy, fallback);
fallback = NULL;
}
}
}
void win_draw_bar(win_t *win)
{
int len, olen, x, y, w, tw;
int len, olen, x, y, w, tw, maximum_x ;
char rest[3];
const char *dots = "...";
win_env_t *e;
@@ -385,7 +416,7 @@ void win_draw_bar(win_t *win)
XSetBackground(e->dpy, gc, win->bar.bgcol.pixel);
if ((len = strlen(r->buf)) > 0) {
if ((tw = win_textwidth(e, r->buf, len, true)) > w)
if ((tw = win_textwidth(e, r->buf, len, true, font )) > w)
return;
x = win->w - tw + H_TEXT_PAD;
w -= tw;
@@ -393,9 +424,10 @@ void win_draw_bar(win_t *win)
}
if ((len = strlen(l->buf)) > 0) {
olen = len;
while (len > 0 && (tw = win_textwidth(e, l->buf, len, true)) > w)
while (len > 0 && (tw = win_textwidth(e, l->buf, len, true, font )) > w)
len--;
if (len > 0) {
maximum_x = w;
if (len != olen) {
w = strlen(dots);
if (len <= w)
@@ -404,7 +436,7 @@ void win_draw_bar(win_t *win)
memcpy(l->buf + len - w, dots, w);
}
x = H_TEXT_PAD;
XftDrawStringUtf8(d, &win->bar.fgcol, font, x, y, (XftChar8*)l->buf, len );
win_draw_bar_text(win, d, &win->bar.fgcol, font, x, y, l->buf, len, maximum_x );
if (len != olen)
memcpy(l->buf + len - w, rest, w);
}
@@ -437,11 +469,14 @@ void win_draw_rect(win_t *win, int x, int y, int w, int h, bool fill, int lw,
XDrawRectangle(win->env.dpy, win->buf.pm, gc, x, y, w, h);
}
int win_textwidth(const win_env_t *e, const char *text, unsigned int len, bool with_padding)
int win_textwidth(const win_env_t *e, const char *text, unsigned int len, bool with_padding, XftFont *fnt )
{
XGlyphInfo ext;
XftTextExtentsUtf8(e->dpy, font, (XftChar8*)text, len, &ext);
if(!fnt)
fnt = font;
XftTextExtentsUtf8(e->dpy, fnt, (XftChar8*)text, len, &ext);
return ext.xOff + (with_padding ? 2 * H_TEXT_PAD : 0);
}