X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Ftheme.c;h=f5af79e98595e408ec9ef28fa89a06b7cd0a04e3;hb=2b28aa8c41b71d1f96d8ebf9cd72dd0c2ccd0678;hp=8051a3afdb8a98228d0de715da9dcc485bbd5c89;hpb=410bf6dc53d6779d019128381f6b8dbcaf03dc31;p=chaz%2Fopenbox diff --git a/render/theme.c b/render/theme.c index 8051a3af..f5af79e9 100644 --- a/render/theme.c +++ b/render/theme.c @@ -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); @@ -425,161 +433,125 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, } /* load the image masks */ - if (read_mask(&ps, "max.xbm", &theme->max_mask)) { - if (!read_mask(&ps, "max_pressed.xbm", &theme->max_pressed_mask)) - theme->max_pressed_mask = RrPixmapMaskCopy(theme->max_mask); - if (!read_mask(&ps, "max_toggled.xbm", &theme->max_toggled_mask)) - theme->max_toggled_mask = - RrPixmapMaskCopy(theme->max_pressed_mask); - if (!read_mask(&ps, "max_toggled_pressed.xbm", - &theme->max_toggled_pressed_mask)) - theme->max_toggled_pressed_mask = - RrPixmapMaskCopy(theme->max_toggled_mask); - if (!read_mask(&ps, "max_toggled_hover.xbm", - &theme->max_toggled_hover_mask)) - theme->max_toggled_hover_mask = - RrPixmapMaskCopy(theme->max_toggled_mask); - if (!read_mask(&ps, "max_disabled.xbm", &theme->max_disabled_mask)) - theme->max_disabled_mask = RrPixmapMaskCopy(theme->max_mask); - if (!read_mask(&ps, "max_hover.xbm", &theme->max_hover_mask)) - theme->max_hover_mask = RrPixmapMaskCopy(theme->max_mask); - } else { - { + + /* 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)) { + 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); + if (!read_mask(&ps, "max_disabled.xbm", &theme->max_disabled_mask)) theme->max_disabled_mask = RrPixmapMaskCopy(theme->max_mask); + if (!read_mask(&ps, "max_hover.xbm", &theme->max_hover_mask)) theme->max_hover_mask = RrPixmapMaskCopy(theme->max_mask); + if (!read_mask(&ps, "max_toggled_pressed.xbm", + &theme->max_toggled_pressed_mask)) theme->max_toggled_pressed_mask = RrPixmapMaskCopy(theme->max_toggled_mask); + if (!read_mask(&ps, "max_toggled_hover.xbm", + &theme->max_toggled_hover_mask)) theme->max_toggled_hover_mask = RrPixmapMaskCopy(theme->max_toggled_mask); - } - if (read_mask(&ps, "iconify.xbm", &theme->iconify_mask)) { - if (!read_mask(&ps, "iconify_pressed.xbm", - &theme->iconify_pressed_mask)) - theme->iconify_pressed_mask = - RrPixmapMaskCopy(theme->iconify_mask); - if (!read_mask(&ps, "iconify_disabled.xbm", - &theme->iconify_disabled_mask)) - theme->iconify_disabled_mask = - RrPixmapMaskCopy(theme->iconify_mask); - if (!read_mask(&ps, "iconify_hover.xbm", &theme->iconify_hover_mask)) - theme->iconify_hover_mask = RrPixmapMaskCopy(theme->iconify_mask); - } else { - { - guchar data[] = { 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f }; - theme->iconify_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); - } + /* iconify button masks */ + if (!read_mask(&ps, "iconify.xbm", &theme->iconify_mask)) { + guchar data[] = { 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f }; + theme->iconify_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); + } + if (!read_mask(&ps, "iconify_pressed.xbm", &theme->iconify_pressed_mask)) theme->iconify_pressed_mask = RrPixmapMaskCopy(theme->iconify_mask); + if (!read_mask(&ps, "iconify_disabled.xbm", &theme->iconify_disabled_mask)) theme->iconify_disabled_mask = RrPixmapMaskCopy(theme->iconify_mask); + if (!read_mask(&ps, "iconify_hover.xbm", &theme->iconify_hover_mask)) theme->iconify_hover_mask = RrPixmapMaskCopy(theme->iconify_mask); - } - theme->def_win_icon = read_c_image(OB_DEFAULT_ICON_WIDTH, - OB_DEFAULT_ICON_HEIGHT, - OB_DEFAULT_ICON_pixel_data); - - if (read_mask(&ps, "desk.xbm", &theme->desk_mask)) { - if (!read_mask(&ps, "desk_pressed.xbm", &theme->desk_pressed_mask)) - theme->desk_pressed_mask = RrPixmapMaskCopy(theme->desk_mask); - if (!read_mask(&ps, "desk_toggled.xbm", &theme->desk_toggled_mask)) - theme->desk_toggled_mask = - RrPixmapMaskCopy(theme->desk_pressed_mask); - if (!read_mask(&ps, "desk_toggled_pressed.xbm", - &theme->desk_toggled_pressed_mask)) - theme->desk_toggled_pressed_mask = - RrPixmapMaskCopy(theme->desk_toggled_mask); - if (!read_mask(&ps, "desk_toggled_hover.xbm", - &theme->desk_toggled_hover_mask)) - theme->desk_toggled_hover_mask = - RrPixmapMaskCopy(theme->desk_toggled_mask); - if (!read_mask(&ps, "desk_disabled.xbm", &theme->desk_disabled_mask)) - theme->desk_disabled_mask = RrPixmapMaskCopy(theme->desk_mask); - if (!read_mask(&ps, "desk_hover.xbm", &theme->desk_hover_mask)) - theme->desk_hover_mask = RrPixmapMaskCopy(theme->desk_mask); - } else { - { - guchar data[] = { 0x33, 0x33, 0x00, 0x00, 0x33, 0x33 }; - theme->desk_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); - } - { + /* 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)) { + 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); + 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); + if (!read_mask(&ps, "desk_disabled.xbm", &theme->desk_disabled_mask)) theme->desk_disabled_mask = RrPixmapMaskCopy(theme->desk_mask); + if (!read_mask(&ps, "desk_hover.xbm", &theme->desk_hover_mask)) theme->desk_hover_mask = RrPixmapMaskCopy(theme->desk_mask); + if (!read_mask(&ps, "desk_toggled_pressed.xbm", + &theme->desk_toggled_pressed_mask)) theme->desk_toggled_pressed_mask = RrPixmapMaskCopy(theme->desk_toggled_mask); + if (!read_mask(&ps, "desk_toggled_hover.xbm", + &theme->desk_toggled_hover_mask)) theme->desk_toggled_hover_mask = RrPixmapMaskCopy(theme->desk_toggled_mask); - } - if (read_mask(&ps, "shade.xbm", &theme->shade_mask)) { - if (!read_mask(&ps, "shade_pressed.xbm", &theme->shade_pressed_mask)) - theme->shade_pressed_mask = RrPixmapMaskCopy(theme->shade_mask); - if (!read_mask(&ps, "shade_toggled.xbm", &theme->shade_toggled_mask)) - theme->shade_toggled_mask = - RrPixmapMaskCopy(theme->shade_pressed_mask); - if (!read_mask(&ps, "shade_toggled_pressed.xbm", - &theme->shade_toggled_pressed_mask)) - theme->shade_toggled_pressed_mask = - RrPixmapMaskCopy(theme->shade_toggled_mask); - if (!read_mask(&ps, "shade_toggled_hover.xbm", - &theme->shade_toggled_hover_mask)) - theme->shade_toggled_hover_mask = - RrPixmapMaskCopy(theme->shade_toggled_mask); - if (!read_mask(&ps, "shade_disabled.xbm", &theme->shade_disabled_mask)) - theme->shade_disabled_mask = RrPixmapMaskCopy(theme->shade_mask); - if (!read_mask(&ps, "shade_hover.xbm", &theme->shade_hover_mask)) - theme->shade_hover_mask = RrPixmapMaskCopy(theme->shade_mask); - } else { - { - guchar data[] = { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 }; - theme->shade_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); - } - { - guchar data[] = { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 }; - theme->shade_toggled_mask = RrPixmapMaskNew(inst,6,6,(gchar*)data); - } + /* shade button masks */ + if (!read_mask(&ps, "shade.xbm", &theme->shade_mask)) { + guchar data[] = { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 }; + theme->shade_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); + } + if (!read_mask(&ps, "shade_toggled.xbm", &theme->shade_toggled_mask)) + theme->shade_toggled_mask = RrPixmapMaskCopy(theme->shade_mask); + if (!read_mask(&ps, "shade_pressed.xbm", &theme->shade_pressed_mask)) theme->shade_pressed_mask = RrPixmapMaskCopy(theme->shade_mask); + if (!read_mask(&ps, "shade_disabled.xbm", &theme->shade_disabled_mask)) theme->shade_disabled_mask = RrPixmapMaskCopy(theme->shade_mask); + if (!read_mask(&ps, "shade_hover.xbm", &theme->shade_hover_mask)) theme->shade_hover_mask = RrPixmapMaskCopy(theme->shade_mask); + if (!read_mask(&ps, "shade_toggled_pressed.xbm", + &theme->shade_toggled_pressed_mask)) theme->shade_toggled_pressed_mask = RrPixmapMaskCopy(theme->shade_toggled_mask); + if (!read_mask(&ps, "shade_toggled_hover.xbm", + &theme->shade_toggled_hover_mask)) theme->shade_toggled_hover_mask = RrPixmapMaskCopy(theme->shade_toggled_mask); - } - if (read_mask(&ps, "close.xbm", &theme->close_mask)) { - if (!read_mask(&ps, "close_pressed.xbm", &theme->close_pressed_mask)) - theme->close_pressed_mask = RrPixmapMaskCopy(theme->close_mask); - if (!read_mask(&ps, "close_disabled.xbm", &theme->close_disabled_mask)) - theme->close_disabled_mask = RrPixmapMaskCopy(theme->close_mask); - if (!read_mask(&ps, "close_hover.xbm", &theme->close_hover_mask)) - theme->close_hover_mask = RrPixmapMaskCopy(theme->close_mask); - } else { - { - guchar data[] = { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 }; - theme->close_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); - } + /* close button masks */ + if (!read_mask(&ps, "close.xbm", &theme->close_mask)) { + guchar data[] = { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 }; + theme->close_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data); + } + if (!read_mask(&ps, "close_pressed.xbm", &theme->close_pressed_mask)) theme->close_pressed_mask = RrPixmapMaskCopy(theme->close_mask); + if (!read_mask(&ps, "close_disabled.xbm", &theme->close_disabled_mask)) theme->close_disabled_mask = RrPixmapMaskCopy(theme->close_mask); + if (!read_mask(&ps, "close_hover.xbm", &theme->close_hover_mask)) theme->close_hover_mask = RrPixmapMaskCopy(theme->close_mask); - } + /* submenu bullet mask */ if (!read_mask(&ps, "bullet.xbm", &theme->menu_bullet_mask)) { guchar data[] = { 0x01, 0x03, 0x07, 0x0f, 0x07, 0x03, 0x01 }; theme->menu_bullet_mask = RrPixmapMaskNew(inst, 4, 7, (gchar*)data); } + /* setup the default window icon */ + theme->def_win_icon = read_c_image(OB_DEFAULT_ICON_WIDTH, + OB_DEFAULT_ICON_HEIGHT, + OB_DEFAULT_ICON_pixel_data); + /* read the decoration textures */ if (!FIND(appearance, L("window","active","titlebar"), theme->a_focused_title, FALSE)) @@ -1198,7 +1170,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, RrMargins(theme->a_focused_label, &fl, &ft, &fr, &fb); RrMargins(theme->a_unfocused_label, &ul, &ut, &ur, &ub); theme->label_height = theme->win_font_height + MAX(ft + fb, ut + ub); - theme->label_height += theme->label_height % 2; + theme->label_height += theme->label_height & 1; /* this would be nice I think, since padding.width can now be 0, but it breaks frame.c horribly and I don't feel like fixing that @@ -1227,6 +1199,8 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name, void RrThemeFree(RrTheme *theme) { if (theme) { + g_free(theme->name); + RrColorFree(theme->menu_border_color); RrColorFree(theme->frame_focused_border_color); RrColorFree(theme->frame_unfocused_border_color);