X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Ftheme.c;h=c8762181ec3634c835c383887d5fcee6420aef03;hb=7744067b6b50124c31f647e2943ef1fce9fdec96;hp=0185469cafc8766819c88620440dc958f92f399c;hpb=50292dbd75763a192eee748cc6c0b3e15505e7fe;p=chaz%2Fopenbox diff --git a/render/theme.c b/render/theme.c index 0185469c..c8762181 100644 --- a/render/theme.c +++ b/render/theme.c @@ -1,6 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- theme.c for the Openbox window manager + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -31,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, @@ -44,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); @@ -109,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)) { @@ -136,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)) { @@ -153,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) || @@ -661,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; @@ -673,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; @@ -695,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 = @@ -879,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; @@ -904,7 +980,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) theme->padding * 2; } theme->button_size = theme->label_height - 2; - theme->grip_width = theme->title_height * 1.5; + theme->grip_width = 25; return theme; } @@ -1100,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; @@ -1196,14 +1294,14 @@ static void parse_appearance(gchar *tex, RrSurfaceColorType *grad, *grad = RR_SURFACE_CROSS_DIAGONAL; else if (strstr(tex, "pyramid") != NULL) *grad = RR_SURFACE_PYRAMID; - else if (strstr(tex, "osx") != NULL) - *grad = RR_SURFACE_OSX; + else if (strstr(tex, "mirrorhorizontal") != NULL) + *grad = RR_SURFACE_MIRROR_HORIZONTAL; else if (strstr(tex, "horizontal") != NULL) *grad = RR_SURFACE_HORIZONTAL; + else if (strstr(tex, "splitvertical") != NULL) + *grad = RR_SURFACE_SPLIT_VERTICAL; else if (strstr(tex, "vertical") != NULL) *grad = RR_SURFACE_VERTICAL; - else if (strstr(tex, "split") != NULL) - *grad = RR_SURFACE_SPLIT; else *grad = RR_SURFACE_DIAGONAL; } else {