X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Ftheme.c;h=907fd0b55226531ba82f5dcb891da3636c78444c;hb=3a607fad9df628ab16e0f7436dfbfc9b22634003;hp=3c2c8b2e0f7f0b87cd7ebc3d03dafe84e3a2012c;hpb=191f982dd4b5bdaae8d9abbc82c5191ab6509052;p=chaz%2Fopenbox diff --git a/render/theme.c b/render/theme.c index 3c2c8b2e..907fd0b5 100644 --- a/render/theme.c +++ b/render/theme.c @@ -3,6 +3,7 @@ #include "font.h" #include "mask.h" #include "theme.h" +#include "icon.h" #include #include @@ -21,6 +22,7 @@ static gboolean read_mask(const RrInstance *inst, static gboolean read_appearance(XrmDatabase db, const RrInstance *inst, gchar *rname, RrAppearance *value, gboolean allow_trans); +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) @@ -71,6 +73,8 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) theme->app_hilite_bg = RrAppearanceNew(inst, 0); theme->app_unhilite_bg = RrAppearanceNew(inst, 0); + theme->app_hilite_fg = RrAppearanceNew(inst, 0); + theme->app_unhilite_fg = RrAppearanceNew(inst, 0); theme->app_hilite_label = RrAppearanceNew(inst, 1); theme->app_unhilite_label = RrAppearanceNew(inst, 1); @@ -323,6 +327,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) 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(inst, "desk.xbm", theme, &theme->desk_mask)) { if (!read_mask(inst, "desk_pressed.xbm", theme, &theme->desk_pressed_mask)) { @@ -472,6 +480,17 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) "window.active.label.bg", theme->app_hilite_label, TRUE)) set_default_appearance(theme->app_hilite_label); + if (!read_appearance(db, inst, + "window.active.label.bg", theme->app_hilite_fg, + TRUE)) + set_default_appearance(theme->app_hilite_fg); + else if (theme->app_hilite_label->surface.grad == RR_SURFACE_PARENTREL) { + if (!read_appearance(db, inst, + "window.active.title.bg", + theme->app_hilite_fg, + FALSE)) + set_default_appearance(theme->app_hilite_fg); + } if (!read_appearance(db, inst, "window.inactive.title.bg", theme->app_unhilite_bg, FALSE)) @@ -480,6 +499,18 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) "window.inactive.label.bg", theme->app_unhilite_label, TRUE)) set_default_appearance(theme->app_unhilite_label); + if (!read_appearance(db, inst, + "window.inactive.label.bg", theme->app_unhilite_fg, + TRUE)) + set_default_appearance(theme->app_unhilite_fg); + else if (theme->app_unhilite_label->surface.grad == RR_SURFACE_PARENTREL) { + if (!read_appearance(db, inst, + "window.inactive.title.bg", + theme->app_unhilite_fg, + FALSE)) + set_default_appearance(theme->app_unhilite_fg); + } + /* read buttons textures */ if (!read_appearance(db, inst, @@ -893,6 +924,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name) void RrThemeFree(RrTheme *theme) { if (theme) { + g_free(theme->path); g_free(theme->name); RrColorFree(theme->b_color); @@ -915,6 +947,8 @@ void RrThemeFree(RrTheme *theme) RrColorFree(theme->menu_disabled_color); RrColorFree(theme->menu_selected_color); + g_free(theme->def_win_icon); + RrPixmapMaskFree(theme->max_mask); RrPixmapMaskFree(theme->max_toggled_mask); RrPixmapMaskFree(theme->max_disabled_mask); @@ -1014,8 +1048,12 @@ void RrThemeFree(RrTheme *theme) RrAppearanceFree(theme->a_clear_tex); RrAppearanceFree(theme->app_hilite_bg); RrAppearanceFree(theme->app_unhilite_bg); + RrAppearanceFree(theme->app_hilite_fg); + RrAppearanceFree(theme->app_unhilite_fg); RrAppearanceFree(theme->app_hilite_label); RrAppearanceFree(theme->app_unhilite_label); + + g_free(theme); } } @@ -1248,3 +1286,28 @@ static void set_default_appearance(RrAppearance *a) a->surface.primary = RrColorNew(a->inst, 0, 0, 0); a->surface.secondary = RrColorNew(a->inst, 0, 0, 0); } + +/* Reads the output from gimp's C-Source file format into valid RGBA data for + an RrTextureRGBA. */ +static RrPixel32* read_c_image(gint width, gint height, const guint8 *data) +{ + RrPixel32 *im, *p; + gint i; + + p = im = g_memdup(data, width * height * sizeof(RrPixel32)); + + for (i = 0; i < width * height; ++i) { + guchar a = ((*p >> 24) & 0xff); + guchar b = ((*p >> 16) & 0xff); + guchar g = ((*p >> 8) & 0xff); + guchar r = ((*p >> 0) & 0xff); + + *p = ((r << RrDefaultRedOffset) + + (g << RrDefaultGreenOffset) + + (b << RrDefaultBlueOffset) + + (a << RrDefaultAlphaOffset)); + p++; + } + + return im; +}