fonts are no longer loaded from the theme file. instead, they are created by the application and passed in while creating/loading a theme

This commit is contained in:
Dana Jansens 2007-03-04 07:12:34 +00:00
parent aeda86f460
commit 43d0f79057
5 changed files with 134 additions and 45 deletions

View file

@ -75,10 +75,8 @@ static void measure_font(const RrInstance *inst, RrFont *f)
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;
@ -90,6 +88,7 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
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);
@ -156,10 +155,12 @@ static RrFont *openfont(const RrInstance *inst, gchar *fontstring)
/* 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;
@ -168,24 +169,98 @@ RrFont *RrFontOpen(const RrInstance *inst, gchar *fontstring)
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);
}
}
}

View file

@ -25,18 +25,20 @@
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 */

View file

@ -186,6 +186,14 @@ struct _RrAppearance {
#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);
@ -219,9 +227,16 @@ RrAppearance *RrAppearanceNew (const RrInstance *inst, gint numtex);
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);

View file

@ -45,12 +45,13 @@ static gboolean read_appearance(XrmDatabase db, const RrInstance *inst,
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);
@ -110,22 +111,18 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
}
/* 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));
@ -137,13 +134,11 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
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;
@ -154,13 +149,11 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name)
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 */

View file

@ -187,7 +187,11 @@ struct _RrTheme {
};
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