cleaning up some old Xft cruft in font.c also, that is no longer needed.
#include <stdlib.h>
#include <locale.h>
-#define OB_SHADOW "shadow"
-#define OB_SHADOW_OFFSET "shadowoffset"
-#define OB_SHADOW_ALPHA "shadowtint"
-
-FcObjectType objs[] = {
- { OB_SHADOW, FcTypeBool },
- { OB_SHADOW_OFFSET, FcTypeInteger },
- { OB_SHADOW_ALPHA, FcTypeInteger }
-};
-
-static gboolean started = FALSE;
-
-static void font_startup(void)
-{
- if (!XftInit(0)) {
- g_warning(_("Couldn't initialize Xft."));
- exit(EXIT_FAILURE);
- }
-
- /* Here we are teaching xft about the shadow, shadowoffset & shadowtint */
- FcNameRegisterObjectTypes(objs, (sizeof(objs) / sizeof(objs[0])));
-}
-
static void measure_font(const RrInstance *inst, RrFont *f)
{
PangoFontMetrics *metrics;
}
RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
- RrFontWeight weight, RrFontSlant slant, gboolean shadow,
- gint shadowoffset, gchar shadowtint)
+ RrFontWeight weight, RrFontSlant slant)
{
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;
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);
RrFont *RrFontOpenDefault(const RrInstance *inst)
{
return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize,
- RrDefaultFontWeight, RrDefaultFontSlant,
- RrDefaultFontShadow, RrDefaultFontShadowOffset,
- RrDefaultFontShadowTint);
+ RrDefaultFontWeight, RrDefaultFontSlant);
}
void RrFontRef(RrFont *f)
}
static void font_measure_full(const RrFont *f, const gchar *str,
- gint *x, gint *y)
+ gint *x, gint *y, gint shadow_offset)
{
PangoRectangle rect;
pango_layout_set_text(f->layout, str, -1);
pango_layout_set_width(f->layout, -1);
pango_layout_get_pixel_extents(f->layout, NULL, &rect);
- *x = rect.width + (f->shadow ? ABS(f->offset) : 0);
- *y = rect.height + (f->shadow ? ABS(f->offset) : 0);
+ *x = rect.width + ABS(shadow_offset);
+ *y = rect.height + ABS(shadow_offset);
}
-RrSize *RrFontMeasureString(const RrFont *f, const gchar *str)
+RrSize *RrFontMeasureString(const RrFont *f, const gchar *str,
+ gint shadow_offset)
{
RrSize *size;
size = g_new(RrSize, 1);
- font_measure_full(f, str, &size->width, &size->height);
+ font_measure_full(f, str, &size->width, &size->height, shadow_offset);
return size;
}
-gint RrFontHeight(const RrFont *f)
+gint RrFontHeight(const RrFont *f, gint shadow_offset)
{
- return (f->ascent + f->descent) / PANGO_SCALE +
- (f->shadow ? f->offset : 0);
+ return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_offset);
}
static inline int font_calculate_baseline(RrFont *f, gint height)
break;
}
- if (t->font->shadow) {
- if (t->font->tint >= 0) {
+ if (t->shadow_offset) {
+ if (t->shadow_tint >= 0) {
c.color.red = 0;
c.color.green = 0;
c.color.blue = 0;
- c.color.alpha = 0xffff * t->font->tint / 100;
+ c.color.alpha = 0xffff * t->shadow_tint / 100;
c.pixel = BlackPixel(RrDisplay(t->font->inst),
RrScreen(t->font->inst));
} else {
c.color.red = 0xffff;
c.color.green = 0xffff;
c.color.blue = 0xffff;
- c.color.alpha = 0xffff * -t->font->tint / 100;
+ c.color.alpha = 0xffff * -t->shadow_tint / 100;
c.pixel = WhitePixel(RrDisplay(t->font->inst),
RrScreen(t->font->inst));
}
/* see below... */
pango_xft_render_layout_line
(d, &c, pango_layout_get_line(t->font->layout, 0),
- (x + t->font->offset) * PANGO_SCALE,
- (y + t->font->offset) * PANGO_SCALE);
+ (x + t->shadow_offset) * PANGO_SCALE,
+ (y + t->shadow_offset) * PANGO_SCALE);
}
c.color.red = t->color->r | t->color->r << 8;
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 shadow;
- gchar tint;
- gint offset;
};
void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
break;
case RR_TEXTURE_TEXT:
m = RrFontMeasureString(a->texture[i].data.text.font,
- a->texture[i].data.text.string);
+ a->texture[i].data.text.string,
+ a->texture[i].data.text.shadow_offset);
*w = MAX(*w, m->width + 4);
- m->height = RrFontHeight(a->texture[i].data.text.font);
+ m->height = RrFontHeight(a->texture[i].data.text.font,
+ a->texture[i].data.text.shadow_offset);
*h += MAX(*h, m->height);
g_free(m);
break;
RrJustify justify;
RrColor *color;
gchar *string;
+ gint shadow_offset;
+ gchar shadow_tint;
};
struct _RrPixmapMask {
#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);
void RrAppearanceFree (RrAppearance *a);
RrFont *RrFontOpen (const RrInstance *inst, gchar *name, gint size,
- RrFontWeight weight, RrFontSlant slant,
- gboolean shadow, gint shadowoffset,
- gchar shadowtint);
+ RrFontWeight weight, RrFontSlant slant);
RrFont *RrFontOpenDefault (const RrInstance *inst);
void RrFontClose (RrFont *f);
-RrSize *RrFontMeasureString (const RrFont *f, const gchar *str);
-gint RrFontHeight (const RrFont *f);
+RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
+ gint shadow_offset);
+gint RrFontHeight (const RrFont *f, gint shadow_offset);
gint RrFontMaxCharWidth (const RrFont *f);
void RrPaint (RrAppearance *a, Window win, gint w, gint h);
#include <string.h>
static XrmDatabase loaddb(RrTheme *theme, gchar *name);
+static gboolean read_bool(XrmDatabase db, gchar *rname, gboolean *value);
static gboolean read_int(XrmDatabase db, gchar *rname, gint *value);
static gboolean read_string(XrmDatabase db, gchar *rname, gchar **value);
static gboolean read_color(XrmDatabase db, const RrInstance *inst,
{
XrmDatabase db = NULL;
RrJustify winjust, mtitlejust;
+ gboolean b;
gchar *str;
RrTheme *theme;
+ gint offset;
+ gint tint;
theme = g_new0(RrTheme, 1);
RrFontRef(active_window_font);
} else
theme->win_font_focused = RrFontOpenDefault(inst);
- theme->win_font_height = RrFontHeight(theme->win_font_focused);
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_LEFT;
if (read_string(db, "window.label.text.justify", &str)) {
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;
if (read_string(db, "menu.title.text.justify", &str)) {
RrFontRef(menu_item_font);
} else
theme->menu_font = RrFontOpenDefault(inst);
- theme->menu_font_height = RrFontHeight(theme->menu_font);
/* load direct dimensions */
if (!read_int(db, "menu.overlap", &theme->menu_overlap) ||
theme->app_hilite_label->texture[0].data.text.color =
theme->title_focused_color;
+ if (read_bool(db, "window.active.label.text.shadow", &b) && b) {
+ if (!read_int(db, "window.active.label.text.shadow.offset", &offset))
+ offset = 1;
+
+ if (!read_int(db, "window.active.label.text.shadow.tint", &tint))
+ tint = 50;
+ tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
+ } else {
+ offset = 0;
+ tint = 50;
+ }
+ theme->a_focused_label->texture[0].data.text.shadow_offset =
+ theme->app_hilite_label->texture[0].data.text.shadow_offset = offset;
+ theme->a_focused_label->texture[0].data.text.shadow_tint =
+ theme->app_hilite_label->texture[0].data.text.shadow_tint = tint;
+
theme->a_unfocused_label->texture[0].type =
theme->app_unhilite_label->texture[0].type = RR_TEXTURE_TEXT;
theme->a_unfocused_label->texture[0].data.text.justify = winjust;
theme->app_unhilite_label->texture[0].data.text.color =
theme->title_unfocused_color;
+ if (read_bool(db, "window.inactive.label.text.shadow", &b) && b) {
+ if (!read_int(db, "window.inactive.label.text.shadow.offset", &offset))
+ offset = 1;
+
+ if (!read_int(db, "window.inactive.label.text.shadow.tint", &tint))
+ tint = 50;
+ tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
+ } else {
+ offset = 0;
+ tint = 50;
+ }
+ theme->a_unfocused_label->texture[0].data.text.shadow_offset =
+ theme->app_unhilite_label->texture[0].data.text.shadow_offset =
+ offset;
+ theme->a_unfocused_label->texture[0].data.text.shadow_tint =
+ theme->app_unhilite_label->texture[0].data.text.shadow_tint = tint;
+
theme->a_menu_title->texture[0].type = RR_TEXTURE_TEXT;
theme->a_menu_title->texture[0].data.text.justify = mtitlejust;
theme->a_menu_title->texture[0].data.text.font = theme->menu_title_font;
theme->a_menu_title->texture[0].data.text.color = theme->menu_title_color;
+ if (read_bool(db, "menu.title.text.shadow", &b) && b) {
+ if (!read_int(db, "menu.title.text.shadow.offset", &offset))
+ offset = 1;
+
+ if (!read_int(db, "menu.title.text.shadow.tint", &tint))
+ tint = 50;
+ tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
+ } else {
+ offset = 0;
+ tint = 50;
+ }
+ theme->a_menu_title->texture[0].data.text.shadow_offset = offset;
+ theme->a_menu_title->texture[0].data.text.shadow_tint = tint;
+
theme->a_menu_text_normal->texture[0].type =
theme->a_menu_text_disabled->texture[0].type =
theme->a_menu_text_selected->texture[0].type = RR_TEXTURE_TEXT;
theme->a_menu_text_selected->texture[0].data.text.color =
theme->menu_selected_color;
+ if (read_bool(db, "menu.items.text.shadow", &b) && b) {
+ if (!read_int(db, "menu.items.text.shadow.offset", &offset))
+ offset = 1;
+
+ if (!read_int(db, "menu.items.text.shadow.tint", &tint))
+ tint = 50;
+ tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
+ } else {
+ offset = 0;
+ tint = 50;
+ }
+ theme->a_menu_text_normal->texture[0].data.text.shadow_offset =
+ theme->a_menu_text_disabled->texture[0].data.text.shadow_offset =
+ theme->a_menu_text_selected->texture[0].data.text.shadow_offset =
+ offset;
+ theme->a_menu_text_normal->texture[0].data.text.shadow_tint =
+ theme->a_menu_text_disabled->texture[0].data.text.shadow_tint =
+ theme->a_menu_text_selected->texture[0].data.text.shadow_tint = tint;
+
theme->a_disabled_focused_max->texture[0].type =
theme->a_disabled_unfocused_max->texture[0].type =
theme->a_hover_focused_max->texture[0].type =
XrmDestroyDatabase(db);
+ /* set the font heights */
+ theme->win_font_height = RrFontHeight
+ (theme->win_font_focused,
+ theme->a_focused_label->texture[0].data.text.shadow_offset);
+ theme->win_font_height =
+ MAX(theme->win_font_height,
+ RrFontHeight
+ (theme->win_font_focused,
+ theme->a_unfocused_label->texture[0].data.text.shadow_offset));
+ theme->menu_title_font_height = RrFontHeight
+ (theme->menu_title_font,
+ theme->a_menu_title->texture[0].data.text.shadow_offset);
+ theme->menu_font_height = RrFontHeight
+ (theme->menu_font,
+ theme->a_menu_text_normal->texture[0].data.text.shadow_offset);
+
+ /* calculate some last extents */
{
gint ft, fb, fl, fr, ut, ub, ul, ur;
return rclass;
}
+static gboolean read_bool(XrmDatabase db, gchar *rname, gint *value)
+{
+ gboolean ret = FALSE;
+ gchar *rclass = create_class_name(rname);
+ gchar *rettype;
+ XrmValue retvalue;
+
+ if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
+ retvalue.addr != NULL) {
+ if (!g_ascii_strcasecmp(retvalue.addr, "true")) {
+ *value = TRUE;
+ ret = TRUE;
+ } else if (!g_ascii_strcasecmp(retvalue.addr, "false")) {
+ *value = FALSE;
+ ret = TRUE;
+ }
+ }
+
+ g_free(rclass);
+ return ret;
+}
+
static gboolean read_int(XrmDatabase db, gchar *rname, gint *value)
{
gboolean ret = FALSE;