g_free(locale);
}
-static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
+static RrFont *openfontstring(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;
gint tint;
out = g_new(RrFont, 1);
out->inst = inst;
+ out->ref = 1;
out->font_desc = pango_font_description_new();
out->layout = pango_layout_new(inst->pango);
/* get the ascent and descent */
measure_font(inst, out);
+ FcPatternDestroy(pat);
+
return out;
}
-RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring)
+RrFont *RrFontOpenByString(const RrInstance *inst, gchar *fontstring)
{
RrFont *out;
started = TRUE;
}
- if ((out = openfont(inst, fontstring)))
+ if ((out = openfontstring(inst, fontstring)))
return out;
g_warning(_("Unable to load font: %s\n"), fontstring);
g_warning(_("Trying fallback font: %s\n"), "sans");
- if ((out = openfont(inst, "sans")))
+ if ((out = openfontstring(inst, "sans")))
return out;
g_warning(_("Unable to load font: %s\n"), "sans");
return NULL;
}
+RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
+ RrFontWeight weight, RrFontSlant slant, gboolean shadow,
+ gint shadowoffset, gchar shadowtint)
+{
+ RrFont *out;
+ PangoWeight pweight;
+ PangoStyle pstyle;
+
+ if (!started) {
+ font_startup();
+ started = TRUE;
+ }
+
+ g_assert(shadowtint <= 100 && shadowtint >= -100);
+
+ out = g_new(RrFont, 1);
+ out->inst = inst;
+ out->ref = 1;
+ out->font_desc = pango_font_description_new();
+ out->layout = pango_layout_new(inst->pango);
+
+ switch (weight) {
+ case RR_FONTWEIGHT_LIGHT: pweight = PANGO_WEIGHT_LIGHT; break;
+ case RR_FONTWEIGHT_NORMAL: pweight = PANGO_WEIGHT_NORMAL; break;
+ case RR_FONTWEIGHT_SEMIBOLD: pweight = PANGO_WEIGHT_SEMIBOLD; break;
+ case RR_FONTWEIGHT_BOLD: pweight = PANGO_WEIGHT_BOLD; break;
+ case RR_FONTWEIGHT_ULTRABOLD: pweight = PANGO_WEIGHT_ULTRABOLD; break;
+ default: g_assert_not_reached();
+ }
+
+ switch (slant) {
+ case RR_FONTSLANT_NORMAL: pstyle = PANGO_STYLE_NORMAL; break;
+ case RR_FONTSLANT_ITALIC: pstyle = PANGO_STYLE_ITALIC; break;
+ case RR_FONTSLANT_OBLIQUE: pstyle = PANGO_STYLE_OBLIQUE; break;
+ default: g_assert_not_reached();
+ }
+
+ /* setup the font */
+ pango_font_description_set_family(out->font_desc, name);
+ pango_font_description_set_weight(out->font_desc, pweight);
+ pango_font_description_set_style(out->font_desc, pstyle);
+ pango_font_description_set_size(out->font_desc, size * PANGO_SCALE);
+
+ /* setup the shadow */
+ out->shadow = shadow;
+ out->offset = shadowoffset;
+ out->tint = shadowtint;
+
+ /* setup the layout */
+ pango_layout_set_font_description(out->layout, out->font_desc);
+ pango_layout_set_single_paragraph_mode(out->layout, TRUE);
+ pango_layout_set_ellipsize(out->layout, PANGO_ELLIPSIZE_MIDDLE);
+
+ /* get the ascent and descent */
+ measure_font(inst, out);
+
+ return out;
+}
+
+RrFont *RrFontOpenDefault(const RrInstance *inst)
+{
+ return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize,
+ RrDefaultFontWeight, RrDefaultFontSlant,
+ RrDefaultFontShadow, RrDefaultFontShadowOffset,
+ RrDefaultFontShadowTint);
+}
+
+void RrFontRef(RrFont *f)
+{
+ ++f->ref;
+}
+
void RrFontClose(RrFont *f)
{
if (f) {
- g_object_unref(f->layout);
- pango_font_description_free(f->font_desc);
- g_free(f);
+ if (--f->ref < 1) {
+ g_object_unref(f->layout);
+ pango_font_description_free(f->font_desc);
+ g_free(f);
+ }
}
}
struct _RrFont {
const RrInstance *inst;
+ gint ref;
PangoFontDescription *font_desc;
PangoLayout *layout; /*!< Used for measuring and rendering strings */
gint ascent; /*!< The font's ascent in pango-units */
gint descent; /*!< The font's descent in pango-units */
- gint elipses_length; /*!< This one is in pixels, yay */
gint shadow;
gchar tint;
gint offset;
};
-RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring);
-void RrFontClose(RrFont *f);
void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
+/*! Increment the references for this font, RrFontClose will decrement until 0
+ and then really close it */
+void RrFontRef(RrFont *f);
+
#endif /* __font_h */
#define RrDefaultGreenOffset 8
#define RrDefaultBlueOffset 0
+#define RrDefaultFontFamily "arial,sans"
+#define RrDefaultFontSize 8
+#define RrDefaultFontWeight RR_FONTWEIGHT_NORMAL
+#define RrDefaultFontSlant RR_FONTSLANT_NORMAL
+#define RrDefaultFontShadow FALSE
+#define RrDefaultFontShadowOffset 1
+#define RrDefaultFontShadowTint 50
+
RrInstance* RrInstanceNew (Display *display, gint screen);
void RrInstanceFree (RrInstance *inst);
RrAppearance *RrAppearanceCopy (RrAppearance *a);
void RrAppearanceFree (RrAppearance *a);
+RrFont *RrFontOpenByString (const RrInstance *inst, gchar *fontstring);
+RrFont *RrFontOpen (const RrInstance *inst, gchar *name, gint size,
+ RrFontWeight weight, RrFontSlant slant,
+ gboolean shadow, gint shadowoffset,
+ gchar shadowtint);
+RrFont *RrFontOpenDefault (const RrInstance *inst);
+void RrFontClose (RrFont *f);
RrSize *RrFontMeasureString (const RrFont *f, const gchar *str);
-gint RrFontHeight (const RrFont *f);
-gint RrFontMaxCharWidth (const RrFont *f);
+gint RrFontHeight (const RrFont *f);
+gint RrFontMaxCharWidth (const RrFont *f);
void RrPaint (RrAppearance *a, Window win, gint w, gint h);
void RrMinsize (RrAppearance *a, gint *w, gint *h);
static RrPixel32* read_c_image(gint width, gint height, const guint8 *data);
static void set_default_appearance(RrAppearance *a);
-RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
+RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
+ RrFont *active_window_font, RrFont *inactive_window_font,
+ RrFont *menu_title_font, RrFont *menu_item_font)
{
XrmDatabase db = NULL;
RrJustify winjust, mtitlejust;
gchar *str;
- gchar *font_str;
RrTheme *theme;
theme = g_new0(RrTheme, 1);
}
/* load the font stuff */
- if (!read_string(db, "window.active.label.text.font", &font_str))
- font_str = "arial,sans:bold:pixelsize=10:shadow=y:shadowtint=50";
-
- if (!(theme->win_font_focused = RrFontOpen(inst, font_str))) {
- RrThemeFree(theme);
- return NULL;
- }
+ if (active_window_font) {
+ theme->win_font_focused = active_window_font;
+ RrFontRef(active_window_font);
+ } else
+ theme->win_font_focused = RrFontOpenDefault(inst);
theme->win_font_height = RrFontHeight(theme->win_font_focused);
- if (!read_string(db, "window.inactive.label.text.font", &font_str))
- /* font_str will already be set to the last one */;
-
- if (!(theme->win_font_unfocused = RrFontOpen(inst, font_str))) {
- RrThemeFree(theme);
- return NULL;
- }
+ if (inactive_window_font) {
+ theme->win_font_unfocused = inactive_window_font;
+ RrFontRef(inactive_window_font);
+ } else
+ theme->win_font_unfocused = RrFontOpenDefault(inst);
theme->win_font_height = MAX(theme->win_font_height,
RrFontHeight(theme->win_font_unfocused));
winjust = RR_JUSTIFY_CENTER;
}
- if (!read_string(db, "menu.title.text.font", &font_str))
- font_str = "arial,sans:bold:pixelsize=12:shadow=y";
-
- if (!(theme->menu_title_font = RrFontOpen(inst, font_str))) {
- RrThemeFree(theme);
- return NULL;
- }
+ if (menu_title_font) {
+ theme->menu_title_font = menu_title_font;
+ RrFontRef(menu_title_font);
+ } else
+ theme->menu_title_font = RrFontOpenDefault(inst);
theme->menu_title_font_height = RrFontHeight(theme->menu_title_font);
mtitlejust = RR_JUSTIFY_LEFT;
mtitlejust = RR_JUSTIFY_CENTER;
}
- if (!read_string(db, "menu.items.font", &font_str))
- font_str = "arial,sans:bold:pixelsize=11:shadow=y";
-
- if (!(theme->menu_font = RrFontOpen(inst, font_str))) {
- RrThemeFree(theme);
- return NULL;
- }
+ if (menu_item_font) {
+ theme->menu_font = menu_item_font;
+ RrFontRef(menu_item_font);
+ } else
+ theme->menu_font = RrFontOpenDefault(inst);
theme->menu_font_height = RrFontHeight(theme->menu_font);
/* load direct dimensions */
};
-RrTheme* RrThemeNew(const RrInstance *inst, gchar *theme);
+/*! The font values are all optional. If a NULL is used for any of them, then
+ the default font will be used. */
+RrTheme* RrThemeNew(const RrInstance *inst, gchar *theme,
+ RrFont *active_window_font, RrFont *inactive_window_font,
+ RrFont *menu_title_font, RrFont *menu_item_font);
void RrThemeFree(RrTheme *theme);
G_END_DECLS