7 #include <X11/Xresource.h>
9 /* style settings - geometry */
11 int theme_handle_height
;
14 /* style settings - colors */
15 color_rgb
*theme_b_color
;
16 color_rgb
*theme_cb_focused_color
;
17 color_rgb
*theme_cb_unfocused_color
;
18 color_rgb
*theme_title_focused_color
;
19 color_rgb
*theme_title_unfocused_color
;
20 color_rgb
*theme_titlebut_focused_color
;
21 color_rgb
*theme_titlebut_unfocused_color
;
22 color_rgb
*theme_menu_title_color
;
23 color_rgb
*theme_menu_color
;
24 color_rgb
*theme_menu_disabled_color
;
25 color_rgb
*theme_menu_hilite_color
;
26 /* style settings - fonts */
27 int theme_winfont_height
;
28 ObFont
*theme_winfont
;
29 gboolean theme_winfont_shadow
;
30 int theme_winfont_shadow_offset
;
31 int theme_winfont_shadow_tint
;
32 int theme_mtitlefont_height
;
33 ObFont
*theme_mtitlefont
;
34 gboolean theme_mtitlefont_shadow
;
35 int theme_mtitlefont_shadow_offset
;
36 int theme_mtitlefont_shadow_tint
;
37 int theme_mfont_height
;
39 gboolean theme_mfont_shadow
;
40 int theme_mfont_shadow_offset
;
41 int theme_mfont_shadow_tint
;
42 /* style settings - title layout */
43 char *theme_title_layout
;
44 /* style settings - masks */
45 pixmap_mask
*theme_max_set_mask
;
46 pixmap_mask
*theme_max_unset_mask
;
47 pixmap_mask
*theme_iconify_mask
;
48 pixmap_mask
*theme_desk_set_mask
;
49 pixmap_mask
*theme_desk_unset_mask
;
50 pixmap_mask
*theme_shade_set_mask
;
51 pixmap_mask
*theme_shade_unset_mask
;
52 pixmap_mask
*theme_close_mask
;
54 /* global appearances */
55 Appearance
*theme_a_focused_unpressed_max
;
56 Appearance
*theme_a_focused_pressed_max
;
57 Appearance
*theme_a_focused_pressed_set_max
;
58 Appearance
*theme_a_unfocused_unpressed_max
;
59 Appearance
*theme_a_unfocused_pressed_max
;
60 Appearance
*theme_a_unfocused_pressed_set_max
;
61 Appearance
*theme_a_focused_unpressed_close
;
62 Appearance
*theme_a_focused_pressed_close
;
63 Appearance
*theme_a_unfocused_unpressed_close
;
64 Appearance
*theme_a_unfocused_pressed_close
;
65 Appearance
*theme_a_focused_unpressed_desk
;
66 Appearance
*theme_a_focused_pressed_desk
;
67 Appearance
*theme_a_focused_pressed_set_desk
;
68 Appearance
*theme_a_unfocused_unpressed_desk
;
69 Appearance
*theme_a_unfocused_pressed_desk
;
70 Appearance
*theme_a_unfocused_pressed_set_desk
;
71 Appearance
*theme_a_focused_unpressed_shade
;
72 Appearance
*theme_a_focused_pressed_shade
;
73 Appearance
*theme_a_focused_pressed_set_shade
;
74 Appearance
*theme_a_unfocused_unpressed_shade
;
75 Appearance
*theme_a_unfocused_pressed_shade
;
76 Appearance
*theme_a_unfocused_pressed_set_shade
;
77 Appearance
*theme_a_focused_unpressed_iconify
;
78 Appearance
*theme_a_focused_pressed_iconify
;
79 Appearance
*theme_a_unfocused_unpressed_iconify
;
80 Appearance
*theme_a_unfocused_pressed_iconify
;
81 Appearance
*theme_a_focused_grip
;
82 Appearance
*theme_a_unfocused_grip
;
83 Appearance
*theme_a_focused_title
;
84 Appearance
*theme_a_unfocused_title
;
85 Appearance
*theme_a_focused_label
;
86 Appearance
*theme_a_unfocused_label
;
87 Appearance
*theme_a_icon
; /* always parentrelative, so no focused/unfocused */
88 Appearance
*theme_a_focused_handle
;
89 Appearance
*theme_a_unfocused_handle
;
90 Appearance
*theme_a_menu_title
;
91 Appearance
*theme_a_menu
;
92 Appearance
*theme_a_menu_item
;
93 Appearance
*theme_a_menu_disabled
;
94 Appearance
*theme_a_menu_hilite
;
96 Appearance
*theme_app_hilite_bg
;
97 Appearance
*theme_app_unhilite_bg
;
98 Appearance
*theme_app_hilite_label
;
99 Appearance
*theme_app_unhilite_label
;
100 Appearance
*theme_app_icon
;
104 theme_b_color
= theme_cb_unfocused_color
= theme_cb_focused_color
=
105 theme_title_unfocused_color
= theme_title_focused_color
=
106 theme_titlebut_unfocused_color
= theme_titlebut_focused_color
=
107 theme_menu_color
= theme_menu_title_color
= theme_menu_disabled_color
=
108 theme_menu_hilite_color
= NULL
;
109 theme_winfont
= theme_mtitlefont
= theme_mfont
= NULL
;
110 theme_title_layout
= NULL
;
111 theme_max_set_mask
= theme_max_unset_mask
= NULL
;
112 theme_desk_set_mask
= theme_desk_unset_mask
= NULL
;
113 theme_shade_set_mask
= theme_shade_unset_mask
= NULL
;
114 theme_iconify_mask
= theme_close_mask
= NULL
;
116 theme_a_focused_unpressed_max
= appearance_new(1);
117 theme_a_focused_pressed_max
= appearance_new(1);
118 theme_a_focused_pressed_set_max
= appearance_new(1);
119 theme_a_unfocused_unpressed_max
= appearance_new(1);
120 theme_a_unfocused_pressed_max
= appearance_new(1);
121 theme_a_unfocused_pressed_set_max
= appearance_new(1);
122 theme_a_focused_unpressed_close
= NULL
;
123 theme_a_focused_pressed_close
= NULL
;
124 theme_a_unfocused_unpressed_close
= NULL
;
125 theme_a_unfocused_pressed_close
= NULL
;
126 theme_a_focused_unpressed_desk
= NULL
;
127 theme_a_focused_pressed_desk
= NULL
;
128 theme_a_focused_pressed_set_desk
= NULL
;
129 theme_a_unfocused_unpressed_desk
= NULL
;
130 theme_a_unfocused_pressed_desk
= NULL
;
131 theme_a_unfocused_pressed_set_desk
= NULL
;
132 theme_a_focused_unpressed_shade
= NULL
;
133 theme_a_focused_pressed_shade
= NULL
;
134 theme_a_focused_pressed_set_shade
= NULL
;
135 theme_a_unfocused_unpressed_shade
= NULL
;
136 theme_a_unfocused_pressed_shade
= NULL
;
137 theme_a_unfocused_pressed_set_shade
= NULL
;
138 theme_a_focused_unpressed_iconify
= NULL
;
139 theme_a_focused_pressed_iconify
= NULL
;
140 theme_a_unfocused_unpressed_iconify
= NULL
;
141 theme_a_unfocused_pressed_iconify
= NULL
;
142 theme_a_focused_grip
= appearance_new(0);
143 theme_a_unfocused_grip
= appearance_new(0);
144 theme_a_focused_title
= appearance_new(0);
145 theme_a_unfocused_title
= appearance_new(0);
146 theme_a_focused_label
= appearance_new(1);
147 theme_a_unfocused_label
= appearance_new(1);
148 theme_a_icon
= appearance_new(1);
149 theme_a_focused_handle
= appearance_new(0);
150 theme_a_unfocused_handle
= appearance_new(0);
151 theme_a_menu
= appearance_new(0);
152 theme_a_menu_title
= appearance_new(1);
153 theme_a_menu_item
= appearance_new(1);
154 theme_a_menu_disabled
= appearance_new(1);
155 theme_a_menu_hilite
= appearance_new(1);
157 theme_app_hilite_bg
= appearance_new(0);
158 theme_app_unhilite_bg
= appearance_new(0);
159 theme_app_hilite_label
= appearance_new(1);
160 theme_app_unhilite_label
= appearance_new(1);
161 theme_app_icon
= appearance_new(1);
165 void theme_shutdown()
167 color_free(theme_b_color
);
168 color_free(theme_cb_unfocused_color
);
169 color_free(theme_cb_focused_color
);
170 color_free(theme_title_unfocused_color
);
171 color_free(theme_title_focused_color
);
172 color_free(theme_titlebut_unfocused_color
);
173 color_free(theme_titlebut_focused_color
);
174 color_free(theme_menu_color
);
175 color_free(theme_menu_title_color
);
176 color_free(theme_menu_disabled_color
);
177 color_free(theme_menu_hilite_color
);
179 pixmap_mask_free(theme_max_set_mask
);
180 pixmap_mask_free(theme_max_unset_mask
);
181 pixmap_mask_free(theme_desk_set_mask
);
182 pixmap_mask_free(theme_desk_unset_mask
);
183 pixmap_mask_free(theme_shade_set_mask
);
184 pixmap_mask_free(theme_shade_unset_mask
);
185 pixmap_mask_free(theme_iconify_mask
);
186 pixmap_mask_free(theme_close_mask
);
188 font_close(theme_winfont
);
189 font_close(theme_mtitlefont
);
190 font_close(theme_mfont
);
192 g_free(theme_title_layout
);
194 appearance_free(theme_a_focused_unpressed_max
);
195 appearance_free(theme_a_focused_pressed_max
);
196 appearance_free(theme_a_focused_pressed_set_max
);
197 appearance_free(theme_a_unfocused_unpressed_max
);
198 appearance_free(theme_a_unfocused_pressed_max
);
199 appearance_free(theme_a_unfocused_pressed_set_max
);
200 appearance_free(theme_a_focused_unpressed_close
);
201 appearance_free(theme_a_focused_pressed_close
);
202 appearance_free(theme_a_unfocused_unpressed_close
);
203 appearance_free(theme_a_unfocused_pressed_close
);
204 appearance_free(theme_a_focused_unpressed_desk
);
205 appearance_free(theme_a_focused_pressed_desk
);
206 appearance_free(theme_a_unfocused_unpressed_desk
);
207 appearance_free(theme_a_unfocused_pressed_desk
);
208 appearance_free(theme_a_focused_unpressed_shade
);
209 appearance_free(theme_a_focused_pressed_shade
);
210 appearance_free(theme_a_unfocused_unpressed_shade
);
211 appearance_free(theme_a_unfocused_pressed_shade
);
212 appearance_free(theme_a_focused_unpressed_iconify
);
213 appearance_free(theme_a_focused_pressed_iconify
);
214 appearance_free(theme_a_unfocused_unpressed_iconify
);
215 appearance_free(theme_a_unfocused_pressed_iconify
);
216 appearance_free(theme_a_focused_grip
);
217 appearance_free(theme_a_unfocused_grip
);
218 appearance_free(theme_a_focused_title
);
219 appearance_free(theme_a_unfocused_title
);
220 appearance_free(theme_a_focused_label
);
221 appearance_free(theme_a_unfocused_label
);
222 appearance_free(theme_a_icon
);
223 appearance_free(theme_a_focused_handle
);
224 appearance_free(theme_a_unfocused_handle
);
225 appearance_free(theme_a_menu
);
226 appearance_free(theme_a_menu_title
);
227 appearance_free(theme_a_menu_item
);
228 appearance_free(theme_a_menu_disabled
);
229 appearance_free(theme_a_menu_hilite
);
230 appearance_free(theme_app_hilite_bg
);
231 appearance_free(theme_app_unhilite_bg
);
232 appearance_free(theme_app_hilite_label
);
233 appearance_free(theme_app_unhilite_label
);
234 appearance_free(theme_app_icon
);
237 static XrmDatabase
loaddb(char *theme
)
241 db
= XrmGetFileDatabase(theme
);
243 char *s
= g_build_filename(g_get_home_dir(), ".openbox", "themes",
245 db
= XrmGetFileDatabase(s
);
249 char *s
= g_build_filename(THEMEDIR
, theme
, NULL
);
250 db
= XrmGetFileDatabase(s
);
256 static char *create_class_name(char *rname
)
258 char *rclass
= g_strdup(rname
);
263 p
= strchr(p
+1, '.');
264 if (p
== NULL
) break;
266 if (*p
== '\0') break;
271 static gboolean
read_int(XrmDatabase db
, char *rname
, int *value
)
273 gboolean ret
= FALSE
;
274 char *rclass
= create_class_name(rname
);
278 if (XrmGetResource(db
, rname
, rclass
, &rettype
, &retvalue
) &&
279 retvalue
.addr
!= NULL
) {
280 *value
= (int)strtol(retvalue
.addr
, &end
, 10);
281 if (end
!= retvalue
.addr
)
289 static gboolean
read_string(XrmDatabase db
, char *rname
, char **value
)
291 gboolean ret
= FALSE
;
292 char *rclass
= create_class_name(rname
);
296 if (XrmGetResource(db
, rname
, rclass
, &rettype
, &retvalue
) &&
297 retvalue
.addr
!= NULL
) {
298 *value
= g_strdup(retvalue
.addr
);
306 static gboolean
read_color(XrmDatabase db
, char *rname
, color_rgb
**value
)
308 gboolean ret
= FALSE
;
309 char *rclass
= create_class_name(rname
);
313 if (XrmGetResource(db
, rname
, rclass
, &rettype
, &retvalue
) &&
314 retvalue
.addr
!= NULL
) {
315 color_rgb
*c
= color_parse(retvalue
.addr
);
326 static gboolean
read_mask(XrmDatabase db
, char *rname
, char *theme
,
329 gboolean ret
= FALSE
;
330 char *rclass
= create_class_name(rname
);
335 int hx
, hy
; /* ignored */
339 if (XrmGetResource(db
, rname
, rclass
, &rettype
, &retvalue
) &&
340 retvalue
.addr
!= NULL
) {
342 button_dir
= g_strdup_printf("%s_data", theme
);
344 s
= g_build_filename(g_get_home_dir(), ".openbox", "themes",
345 button_dir
, retvalue
.addr
, NULL
);
347 if (XReadBitmapFileData(s
, &w
, &h
, &b
, &hx
, &hy
) == BitmapSuccess
)
351 s
= g_build_filename(THEMEDIR
, button_dir
, retvalue
.addr
, NULL
);
353 if (XReadBitmapFileData(s
, &w
, &h
, &b
, &hx
, &hy
) == BitmapSuccess
)
359 themename
= g_path_get_basename(theme
);
360 s
= g_strdup_printf("%s/%s_data/%s", theme
,
361 themename
, retvalue
.addr
);
363 if (XReadBitmapFileData(s
, &w
, &h
, &b
, &hx
, &hy
) ==
367 g_message("Unable to find bitmap '%s'", retvalue
.addr
);
372 *value
= pixmap_mask_new(w
, h
, (char*)b
);
384 static void parse_appearance(char *tex
, SurfaceColorType
*grad
,
385 ReliefType
*relief
, BevelType
*bevel
,
386 gboolean
*interlaced
, gboolean
*border
)
390 /* convert to all lowercase */
391 for (t
= tex
; *t
!= '\0'; ++t
)
392 *t
= g_ascii_tolower(*t
);
394 if (strstr(tex
, "parentrelative") != NULL
) {
395 *grad
= Background_ParentRelative
;
397 if (strstr(tex
, "gradient") != NULL
) {
398 if (strstr(tex
, "crossdiagonal") != NULL
)
399 *grad
= Background_CrossDiagonal
;
400 else if (strstr(tex
, "rectangle") != NULL
)
401 *grad
= Background_Rectangle
;
402 else if (strstr(tex
, "pyramid") != NULL
)
403 *grad
= Background_Pyramid
;
404 else if (strstr(tex
, "pipecross") != NULL
)
405 *grad
= Background_PipeCross
;
406 else if (strstr(tex
, "elliptic") != NULL
)
407 *grad
= Background_Rectangle
;
408 else if (strstr(tex
, "horizontal") != NULL
)
409 *grad
= Background_Horizontal
;
410 else if (strstr(tex
, "vertical") != NULL
)
411 *grad
= Background_Vertical
;
413 *grad
= Background_Diagonal
;
415 *grad
= Background_Solid
;
418 if (strstr(tex
, "sunken") != NULL
)
420 else if (strstr(tex
, "flat") != NULL
)
426 if (*relief
== Flat
) {
427 if (strstr(tex
, "border") != NULL
)
430 if (strstr(tex
, "bevel2") != NULL
)
436 if (strstr(tex
, "interlaced") != NULL
)
444 static gboolean
read_appearance(XrmDatabase db
, char *rname
, Appearance
*value
)
446 gboolean ret
= FALSE
;
447 char *rclass
= create_class_name(rname
), *cname
, *ctoname
, *bcname
;
451 cname
= g_strconcat(rname
, ".color", NULL
);
452 ctoname
= g_strconcat(rname
, ".colorTo", NULL
);
453 bcname
= g_strconcat(rname
, ".borderColor", NULL
);
455 if (XrmGetResource(db
, rname
, rclass
, &rettype
, &retvalue
) &&
456 retvalue
.addr
!= NULL
) {
457 parse_appearance(retvalue
.addr
,
458 &value
->surface
.grad
,
459 &value
->surface
.relief
,
460 &value
->surface
.bevel
,
461 &value
->surface
.interlaced
,
462 &value
->surface
.border
);
463 if (!read_color(db
, cname
, &value
->surface
.primary
))
464 value
->surface
.primary
= color_new(0, 0, 0);
465 if (!read_color(db
, ctoname
, &value
->surface
.secondary
))
466 value
->surface
.secondary
= color_new(0, 0, 0);
467 if (value
->surface
.border
)
468 if (!read_color(db
, bcname
,
469 &value
->surface
.border_color
))
470 value
->surface
.border_color
= color_new(0, 0, 0);
481 static void set_default_appearance(Appearance
*a
)
483 a
->surface
.grad
= Background_Solid
;
484 a
->surface
.relief
= Flat
;
485 a
->surface
.bevel
= Bevel1
;
486 a
->surface
.interlaced
= FALSE
;
487 a
->surface
.border
= FALSE
;
488 a
->surface
.primary
= color_new(0, 0, 0);
489 a
->surface
.secondary
= color_new(0, 0, 0);
492 char *theme_load(char *theme
)
494 XrmDatabase db
= NULL
;
496 Justify winjust
, mtitlejust
, mjust
;
503 g_warning("Failed to load the theme '%s'", theme
);
504 g_message("Falling back to the default: '%s'", DEFAULT_THEME
);
506 loaded
= g_strdup(theme
);
509 db
= loaddb(DEFAULT_THEME
);
511 g_warning("Failed to load the theme '%s'.", DEFAULT_THEME
);
514 loaded
= g_strdup(DEFAULT_THEME
);
517 /* load the font stuff */
518 font_str
= "arial:bold:pixelsize=10";
520 theme_winfont_shadow
= FALSE
;
521 if (read_string(db
, "window.xft.flags", &str
)) {
522 if (g_strrstr(str
, "shadow"))
523 theme_winfont_shadow
= TRUE
;
527 if (!read_int(db
, "window.xft.shadow.offset",
528 &theme_winfont_shadow_offset
))
529 theme_winfont_shadow_offset
= 1;
530 if (!read_int(db
, "window.xft.shadow.tint",
531 &theme_winfont_shadow_tint
) ||
532 theme_winfont_shadow_tint
< 100 || theme_winfont_shadow_tint
> 100)
533 theme_winfont_shadow_tint
= 25;
535 theme_winfont
= font_open(font_str
);
536 theme_winfont_height
= font_height(theme_winfont
, theme_winfont_shadow
,
537 theme_winfont_shadow_offset
);
539 winjust
= Justify_Left
;
540 if (read_string(db
, "window.justify", &str
)) {
541 if (!g_ascii_strcasecmp(str
, "right"))
542 winjust
= Justify_Right
;
543 else if (!g_ascii_strcasecmp(str
, "center"))
544 winjust
= Justify_Center
;
548 font_str
= "arial-10:bold";
550 theme_mtitlefont_shadow
= FALSE
;
551 if (read_string(db
, "menu.title.xft.flags", &str
)) {
552 if (g_strrstr(str
, "shadow"))
553 theme_mtitlefont_shadow
= TRUE
;
557 if (!read_int(db
, "menu.title.xft.shadow.offset",
558 &theme_mtitlefont_shadow_offset
))
559 theme_mtitlefont_shadow_offset
= 1;
560 if (!read_int(db
, "menu.title.xft.shadow.tint",
561 &theme_mtitlefont_shadow_tint
) ||
562 theme_mtitlefont_shadow_tint
< 100 ||
563 theme_mtitlefont_shadow_tint
> 100)
564 theme_mtitlefont_shadow_tint
= 25;
566 theme_mtitlefont
= font_open(font_str
);
567 theme_mtitlefont_height
= font_height(theme_mtitlefont
,
568 theme_mtitlefont_shadow
,
569 theme_mtitlefont_shadow_offset
);
571 mtitlejust
= Justify_Left
;
572 if (read_string(db
, "menu.title.justify", &str
)) {
573 if (!g_ascii_strcasecmp(str
, "right"))
574 mtitlejust
= Justify_Right
;
575 else if (!g_ascii_strcasecmp(str
, "center"))
576 mtitlejust
= Justify_Center
;
580 font_str
= "arial-8";
582 theme_mfont_shadow
= FALSE
;
583 if (read_string(db
, "menu.frame.xft.flags", &str
)) {
584 if (g_strrstr(str
, "shadow"))
585 theme_mfont_shadow
= TRUE
;
589 if (!read_int(db
, "menu.frame.xft.shadow.offset",
590 &theme_mfont_shadow_offset
))
591 theme_mfont_shadow_offset
= 1;
592 if (!read_int(db
, "menu.frame.xft.shadow.tint",
593 &theme_mfont_shadow_tint
) ||
594 theme_mfont_shadow_tint
< 100 ||
595 theme_mfont_shadow_tint
> 100)
596 theme_mfont_shadow_tint
= 25;
598 theme_mfont
= font_open(font_str
);
599 theme_mfont_height
= font_height(theme_mfont
, theme_mfont_shadow
,
600 theme_mfont_shadow_offset
);
602 mjust
= Justify_Left
;
603 if (read_string(db
, "menu.frame.justify", &str
)) {
604 if (!g_ascii_strcasecmp(str
, "right"))
605 mjust
= Justify_Right
;
606 else if (!g_ascii_strcasecmp(str
, "center"))
607 mjust
= Justify_Center
;
611 /* load the title layout */
612 theme_title_layout
= g_strdup("NLIMC");
614 if (!read_int(db
, "handleWidth", &theme_handle_height
) ||
615 theme_handle_height
< 0 || theme_handle_height
> 100)
616 theme_handle_height
= 6;
617 if (!read_int(db
, "bevelWidth", &theme_bevel
) ||
618 theme_bevel
<= 0 || theme_bevel
> 100) theme_bevel
= 3;
619 if (!read_int(db
, "borderWidth", &theme_bwidth
) ||
620 theme_bwidth
< 0 || theme_bwidth
> 100) theme_bwidth
= 1;
621 if (!read_int(db
, "frameWidth", &theme_cbwidth
) ||
622 theme_cbwidth
< 0 || theme_cbwidth
> 100) theme_cbwidth
= theme_bevel
;
625 if (!read_color(db
, "borderColor", &theme_b_color
))
626 theme_b_color
= color_new(0, 0, 0);
627 if (!read_color(db
, "window.frame.focusColor", &theme_cb_focused_color
))
628 theme_cb_focused_color
= color_new(0xff, 0xff, 0xff);
629 if (!read_color(db
, "window.frame.unfocusColor",&theme_cb_unfocused_color
))
630 theme_cb_unfocused_color
= color_new(0xff, 0xff, 0xff);
631 if (!read_color(db
, "window.label.focus.textColor",
632 &theme_title_focused_color
))
633 theme_title_focused_color
= color_new(0x0, 0x0, 0x0);
634 if (!read_color(db
, "window.label.unfocus.textColor",
635 &theme_title_unfocused_color
))
636 theme_title_unfocused_color
= color_new(0xff, 0xff, 0xff);
637 if (!read_color(db
, "window.button.focus.picColor",
638 &theme_titlebut_focused_color
))
639 theme_titlebut_focused_color
= color_new(0, 0, 0);
640 if (!read_color(db
, "window.button.unfocus.picColor",
641 &theme_titlebut_unfocused_color
))
642 theme_titlebut_unfocused_color
= color_new(0xff, 0xff, 0xff);
643 if (!read_color(db
, "menu.title.textColor", &theme_menu_title_color
))
644 theme_menu_title_color
= color_new(0, 0, 0);
645 if (!read_color(db
, "menu.frame.textColor", &theme_menu_color
))
646 theme_menu_color
= color_new(0xff, 0xff, 0xff);
647 if (!read_color(db
, "menu.frame.disableColor", &theme_menu_disabled_color
))
648 theme_menu_disabled_color
= color_new(0, 0, 0);
649 if (!read_color(db
, "menu.hilite.textColor", &theme_menu_hilite_color
))
650 theme_menu_hilite_color
= color_new(0, 0, 0);
652 if (read_mask(db
, "window.button.max.mask", theme
, &theme_max_unset_mask
)){
653 if (!read_mask(db
, "window.button.max.toggled.mask", theme
,
654 &theme_max_set_mask
)) {
655 theme_max_set_mask
= pixmap_mask_copy(theme_max_unset_mask
);
659 char data
[] = { 0x7f, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f };
660 theme_max_unset_mask
= pixmap_mask_new(7, 7, data
);
663 char data
[] = { 0x7c, 0x44, 0x47, 0x47, 0x7f, 0x1f, 0x1f };
664 theme_max_set_mask
= pixmap_mask_new(7, 7, data
);
668 if (!read_mask(db
, "window.button.icon.mask", theme
,
669 &theme_iconify_mask
)) {
670 char data
[] = { 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x7f };
671 theme_iconify_mask
= pixmap_mask_new(7, 7, data
);
674 if (read_mask(db
, "window.button.stick.mask", theme
,
675 &theme_desk_unset_mask
)) {
676 if (!read_mask(db
, "window.button.stick.toggled.mask", theme
,
677 &theme_desk_set_mask
)) {
678 theme_desk_set_mask
=
679 pixmap_mask_copy(theme_desk_unset_mask
);
683 char data
[] = { 0x63, 0x63, 0x00, 0x00, 0x00, 0x63, 0x63 };
684 theme_desk_unset_mask
= pixmap_mask_new(7, 7, data
);
687 char data
[] = { 0x00, 0x36, 0x36, 0x08, 0x36, 0x36, 0x00 };
688 theme_desk_set_mask
= pixmap_mask_new(7, 7, data
);
692 if (read_mask(db
, "window.button.shade.mask", theme
,
693 &theme_shade_unset_mask
)) {
694 if (!read_mask(db
, "window.button.shade.toggled.mask", theme
,
695 &theme_shade_set_mask
)) {
696 theme_shade_set_mask
=
697 pixmap_mask_copy(theme_shade_unset_mask
);
701 char data
[] = { 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00 };
702 theme_shade_unset_mask
= pixmap_mask_new(7, 7, data
);
705 char data
[] = { 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x7f };
706 theme_shade_set_mask
= pixmap_mask_new(7, 7, data
);
710 if (!read_mask(db
, "window.button.close.mask", theme
,
711 &theme_close_mask
)) {
712 char data
[] = { 0x63, 0x77, 0x3e, 0x1c, 0x3e, 0x77, 0x63 };
713 theme_close_mask
= pixmap_mask_new(7, 7, data
);
716 /* read the decoration textures */
717 if (!read_appearance(db
, "window.title.focus", theme_a_focused_title
))
718 set_default_appearance(theme_a_focused_title
);
719 if (!read_appearance(db
, "window.title.unfocus", theme_a_unfocused_title
))
720 set_default_appearance(theme_a_unfocused_title
);
721 if (!read_appearance(db
, "window.label.focus", theme_a_focused_label
))
722 set_default_appearance(theme_a_focused_label
);
723 if (!read_appearance(db
, "window.label.unfocus", theme_a_unfocused_label
))
724 set_default_appearance(theme_a_unfocused_label
);
725 if (!read_appearance(db
, "window.handle.focus", theme_a_focused_handle
))
726 set_default_appearance(theme_a_focused_handle
);
727 if (!read_appearance(db
, "window.handle.unfocus",theme_a_unfocused_handle
))
728 set_default_appearance(theme_a_unfocused_handle
);
729 if (!read_appearance(db
, "window.grip.focus", theme_a_focused_grip
))
730 set_default_appearance(theme_a_focused_grip
);
731 if (!read_appearance(db
, "window.grip.unfocus", theme_a_unfocused_grip
))
732 set_default_appearance(theme_a_unfocused_grip
);
733 if (!read_appearance(db
, "menu.frame", theme_a_menu
))
734 set_default_appearance(theme_a_menu
);
735 if (!read_appearance(db
, "menu.title", theme_a_menu_title
))
736 set_default_appearance(theme_a_menu_title
);
737 if (!read_appearance(db
, "menu.hilite", theme_a_menu_hilite
))
738 set_default_appearance(theme_a_menu_hilite
);
740 /* read the appearances for rendering non-decorations */
741 if (!read_appearance(db
, "window.title.focus", theme_app_hilite_bg
))
742 set_default_appearance(theme_app_hilite_bg
);
743 if (!read_appearance(db
, "window.label.focus", theme_app_hilite_label
))
744 set_default_appearance(theme_app_hilite_label
);
745 if (!read_appearance(db
, "window.title.unfocus", theme_app_unhilite_bg
))
746 set_default_appearance(theme_app_unhilite_bg
);
747 if (!read_appearance(db
, "window.label.unfocus", theme_app_unhilite_label
))
748 set_default_appearance(theme_app_unhilite_label
);
750 /* read buttons textures */
751 if (!read_appearance(db
, "window.button.pressed.focus",
752 theme_a_focused_pressed_max
))
753 if (!read_appearance(db
, "window.button.pressed",
754 theme_a_focused_pressed_max
))
755 set_default_appearance(theme_a_focused_pressed_max
);
756 if (!read_appearance(db
, "window.button.pressed.unfocus",
757 theme_a_unfocused_pressed_max
))
758 if (!read_appearance(db
, "window.button.pressed",
759 theme_a_unfocused_pressed_max
))
760 set_default_appearance(theme_a_unfocused_pressed_max
);
761 if (!read_appearance(db
, "window.button.focus",
762 theme_a_focused_unpressed_max
))
763 set_default_appearance(theme_a_focused_unpressed_max
);
764 if (!read_appearance(db
, "window.button.unfocus",
765 theme_a_unfocused_unpressed_max
))
766 set_default_appearance(theme_a_unfocused_unpressed_max
);
768 theme_a_unfocused_unpressed_close
=
769 appearance_copy(theme_a_unfocused_unpressed_max
);
770 theme_a_unfocused_pressed_close
=
771 appearance_copy(theme_a_unfocused_pressed_max
);
772 theme_a_focused_unpressed_close
=
773 appearance_copy(theme_a_focused_unpressed_max
);
774 theme_a_focused_pressed_close
=
775 appearance_copy(theme_a_focused_pressed_max
);
776 theme_a_unfocused_unpressed_desk
=
777 appearance_copy(theme_a_unfocused_unpressed_max
);
778 theme_a_unfocused_pressed_desk
=
779 appearance_copy(theme_a_unfocused_pressed_max
);
780 theme_a_unfocused_pressed_set_desk
=
781 appearance_copy(theme_a_unfocused_pressed_max
);
782 theme_a_focused_unpressed_desk
=
783 appearance_copy(theme_a_focused_unpressed_max
);
784 theme_a_focused_pressed_desk
=
785 appearance_copy(theme_a_focused_pressed_max
);
786 theme_a_focused_pressed_set_desk
=
787 appearance_copy(theme_a_focused_pressed_max
);
788 theme_a_unfocused_unpressed_shade
=
789 appearance_copy(theme_a_unfocused_unpressed_max
);
790 theme_a_unfocused_pressed_shade
=
791 appearance_copy(theme_a_unfocused_pressed_max
);
792 theme_a_unfocused_pressed_set_shade
=
793 appearance_copy(theme_a_unfocused_pressed_max
);
794 theme_a_focused_unpressed_shade
=
795 appearance_copy(theme_a_focused_unpressed_max
);
796 theme_a_focused_pressed_shade
=
797 appearance_copy(theme_a_focused_pressed_max
);
798 theme_a_focused_pressed_set_shade
=
799 appearance_copy(theme_a_focused_pressed_max
);
800 theme_a_unfocused_unpressed_iconify
=
801 appearance_copy(theme_a_unfocused_unpressed_max
);
802 theme_a_unfocused_pressed_iconify
=
803 appearance_copy(theme_a_unfocused_pressed_max
);
804 theme_a_focused_unpressed_iconify
=
805 appearance_copy(theme_a_focused_unpressed_max
);
806 theme_a_focused_pressed_iconify
=
807 appearance_copy(theme_a_focused_pressed_max
);
808 theme_a_unfocused_pressed_set_max
=
809 appearance_copy(theme_a_unfocused_pressed_max
);
810 theme_a_focused_pressed_set_max
=
811 appearance_copy(theme_a_focused_pressed_max
);
813 theme_a_icon
->surface
.grad
= Background_ParentRelative
;
815 /* set up the textures */
816 theme_a_focused_label
->texture
[0].type
=
817 theme_app_hilite_label
->texture
[0].type
= Text
;
818 theme_a_focused_label
->texture
[0].data
.text
.justify
= winjust
;
819 theme_app_hilite_label
->texture
[0].data
.text
.justify
= Justify_Left
;
820 theme_a_focused_label
->texture
[0].data
.text
.font
=
821 theme_app_hilite_label
->texture
[0].data
.text
.font
= theme_winfont
;
822 theme_a_focused_label
->texture
[0].data
.text
.shadow
=
823 theme_app_hilite_label
->texture
[0].data
.text
.shadow
=
824 theme_winfont_shadow
;
825 theme_a_focused_label
->texture
[0].data
.text
.offset
=
826 theme_app_hilite_label
->texture
[0].data
.text
.offset
=
827 theme_winfont_shadow_offset
;
828 theme_a_focused_label
->texture
[0].data
.text
.tint
=
829 theme_app_hilite_label
->texture
[0].data
.text
.tint
=
830 theme_winfont_shadow_tint
;
831 theme_a_focused_label
->texture
[0].data
.text
.color
=
832 theme_app_hilite_label
->texture
[0].data
.text
.color
=
833 theme_title_focused_color
;
835 theme_a_unfocused_label
->texture
[0].type
=
836 theme_app_unhilite_label
->texture
[0].type
= Text
;
837 theme_a_unfocused_label
->texture
[0].data
.text
.justify
= winjust
;
838 theme_app_unhilite_label
->texture
[0].data
.text
.justify
= Justify_Left
;
839 theme_a_unfocused_label
->texture
[0].data
.text
.font
=
840 theme_app_unhilite_label
->texture
[0].data
.text
.font
= theme_winfont
;
841 theme_a_unfocused_label
->texture
[0].data
.text
.shadow
=
842 theme_app_unhilite_label
->texture
[0].data
.text
.shadow
=
843 theme_winfont_shadow
;
844 theme_a_unfocused_label
->texture
[0].data
.text
.offset
=
845 theme_app_unhilite_label
->texture
[0].data
.text
.offset
=
846 theme_winfont_shadow_offset
;
847 theme_a_unfocused_label
->texture
[0].data
.text
.tint
=
848 theme_app_unhilite_label
->texture
[0].data
.text
.tint
=
849 theme_winfont_shadow_tint
;
850 theme_a_unfocused_label
->texture
[0].data
.text
.color
=
851 theme_app_unhilite_label
->texture
[0].data
.text
.color
=
852 theme_title_unfocused_color
;
854 theme_a_menu_title
->texture
[0].type
= Text
;
855 theme_a_menu_title
->texture
[0].data
.text
.justify
= mtitlejust
;
856 theme_a_menu_title
->texture
[0].data
.text
.font
= theme_mtitlefont
;
857 theme_a_menu_title
->texture
[0].data
.text
.shadow
= theme_mtitlefont_shadow
;
858 theme_a_menu_title
->texture
[0].data
.text
.offset
=
859 theme_mtitlefont_shadow_offset
;
860 theme_a_menu_title
->texture
[0].data
.text
.tint
=
861 theme_mtitlefont_shadow_tint
;
862 theme_a_menu_title
->texture
[0].data
.text
.color
= theme_menu_title_color
;
864 theme_a_menu_item
->surface
.grad
=
865 theme_a_menu_disabled
->surface
.grad
=
866 theme_app_icon
->surface
.grad
= Background_ParentRelative
;
868 theme_a_menu_item
->texture
[0].type
=
869 theme_a_menu_disabled
->texture
[0].type
=
870 theme_a_menu_hilite
->texture
[0].type
= Text
;
871 theme_a_menu_item
->texture
[0].data
.text
.justify
=
872 theme_a_menu_disabled
->texture
[0].data
.text
.justify
=
873 theme_a_menu_hilite
->texture
[0].data
.text
.justify
= mjust
;
874 theme_a_menu_item
->texture
[0].data
.text
.font
=
875 theme_a_menu_disabled
->texture
[0].data
.text
.font
=
876 theme_a_menu_hilite
->texture
[0].data
.text
.font
= theme_mfont
;
877 theme_a_menu_item
->texture
[0].data
.text
.shadow
=
878 theme_a_menu_disabled
->texture
[0].data
.text
.shadow
=
879 theme_a_menu_hilite
->texture
[0].data
.text
.shadow
= theme_mfont_shadow
;
880 theme_a_menu_item
->texture
[0].data
.text
.offset
=
881 theme_a_menu_disabled
->texture
[0].data
.text
.offset
=
882 theme_a_menu_hilite
->texture
[0].data
.text
.offset
=
883 theme_mfont_shadow_offset
;
884 theme_a_menu_item
->texture
[0].data
.text
.tint
=
885 theme_a_menu_disabled
->texture
[0].data
.text
.tint
=
886 theme_a_menu_hilite
->texture
[0].data
.text
.tint
=
887 theme_mfont_shadow_tint
;
888 theme_a_menu_item
->texture
[0].data
.text
.color
= theme_menu_color
;
889 theme_a_menu_disabled
->texture
[0].data
.text
.color
=
890 theme_menu_disabled_color
;
891 theme_a_menu_hilite
->texture
[0].data
.text
.color
= theme_menu_hilite_color
;
893 theme_a_focused_unpressed_max
->texture
[0].type
=
894 theme_a_focused_pressed_max
->texture
[0].type
=
895 theme_a_focused_pressed_set_max
->texture
[0].type
=
896 theme_a_unfocused_unpressed_max
->texture
[0].type
=
897 theme_a_unfocused_pressed_max
->texture
[0].type
=
898 theme_a_unfocused_pressed_set_max
->texture
[0].type
=
899 theme_a_focused_unpressed_close
->texture
[0].type
=
900 theme_a_focused_pressed_close
->texture
[0].type
=
901 theme_a_unfocused_unpressed_close
->texture
[0].type
=
902 theme_a_unfocused_pressed_close
->texture
[0].type
=
903 theme_a_focused_unpressed_desk
->texture
[0].type
=
904 theme_a_focused_pressed_desk
->texture
[0].type
=
905 theme_a_focused_pressed_set_desk
->texture
[0].type
=
906 theme_a_unfocused_unpressed_desk
->texture
[0].type
=
907 theme_a_unfocused_pressed_desk
->texture
[0].type
=
908 theme_a_unfocused_pressed_set_desk
->texture
[0].type
=
909 theme_a_focused_unpressed_shade
->texture
[0].type
=
910 theme_a_focused_pressed_shade
->texture
[0].type
=
911 theme_a_focused_pressed_set_shade
->texture
[0].type
=
912 theme_a_unfocused_unpressed_shade
->texture
[0].type
=
913 theme_a_unfocused_pressed_shade
->texture
[0].type
=
914 theme_a_unfocused_pressed_set_shade
->texture
[0].type
=
915 theme_a_focused_unpressed_iconify
->texture
[0].type
=
916 theme_a_focused_pressed_iconify
->texture
[0].type
=
917 theme_a_unfocused_unpressed_iconify
->texture
[0].type
=
918 theme_a_unfocused_pressed_iconify
->texture
[0].type
= Bitmask
;
919 theme_a_focused_unpressed_max
->texture
[0].data
.mask
.mask
=
920 theme_a_unfocused_unpressed_max
->texture
[0].data
.mask
.mask
=
921 theme_a_focused_pressed_max
->texture
[0].data
.mask
.mask
=
922 theme_a_unfocused_pressed_max
->texture
[0].data
.mask
.mask
=
923 theme_max_unset_mask
;
924 theme_a_focused_pressed_set_max
->texture
[0].data
.mask
.mask
=
925 theme_a_unfocused_pressed_set_max
->texture
[0].data
.mask
.mask
=
927 theme_a_focused_pressed_close
->texture
[0].data
.mask
.mask
=
928 theme_a_unfocused_pressed_close
->texture
[0].data
.mask
.mask
=
929 theme_a_focused_unpressed_close
->texture
[0].data
.mask
.mask
=
930 theme_a_unfocused_unpressed_close
->texture
[0].data
.mask
.mask
=
932 theme_a_focused_unpressed_desk
->texture
[0].data
.mask
.mask
=
933 theme_a_unfocused_unpressed_desk
->texture
[0].data
.mask
.mask
=
934 theme_a_focused_pressed_desk
->texture
[0].data
.mask
.mask
=
935 theme_a_unfocused_pressed_desk
->texture
[0].data
.mask
.mask
=
936 theme_desk_unset_mask
;
937 theme_a_focused_pressed_set_desk
->texture
[0].data
.mask
.mask
=
938 theme_a_unfocused_pressed_set_desk
->texture
[0].data
.mask
.mask
=
940 theme_a_focused_unpressed_shade
->texture
[0].data
.mask
.mask
=
941 theme_a_unfocused_unpressed_shade
->texture
[0].data
.mask
.mask
=
942 theme_a_focused_pressed_shade
->texture
[0].data
.mask
.mask
=
943 theme_a_unfocused_pressed_shade
->texture
[0].data
.mask
.mask
=
944 theme_shade_unset_mask
;
945 theme_a_focused_pressed_set_shade
->texture
[0].data
.mask
.mask
=
946 theme_a_unfocused_pressed_set_shade
->texture
[0].data
.mask
.mask
=
947 theme_shade_set_mask
;
948 theme_a_focused_unpressed_iconify
->texture
[0].data
.mask
.mask
=
949 theme_a_unfocused_unpressed_iconify
->texture
[0].data
.mask
.mask
=
950 theme_a_focused_pressed_iconify
->texture
[0].data
.mask
.mask
=
951 theme_a_unfocused_pressed_iconify
->texture
[0].data
.mask
.mask
=
953 theme_a_focused_unpressed_max
->texture
[0].data
.mask
.color
=
954 theme_a_focused_pressed_max
->texture
[0].data
.mask
.color
=
955 theme_a_focused_pressed_set_max
->texture
[0].data
.mask
.color
=
956 theme_a_focused_unpressed_close
->texture
[0].data
.mask
.color
=
957 theme_a_focused_pressed_close
->texture
[0].data
.mask
.color
=
958 theme_a_focused_unpressed_desk
->texture
[0].data
.mask
.color
=
959 theme_a_focused_pressed_desk
->texture
[0].data
.mask
.color
=
960 theme_a_focused_pressed_set_desk
->texture
[0].data
.mask
.color
=
961 theme_a_focused_unpressed_shade
->texture
[0].data
.mask
.color
=
962 theme_a_focused_pressed_shade
->texture
[0].data
.mask
.color
=
963 theme_a_focused_pressed_set_shade
->texture
[0].data
.mask
.color
=
964 theme_a_focused_unpressed_iconify
->texture
[0].data
.mask
.color
=
965 theme_a_focused_pressed_iconify
->texture
[0].data
.mask
.color
=
966 theme_titlebut_focused_color
;
967 theme_a_unfocused_unpressed_max
->texture
[0].data
.mask
.color
=
968 theme_a_unfocused_pressed_max
->texture
[0].data
.mask
.color
=
969 theme_a_unfocused_pressed_set_max
->texture
[0].data
.mask
.color
=
970 theme_a_unfocused_unpressed_close
->texture
[0].data
.mask
.color
=
971 theme_a_unfocused_pressed_close
->texture
[0].data
.mask
.color
=
972 theme_a_unfocused_unpressed_desk
->texture
[0].data
.mask
.color
=
973 theme_a_unfocused_pressed_desk
->texture
[0].data
.mask
.color
=
974 theme_a_unfocused_pressed_set_desk
->texture
[0].data
.mask
.color
=
975 theme_a_unfocused_unpressed_shade
->texture
[0].data
.mask
.color
=
976 theme_a_unfocused_pressed_shade
->texture
[0].data
.mask
.color
=
977 theme_a_unfocused_pressed_set_shade
->texture
[0].data
.mask
.color
=
978 theme_a_unfocused_unpressed_iconify
->texture
[0].data
.mask
.color
=
979 theme_a_unfocused_pressed_iconify
->texture
[0].data
.mask
.color
=
980 theme_titlebut_unfocused_color
;
982 XrmDestroyDatabase(db
);