+ int x,y,w,h;
+ XftColor c;
+ char *text;
+ int m;
+ size_t l;
+
+ y = position->y;
+ w = position->width;
+ h = position->height;
+
+ /* accomidate for areas bigger/smaller than Xft thinks the font is tall */
+ y -= (2 * (t->font->xftfont->ascent + t->font->xftfont->descent) -
+ (t->font->height + h) - 1) / 2;
+
+ text = g_strdup(t->string);
+ l = strlen(text);
+ m = font_measure_string(t->font, text, t->shadow, t->offset);
+ while (l && m > position->width) {
+ text[--l] = '\0';
+ m = font_measure_string(t->font, text, t->shadow, t->offset);
+ }
+ if (!l) return;
+
+ switch (t->justify) {
+ case Justify_Left:
+ x = position->x;
+ break;
+ case Justify_Right:
+ x = position->x + (w - m);
+ break;
+ case Justify_Center:
+ x = position->x + (w - m) / 2;
+ break;
+ }
+
+ if (t->shadow) {
+ if (t->tint >= 0) {
+ c.color.red = 0;
+ c.color.green = 0;
+ c.color.blue = 0;
+ c.color.alpha = 0xffff * t->tint / 100; /* transparent shadow */
+ c.pixel = BlackPixel(ob_display, ob_screen);
+ } else {
+ c.color.red = 0xffff * -t->tint / 100;
+ c.color.green = 0xffff * -t->tint / 100;
+ c.color.blue = 0xffff * -t->tint / 100;
+ c.color.alpha = 0xffff * -t->tint / 100; /* transparent shadow */
+ c.pixel = WhitePixel(ob_display, ob_screen);
+ }
+ XftDrawStringUtf8(d, &c, t->font->xftfont, x + t->offset,
+ t->font->xftfont->ascent + y + t->offset,
+ (FcChar8*)text, l);
+ }
+ c.color.red = t->color->r | t->color->r << 8;
+ c.color.green = t->color->g | t->color->g << 8;
+ c.color.blue = t->color->b | t->color->b << 8;
+ c.color.alpha = 0xff | 0xff << 8; /* fully opaque text */
+ c.pixel = t->color->pixel;
+
+ XftDrawStringUtf8(d, &c, t->font->xftfont, x,
+ t->font->xftfont->ascent + y,
+ (FcChar8*)text, l);
+ return;