#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,
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);
}
/* 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)) {
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)) {
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) ||
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;
*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 {