summary refs log tree commit diff
path: root/font.c
diff options
context:
space:
mode:
authorokan <okan>2012-12-17 02:28:45 +0000
committerokan <okan>2012-12-17 02:28:45 +0000
commit6900cd36121062f81f29ec3651aa1ee8807edbe1 (patch)
treebbbf15f9401923e29d45105572ce8727e74c3267 /font.c
parenta3aaad2c187278b7ac1cf75cb03882dd3d20f29b (diff)
downloadcwm-6900cd36121062f81f29ec3651aa1ee8807edbe1.tar.gz
cwm-6900cd36121062f81f29ec3651aa1ee8807edbe1.tar.xz
cwm-6900cd36121062f81f29ec3651aa1ee8807edbe1.zip
non-trivial menu drawing rewrite, moving to Xft and solving various
font/color drawing issues; from Alexander Polakov
Diffstat (limited to 'font.c')
-rw-r--r--font.c34
1 files changed, 27 insertions, 7 deletions
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);
 }