]> Dogcows Code - chaz/openbox/blobdiff - render/theme.c
typo from code i removed
[chaz/openbox] / render / theme.c
index cbc7114138118e94299bb2de192db8c1f9be2fa1..4aef833f2edec3cc508b81bda4999e61bdf87bad 100644 (file)
@@ -64,7 +64,8 @@ static gboolean find_appearance(ParseState *ps, xmlNodePtr n, const gchar *names
 /* shortcut to the various find_* functions */
 #define FIND(type, args...) find_##type(&ps, root, args)
 
-RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
+RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
+                    gboolean allow_fallback,
                     RrFont *active_window_font, RrFont *inactive_window_font,
                     RrFont *menu_title_font, RrFont *menu_item_font,
                     RrFont *osd_font)
@@ -74,26 +75,33 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     RrJustify winjust, mtitlejust;
     gchar *str;
     RrTheme *theme;
+    gboolean userdef;
 
     if (name) {
         if (!parse_load_theme(name, &ps.doc, &root, &ps.path)) {
             g_message("Unable to load the theme '%s'", name);
-            g_message("Falling back to the default theme '%s'",
-                      DEFAULT_THEME);
+            if (allow_fallback)
+                g_message("Falling back to the default theme '%s'",
+                          DEFAULT_THEME);
             /* make it fall back to default theme */
             name = NULL;
         }
     }
-    if (!name) {
-        if (!parse_load_theme(DEFAULT_THEME, &ps.doc, &root, &ps.path)) {
-            g_message("Unable to load the theme '%s'", DEFAULT_THEME);
+    if (name == NULL) {
+        if (allow_fallback) {
+            if (!parse_load_theme(DEFAULT_THEME, &ps.doc, &root, &ps.path)) {
+                g_message("Unable to load the theme '%s'", DEFAULT_THEME);
+                return NULL;
+            }
+        } else
             return NULL;
-        }
     }
+
     ps.inst = inst;
 
     theme = g_new0(RrTheme, 1);
     theme->inst = inst;
+    theme->name = g_strdup(name ? name : DEFAULT_THEME);
 
     theme->a_disabled_focused_max = RrAppearanceNew(inst, 1);
     theme->a_disabled_unfocused_max = RrAppearanceNew(inst, 1);
@@ -133,6 +141,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     theme->a_menu_bullet_selected = RrAppearanceNew(inst, 1);
     theme->a_clear = RrAppearanceNew(inst, 0);
     theme->a_clear_tex = RrAppearanceNew(inst, 1);
+    theme->osd_hilite_bg = RrAppearanceNew(inst, 0);
+    theme->osd_hilite_label = RrAppearanceNew(inst, 1);
+    theme->osd_hilite_fg = RrAppearanceNew(inst, 0);
+    theme->osd_unhilite_fg = RrAppearanceNew(inst, 0);
 
     /* load the font stuff */
 
@@ -201,10 +213,13 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         theme->fbwidth = 1;
 
     /* menu border width inherits from frame border width */
-    if (!FIND(int, L("dimensions","menu","border"),
-              &theme->mbwidth, 0, 100))
+    if (!FIND(int, L("dimensions","menu","border"), &theme->mbwidth, 0, 100))
         theme->mbwidth = theme->fbwidth;
 
+    /* osd border width inherits from frame border width */
+    if (!FIND(int, L("dimensions","osd","border"), &theme->obwidth, 0, 100))
+        theme->obwidth = theme->fbwidth;
+
     if (!FIND(point, L("dimensions","window","clientpadding"),
               &theme->cbwidthx, &theme->cbwidthy, 0, 100, 0, 100))
         theme->cbwidthx = theme->cbwidthy = 1;
@@ -213,6 +228,14 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     if (!FIND(color, L("window","active","border"),
               &theme->frame_focused_border_color, NULL))
         theme->frame_focused_border_color = RrColorNew(inst, 0, 0, 0);
+    /* title separator focused color inherits from focused boder color */
+    if (!FIND(color, L("window","active","titleseparator"),
+              &theme->title_separator_focused_color, NULL))
+        theme->title_separator_focused_color =
+            RrColorNew(inst,
+                       theme->frame_focused_border_color->r,
+                       theme->frame_focused_border_color->g,
+                       theme->frame_focused_border_color->b);
     /* frame unfocused border color inherits from frame focused border color */
     if (!FIND(color, L("window","inactive","border"),
               &theme->frame_unfocused_border_color, NULL))
@@ -221,15 +244,29 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
                        theme->frame_focused_border_color->r,
                        theme->frame_focused_border_color->g,
                        theme->frame_focused_border_color->b);
+    /* title separator unfocused color inherits from unfocused boder color */
+    if (!FIND(color, L("window","inactive","titleseparator"),
+              &theme->title_separator_unfocused_color, NULL))
+        theme->title_separator_unfocused_color =
+            RrColorNew(inst,
+                       theme->frame_unfocused_border_color->r,
+                       theme->frame_unfocused_border_color->g,
+                       theme->frame_unfocused_border_color->b);
 
     /* menu border color inherits from frame focused border color */
-    if (!FIND(color, L("menu","border"),
-              &theme->menu_border_color, NULL))
+    if (!FIND(color, L("menu","border"), &theme->menu_border_color, NULL))
         theme->menu_border_color =
             RrColorNew(inst,
                        theme->frame_focused_border_color->r,
                        theme->frame_focused_border_color->g,
                        theme->frame_focused_border_color->b);
+    /* osd border color inherits from frame focused border color */
+    if (!FIND(color, L("osd","border"), &theme->osd_border_color, NULL))
+        theme->osd_border_color =
+            RrColorNew(inst,
+                       theme->frame_focused_border_color->r,
+                       theme->frame_focused_border_color->g,
+                       theme->frame_focused_border_color->b);
     if (!FIND(color, L("window","active","clientpadding"),
               &theme->cb_focused_color, NULL))
         theme->cb_focused_color = RrColorNew(inst, 255, 255, 255);
@@ -239,7 +276,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     if (!FIND(color, L("window","active","label","text","primary"),
               &theme->title_focused_color, NULL))
         theme->title_focused_color = RrColorNew(inst, 0x0, 0x0, 0x0);
-    if (!FIND(color, L("osd","text","primary"),
+    if (!FIND(color, L("osd","label","text","primary"),
               &theme->osd_color, NULL))
         theme->osd_color = RrColorNew(inst,
                                       theme->title_focused_color->r,
@@ -347,7 +384,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     if (!FIND(color, L("menu","disabled","primary"),
               &theme->menu_disabled_color, NULL))
         theme->menu_disabled_color = RrColorNew(inst, 0, 0, 0);
-    if (!FIND(color, L("menu","activedisabled","text","primary"),
+    if (!FIND(color, L("menu","active-disabled","text","primary"),
               &theme->menu_disabled_selected_color, NULL))
         theme->menu_disabled_selected_color =
             RrColorNew(inst,
@@ -364,7 +401,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         theme->title_focused_shadow_color = RrColorNew(inst, 0, 0, 0);
         theme->title_focused_shadow_alpha = 50;
     }
-    if (!FIND(color, L("osd","text","shadow","primary"),
+    if (!FIND(color, L("osd","label","text","shadow","primary"),
               &theme->osd_shadow_color, &theme->osd_shadow_alpha))
     {
         theme->osd_shadow_color = 
@@ -412,7 +449,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         theme->menu_text_disabled_shadow_alpha = 
             theme->menu_text_normal_shadow_alpha;
     }
-    if (!FIND(color, L("menu","activedisabled","shadow","primary"),
+    if (!FIND(color, L("menu","active-disabled","shadow","primary"),
               &theme->menu_text_disabled_selected_shadow_color,
               &theme->menu_text_disabled_selected_shadow_alpha))
     {
@@ -427,13 +464,19 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     /* load the image masks */
 
     /* maximize button masks */
+    userdef = TRUE;
     if (!read_mask(&ps, "max.xbm", &theme->max_mask)) {
             guchar data[] = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f };
             theme->max_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
-        }
+            userdef = FALSE;
+    }
     if (!read_mask(&ps, "max_toggled.xbm",  &theme->max_toggled_mask)) {
-        guchar data[] = { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f };
-        theme->max_toggled_mask = RrPixmapMaskNew(inst, 6, 6,(gchar*)data);
+        if (userdef)
+            theme->max_toggled_mask = RrPixmapMaskCopy(theme->max_mask);
+        else {
+            guchar data[] = { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f };
+            theme->max_toggled_mask = RrPixmapMaskNew(inst, 6, 6,(gchar*)data);
+        }
     }
     if (!read_mask(&ps, "max_pressed.xbm", &theme->max_pressed_mask))
         theme->max_pressed_mask = RrPixmapMaskCopy(theme->max_mask);
@@ -463,13 +506,20 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         theme->iconify_hover_mask = RrPixmapMaskCopy(theme->iconify_mask);
 
     /* all desktops button masks */
+    userdef = TRUE;
     if (!read_mask(&ps, "desk.xbm", &theme->desk_mask)) {
         guchar data[] = { 0x33, 0x33, 0x00, 0x00, 0x33, 0x33 };
         theme->desk_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
+        userdef = FALSE;
     }
     if (!read_mask(&ps, "desk_toggled.xbm", &theme->desk_toggled_mask)) {
-        guchar data[] = { 0x00, 0x1e, 0x1a, 0x16, 0x1e, 0x00 };
-        theme->desk_toggled_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
+        if (userdef)
+            theme->desk_toggled_mask = RrPixmapMaskCopy(theme->desk_mask);
+        else {
+            guchar data[] = { 0x00, 0x1e, 0x1a, 0x16, 0x1e, 0x00 };
+            theme->desk_toggled_mask =
+                RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
+        }
     }
     if (!read_mask(&ps, "desk_pressed.xbm", &theme->desk_pressed_mask))
         theme->desk_pressed_mask = RrPixmapMaskCopy(theme->desk_mask);
@@ -562,22 +612,38 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         set_default_appearance(theme->a_menu_title);
     if (!FIND(appearance, L("menu", "active"), theme->a_menu_selected, TRUE))
         set_default_appearance(theme->a_menu_selected);
-    if (!FIND(appearance, L("menu", "activedisabled"),
+    if (!FIND(appearance, L("menu", "active-disabled"),
               theme->a_menu_disabled_selected, TRUE))
         theme->a_menu_disabled_selected =
             RrAppearanceCopy(theme->a_menu_selected);
 
-    /* read the appearances for rendering non-decorations */
-    theme->osd_hilite_bg = RrAppearanceCopy(theme->a_focused_title);
-    theme->osd_hilite_label = RrAppearanceCopy(theme->a_focused_label);
-    if (theme->a_focused_label->surface.grad != RR_SURFACE_PARENTREL)
-        theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_label);
-    else
-        theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_title);
-    if (theme->a_unfocused_label->surface.grad != RR_SURFACE_PARENTREL)
-        theme->osd_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_label);
-    else
-        theme->osd_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_title);
+    /* read appearances for non-decorations (on-screen-display) */
+    if (!FIND(appearance, L("osd", "background"), theme->osd_hilite_bg, FALSE)) {
+        RrAppearanceFree(theme->osd_hilite_bg);
+        theme->osd_hilite_bg = RrAppearanceCopy(theme->a_focused_title);
+    }
+    if (!FIND(appearance, L("osd", "label"), theme->osd_hilite_label, TRUE)) {
+        RrAppearanceFree(theme->osd_hilite_label);
+        theme->osd_hilite_label = RrAppearanceCopy(theme->a_focused_label);
+    }
+    /* osd_hilite_fg can't be parentrel */
+    if (!FIND(appearance, L("osd", "hilight"), theme->osd_hilite_fg, FALSE)) {
+        RrAppearanceFree(theme->osd_hilite_fg);
+        if (theme->a_focused_label->surface.grad != RR_SURFACE_PARENTREL)
+            theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_label);
+        else
+            theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_title);
+    }
+    /* osd_unhilite_fg can't be parentrel either */
+    if (!FIND(appearance, L("osd", "unhilight"), theme->osd_unhilite_fg,
+              FALSE))
+    {
+        RrAppearanceFree(theme->osd_unhilite_fg);
+        if (theme->a_unfocused_label->surface.grad != RR_SURFACE_PARENTREL)
+            theme->osd_unhilite_fg=RrAppearanceCopy(theme->a_unfocused_label);
+        else
+            theme->osd_unhilite_fg=RrAppearanceCopy(theme->a_unfocused_title);
+    }
 
     /* read buttons textures */
     if (!FIND(appearance, L("window","active","buttons","disabled"),
@@ -779,7 +845,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
     theme->a_focused_label->texture[0].data.text.shadow_alpha =
         theme->title_focused_shadow_alpha;
 
-    if (!FIND(shadow, L("osd","text","shadow","offset"),
+    if (!FIND(shadow, L("osd","label","text","shadow","offset"),
               theme->osd_hilite_label))
     {
         theme->osd_hilite_label->texture[0].data.text.shadow_offset_x =
@@ -862,7 +928,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
         theme->a_menu_text_disabled->texture[0].data.text.shadow_offset_x =
             theme->a_menu_text_disabled->texture[0].data.text.shadow_offset_y =
             0;
-    if (!FIND(shadow, L("menu","activedisabled","shadow","offset"),
+    if (!FIND(shadow, L("menu","active-disabled","shadow","offset"),
               theme->a_menu_text_disabled_selected))
         theme->a_menu_text_disabled_selected->
             texture[0].data.text.shadow_offset_x = 0;
@@ -1178,9 +1244,14 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
 void RrThemeFree(RrTheme *theme)
 {
     if (theme) {
+        g_free(theme->name);
+
         RrColorFree(theme->menu_border_color);
+        RrColorFree(theme->osd_border_color);
         RrColorFree(theme->frame_focused_border_color);
         RrColorFree(theme->frame_unfocused_border_color);
+        RrColorFree(theme->title_separator_focused_color);
+        RrColorFree(theme->title_separator_unfocused_color);
         RrColorFree(theme->cb_unfocused_color);
         RrColorFree(theme->cb_focused_color);
         RrColorFree(theme->title_focused_color);
@@ -1431,30 +1502,33 @@ static void parse_style(gchar *tex, RrSurfaceColorType *grad,
         } else {
             *grad = RR_SURFACE_SOLID;
         }
+    }
 
-        if (strstr(tex, "sunken") != NULL)
-            *relief = RR_RELIEF_SUNKEN;
-        else if (strstr(tex, "flat") != NULL)
-            *relief = RR_RELIEF_FLAT;
-        else
-            *relief = RR_RELIEF_RAISED;
-
-        *border = FALSE;
-        if (*relief == RR_RELIEF_FLAT) {
-            if (strstr(tex, "border") != NULL)
-                *border = TRUE;
-        } else {
-            if (strstr(tex, "bevel2") != NULL)
-                *bevel = RR_BEVEL_2;
-            else
-                *bevel = RR_BEVEL_1;
-        }
+    if (strstr(tex, "sunken") != NULL)
+        *relief = RR_RELIEF_SUNKEN;
+    else if (strstr(tex, "flat") != NULL)
+        *relief = RR_RELIEF_FLAT;
+    else if (strstr(tex, "raised") != NULL)
+        *relief = RR_RELIEF_RAISED;
+    else
+        *relief = (*grad == RR_SURFACE_PARENTREL) ?
+                  RR_RELIEF_FLAT : RR_RELIEF_RAISED;
 
-        if (strstr(tex, "interlaced") != NULL)
-            *interlaced = TRUE;
+    *border = FALSE;
+    if (*relief == RR_RELIEF_FLAT) {
+        if (strstr(tex, "border") != NULL)
+            *border = TRUE;
+    } else {
+        if (strstr(tex, "bevel2") != NULL)
+            *bevel = RR_BEVEL_2;
         else
-            *interlaced = FALSE;
+            *bevel = RR_BEVEL_1;
     }
+
+    if (strstr(tex, "interlaced") != NULL)
+        *interlaced = TRUE;
+    else
+        *interlaced = FALSE;
 }
 
 static xmlNodePtr find_node(xmlNodePtr n, const gchar *names[])
This page took 0.027978 seconds and 4 git commands to generate.