From 6900cd36121062f81f29ec3651aa1ee8807edbe1 Mon Sep 17 00:00:00 2001 From: okan Date: Mon, 17 Dec 2012 02:28:45 +0000 Subject: non-trivial menu drawing rewrite, moving to Xft and solving various font/color drawing issues; from Alexander Polakov --- font.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'font.c') diff --git a/font.c b/font.c index 0e1c144..cbd5b56 100644 --- a/font.c +++ b/font.c @@ -49,20 +49,37 @@ font_height(struct screen_ctx *sc) } void -font_init(struct screen_ctx *sc, const char *name, const char *color) +font_init(struct screen_ctx *sc, const char *name, const char **color) { + int i; + XRenderColor c; + sc->xftdraw = XftDrawCreate(X_Dpy, sc->rootwin, DefaultVisual(X_Dpy, sc->which), DefaultColormap(X_Dpy, sc->which)); if (sc->xftdraw == NULL) errx(1, "XftDrawCreate"); - if (!XftColorAllocName(X_Dpy, DefaultVisual(X_Dpy, sc->which), - DefaultColormap(X_Dpy, sc->which), color, &sc->xftcolor)) - errx(1, "XftColorAllocName"); - sc->font = XftFontOpenName(X_Dpy, sc->which, name); if (sc->font == NULL) errx(1, "XftFontOpenName"); + for(i = 0; i < CWM_COLOR_MENU_MAX; i++) { + if (*color[i] == '\0') + break; + if (!XftColorAllocName(X_Dpy, DefaultVisual(X_Dpy, sc->which), + DefaultColormap(X_Dpy, sc->which), color[i], + &sc->xftcolor[i])) + errx(1, "XftColorAllocName"); + } + if (i == CWM_COLOR_MENU_MAX) + return; + + xu_xorcolor(sc->xftcolor[CWM_COLOR_MENU_BG].color, + sc->xftcolor[CWM_COLOR_MENU_FG].color, &c); + xu_xorcolor(sc->xftcolor[CWM_COLOR_MENU_FONT].color, c, &c); + if (!XftColorAllocValue(X_Dpy, DefaultVisual(X_Dpy, sc->which), + DefaultColormap(X_Dpy, sc->which), &c, + &sc->xftcolor[CWM_COLOR_MENU_FONT_SEL])) + errx(1, "XftColorAllocValue"); } int @@ -78,9 +95,12 @@ font_width(struct screen_ctx *sc, const char *text, int len) void font_draw(struct screen_ctx *sc, const char *text, int len, - Drawable d, int x, int y) + Drawable d, int active, int x, int y) { + int color; + + color = active ? CWM_COLOR_MENU_FONT_SEL : CWM_COLOR_MENU_FONT; XftDrawChange(sc->xftdraw, d); - XftDrawStringUtf8(sc->xftdraw, &sc->xftcolor, sc->font, x, y, + XftDrawStringUtf8(sc->xftdraw, &sc->xftcolor[color], sc->font, x, y, (const FcChar8*)text, len); } -- cgit 1.4.1