+ /* measure an elipses */
+#ifndef USE_PANGO
+ XftTextExtentsUtf8(RrDisplay(f->inst), f->xftfont,
+ (FcChar8*)ELIPSES, strlen(ELIPSES), &info);
+ f->elipses_length = (signed) info.xOff;
+#else /* USE_PANGO */
+ XftTextExtentsUtf8(RrDisplay(f->inst), f->xftfont,
+ (FcChar8*)ELIPSES, strlen(ELIPSES), &info);
+ f->elipses_length = (signed) info.xOff;
+#endif /* USE_PANGO */
+}
+
+static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
+{
+ /* This function is called for each font in the theme file. */
+ /* It returns a pointer to a RrFont struct after filling it. */
+ RrFont *out;
+ FcPattern *pat, *match;
+ XftFont *font;
+ FcResult res;
+ gint tint;
+#ifdef USE_PANGO
+ gchar *tmp_string = NULL;
+ gint tmp_int;
+#endif /* USE_PANGO */
+
+ if (!(pat = XftNameParse(fontstring)))
+ return NULL;
+
+ match = XftFontMatch(RrDisplay(inst), RrScreen(inst), pat, &res);
+ FcPatternDestroy(pat);
+ if (!match)
+ return NULL;
+
+ out = g_new(RrFont, 1);
+ out->inst = inst;
+#ifdef USE_PANGO
+ /* printf("\n\n%s\n\n",fontstring);
+ FcPatternPrint(match); */
+
+ out->pango_font_description = pango_font_description_new();
+
+ if (FcPatternGetString(match, "family", 0, &tmp_string) != FcResultTypeMismatch) {
+ pango_font_description_set_family(out->pango_font_description, tmp_string);
+ tmp_string = NULL;
+ }
+ if (FcPatternGetString(match, "style", 0, &tmp_string) != FcResultTypeMismatch) {
+ /* Bold ? */
+ if (!strcasecmp("bold", tmp_string)) {
+ pango_font_description_set_weight(out->pango_font_description, PANGO_WEIGHT_BOLD);
+ }
+ /* Italic ? */
+ else if (!strcasecmp("italic", tmp_string)) {
+ pango_font_description_set_style(out->pango_font_description, PANGO_STYLE_ITALIC);
+ }
+ tmp_string = NULL;
+ }
+
+ if (FcPatternGetInteger(match, "pixelsize", 0, &tmp_int) != FcResultTypeMismatch) {
+ /* TODO: is PANGO_SCALE correct ?? */
+ pango_font_description_set_size(out->pango_font_description, tmp_int*PANGO_SCALE);
+ }
+#endif /* USE_PANGO */
+
+ if (FcPatternGetBool(match, OB_SHADOW, 0, &out->shadow) != FcResultMatch)
+ out->shadow = FALSE;
+
+ if (FcPatternGetInteger(match, OB_SHADOW_OFFSET, 0, &out->offset) !=
+ FcResultMatch)
+ out->offset = 1;
+
+ if (FcPatternGetInteger(match, OB_SHADOW_ALPHA, 0, &tint) != FcResultMatch)
+ tint = 25;
+ if (tint > 100) tint = 100;
+ else if (tint < -100) tint = -100;
+ out->tint = tint;
+
+ font = XftFontOpenPattern(RrDisplay(inst), match);
+ if (!font) {
+ FcPatternDestroy(match);
+ g_free(out);
+ return NULL;
+ } else
+ out->xftfont = font;