X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Ftheme.c;h=c8762181ec3634c835c383887d5fcee6420aef03;hb=7744067b6b50124c31f647e2943ef1fce9fdec96;hp=0e02ae8b1af400c3588b84de4614af0803ef8a0d;hpb=d4b90d3641c2a9845abba9aa7d51939d59951db4;p=chaz%2Fopenbox diff --git a/render/theme.c b/render/theme.c index 0e02ae8b..c8762181 100644 --- a/render/theme.c +++ b/render/theme.c @@ -32,6 +32,7 @@ #include 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, @@ -45,13 +46,17 @@ 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; + gboolean b; gchar *str; - gchar *font_str; RrTheme *theme; + gint offset; + gint tint; theme = g_new0(RrTheme, 1); @@ -110,24 +115,17 @@ 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; - } - 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; - } - theme->win_font_height = MAX(theme->win_font_height, - RrFontHeight(theme->win_font_unfocused)); + if (active_window_font) { + theme->win_font_focused = active_window_font; + RrFontRef(active_window_font); + } else + theme->win_font_focused = RrFontOpenDefault(inst); + + if (inactive_window_font) { + theme->win_font_unfocused = inactive_window_font; + RrFontRef(inactive_window_font); + } else + theme->win_font_unfocused = RrFontOpenDefault(inst); winjust = RR_JUSTIFY_LEFT; if (read_string(db, "window.label.text.justify", &str)) { @@ -137,14 +135,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; - } - theme->menu_title_font_height = RrFontHeight(theme->menu_title_font); + if (menu_title_font) { + theme->menu_title_font = menu_title_font; + RrFontRef(menu_title_font); + } else + theme->menu_title_font = RrFontOpenDefault(inst); mtitlejust = RR_JUSTIFY_LEFT; if (read_string(db, "menu.title.text.justify", &str)) { @@ -154,14 +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; - } - theme->menu_font_height = RrFontHeight(theme->menu_font); + if (menu_item_font) { + theme->menu_font = menu_item_font; + RrFontRef(menu_item_font); + } else + theme->menu_font = RrFontOpenDefault(inst); /* load direct dimensions */ if (!read_int(db, "menu.overlap", &theme->menu_overlap) || @@ -662,6 +654,22 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) 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; @@ -674,11 +682,42 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) 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; @@ -696,6 +735,25 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) 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 = @@ -880,6 +938,23 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) 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; @@ -1101,6 +1176,28 @@ static gchar *create_class_name(gchar *rname) 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;