all repos — openbox @ 7744067b6b50124c31f647e2943ef1fce9fdec96

openbox fork - make it a bit more like ryudo

moving shadow information out of the themes, and into the Text textures.

cleaning up some old Xft cruft in font.c also, that is no longer needed.
Dana Jansens danakj@orodu.net
commit

7744067b6b50124c31f647e2943ef1fce9fdec96

parent

5109b5ae200133a0d2e86479218ad9debd9e8c11

5 files changed, 135 insertions(+), 72 deletions(-)

jump to
M render/font.crender/font.c

@@ -31,29 +31,6 @@ #include <string.h>

#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;

@@ -76,20 +53,12 @@ g_free(locale);

} 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;

@@ -118,11 +87,6 @@ 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);

@@ -137,9 +101,7 @@

RrFont *RrFontOpenDefault(const RrInstance *inst) { return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize, - RrDefaultFontWeight, RrDefaultFontSlant, - RrDefaultFontShadow, RrDefaultFontShadowOffset, - RrDefaultFontShadowTint); + RrDefaultFontWeight, RrDefaultFontSlant); } void RrFontRef(RrFont *f)

@@ -159,29 +121,29 @@ }

} 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)

@@ -245,27 +207,27 @@ x += (w - mw) / 2;

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;
M render/font.hrender/font.h

@@ -30,9 +30,6 @@ 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 shadow; - gchar tint; - gint offset; }; void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
M render/render.crender/render.c

@@ -348,9 +348,11 @@ *h = MAX(*h, a->texture[i].data.mask.mask->height);

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;
M render/render.hrender/render.h

@@ -121,6 +121,8 @@ RrFont *font;

RrJustify justify; RrColor *color; gchar *string; + gint shadow_offset; + gchar shadow_tint; }; struct _RrPixmapMask {

@@ -190,9 +192,6 @@ #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);

@@ -228,13 +227,12 @@ RrAppearance *RrAppearanceCopy (RrAppearance *a);

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);
M render/theme.crender/theme.c

@@ -32,6 +32,7 @@ #include <stdlib.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,

@@ -51,8 +52,11 @@ RrFont *menu_title_font, RrFont *menu_item_font)

{ XrmDatabase db = NULL; RrJustify winjust, mtitlejust; + gboolean b; gchar *str; RrTheme *theme; + gint offset; + gint tint; theme = g_new0(RrTheme, 1);

@@ -116,15 +120,12 @@ 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 (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)) {

@@ -139,7 +140,6 @@ 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; if (read_string(db, "menu.title.text.justify", &str)) {

@@ -154,7 +154,6 @@ 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 */ if (!read_int(db, "menu.overlap", &theme->menu_overlap) ||

@@ -655,6 +654,22 @@ theme->a_focused_label->texture[0].data.text.color =

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;

@@ -667,11 +682,42 @@ theme->a_unfocused_label->texture[0].data.text.color =

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;

@@ -689,6 +735,25 @@ theme->menu_disabled_color;

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 =

@@ -873,6 +938,23 @@ theme->menu_selected_color;

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;

@@ -1092,6 +1174,28 @@ ++p;

if (*p == '\0') break; } 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)