]> Dogcows Code - chaz/openbox/blobdiff - render/theme.c
moving shadow information out of the themes, and into the Text textures.
[chaz/openbox] / render / theme.c
index e89e4dc903bf68dffa486a435a04e79187da0da8..c8762181ec3634c835c383887d5fcee6420aef03 100644 (file)
@@ -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 <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,
@@ -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,12 +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, "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 {
This page took 0.025511 seconds and 4 git commands to generate.