diff --git a/Makefile.am b/Makefile.am
index be621a07..f1b1b9f8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,9 +28,11 @@ lib_LTLIBRARIES = \
bin_PROGRAMS = \
openbox/openbox \
- tools/themetoxml/themetoxml \
tools/gnome-panel-control/gnome-panel-control
+noinst_PROGRAMS = \
+ tools/themetoxml/themetoxml
+
## render ##
render_rendertest_CPPFLAGS = \
@@ -237,7 +239,7 @@ dist_mikachu_theme_DATA= \
themes/Mikachu/openbox-3/desk.xbm \
themes/Mikachu/openbox-3/iconify.xbm \
themes/Mikachu/openbox-3/max.xbm \
- themes/Mikachu/openbox-3/themerc
+ themes/Mikachu/openbox-3/themerc.xml
natura_themedir = $(themedir)/Natura/openbox-3
@@ -254,7 +256,7 @@ dist_natura_theme_DATA= \
themes/Natura/openbox-3/max_toggled.xbm \
themes/Natura/openbox-3/max.xbm \
themes/Natura/openbox-3/shade.xbm \
- themes/Natura/openbox-3/themerc
+ themes/Natura/openbox-3/themerc.xml
artwizboxed_themedir = $(themedir)/artwiz-boxed/openbox-3
dist_artwizboxed_theme_DATA= \
@@ -265,7 +267,7 @@ dist_artwizboxed_theme_DATA= \
themes/artwiz-boxed/openbox-3/iconify.xbm \
themes/artwiz-boxed/openbox-3/max_toggled.xbm \
themes/artwiz-boxed/openbox-3/max.xbm \
- themes/artwiz-boxed/openbox-3/themerc
+ themes/artwiz-boxed/openbox-3/themerc.xml
bear2_themedir = $(themedir)/bear2/openbox-3
dist_bear2_theme_DATA= \
@@ -282,11 +284,11 @@ dist_bear2_theme_DATA= \
themes/bear2/openbox-3/max.xbm \
themes/bear2/openbox-3/shade_pressed.xbm \
themes/bear2/openbox-3/shade.xbm \
- themes/bear2/openbox-3/themerc
+ themes/bear2/openbox-3/themerc.xml
orang_themedir = $(themedir)/orang/openbox-3
dist_orang_theme_DATA= \
- themes/orang/openbox-3/themerc
+ themes/orang/openbox-3/themerc.xml
syscrash_themedir = $(themedir)/syscrash/openbox-3
dist_syscrash_theme_DATA= \
@@ -301,7 +303,7 @@ dist_syscrash_theme_DATA= \
themes/syscrash/openbox-3/max_toggled.xbm \
themes/syscrash/openbox-3/max.xbm \
themes/syscrash/openbox-3/shade.xbm \
- themes/syscrash/openbox-3/themerc
+ themes/syscrash/openbox-3/themerc.xml
## public headers ##
diff --git a/data/themerc.xsd b/data/themerc.xsd
new file mode 100755
index 00000000..7b9573d9
--- /dev/null
+++ b/data/themerc.xsd
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+ Openbox theme definition
+ Version 1
+ Copyright 2007 Dana Jansens
+
+
+
+
+
+
+ The root node
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/m4/openbox.m4 b/m4/openbox.m4
index 32162353..663f91db 100644
--- a/m4/openbox.m4
+++ b/m4/openbox.m4
@@ -64,7 +64,7 @@ AC_DEFUN([OB_COMPILER_FLAGS],
if test "$GCC" = "yes"; then
AC_MSG_RESULT([yes])
if test "$DEBUG" = "yes"; then
- FLAGS="$FLAGS -g -fno-inline -fno-strict-aliasing"
+ FLAGS="$FLAGS -O0 -g -fno-inline"
FLAGS="$FLAGS -Wall -Wsign-compare -Waggregate-return"
FLAGS="$FLAGS -Wcast-qual -Wbad-function-cast -Wpointer-arith"
# for Python.h
@@ -73,6 +73,7 @@ AC_DEFUN([OB_COMPILER_FLAGS],
if test "$STRICT" = "yes"; then
FLAGS="$FLAGS -ansi -pedantic -D_XOPEN_SOURCE"
fi
+ FLAGS="$FLAGS -fno-strict-aliasing"
fi
AC_MSG_CHECKING([for compiler specific flags])
AC_MSG_RESULT([$FLAGS])
diff --git a/openbox/dock.c b/openbox/dock.c
index eceb3b99..53c79139 100644
--- a/openbox/dock.c
+++ b/openbox/dock.c
@@ -57,8 +57,8 @@ void dock_startup(gboolean reconfig)
GList *it;
XSetWindowBorder(ob_display, dock->frame,
- RrColorPixel(ob_rr_theme->b_color));
- XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->bwidth);
+ RrColorPixel(ob_rr_theme->frame_b_color));
+ XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->fbwidth);
RrAppearanceFree(dock->a_frame);
dock->a_frame = RrAppearanceCopy(ob_rr_theme->a_focused_title);
@@ -91,8 +91,8 @@ void dock_startup(gboolean reconfig)
&attrib);
dock->a_frame = RrAppearanceCopy(ob_rr_theme->a_focused_title);
XSetWindowBorder(ob_display, dock->frame,
- RrColorPixel(ob_rr_theme->b_color));
- XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->bwidth);
+ RrColorPixel(ob_rr_theme->frame_b_color));
+ XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->fbwidth);
g_hash_table_insert(window_map, &dock->frame, dock);
stacking_add(DOCK_AS_WINDOW(dock));
@@ -261,8 +261,8 @@ void dock_configure()
}
/* used for calculating offsets */
- dock->w += ob_rr_theme->bwidth * 2;
- dock->h += ob_rr_theme->bwidth * 2;
+ dock->w += ob_rr_theme->fbwidth * 2;
+ dock->h += ob_rr_theme->fbwidth * 2;
a = screen_physical_area();
@@ -349,51 +349,51 @@ void dock_configure()
case OB_DIRECTION_NORTHWEST:
switch (config_dock_orient) {
case OB_ORIENTATION_HORZ:
- dock->y -= dock->h - ob_rr_theme->bwidth;
+ dock->y -= dock->h - ob_rr_theme->fbwidth;
break;
case OB_ORIENTATION_VERT:
- dock->x -= dock->w - ob_rr_theme->bwidth;
+ dock->x -= dock->w - ob_rr_theme->fbwidth;
break;
}
break;
case OB_DIRECTION_NORTH:
- dock->y -= dock->h - ob_rr_theme->bwidth;
+ dock->y -= dock->h - ob_rr_theme->fbwidth;
break;
case OB_DIRECTION_NORTHEAST:
switch (config_dock_orient) {
case OB_ORIENTATION_HORZ:
- dock->y -= dock->h - ob_rr_theme->bwidth;
+ dock->y -= dock->h - ob_rr_theme->fbwidth;
break;
case OB_ORIENTATION_VERT:
- dock->x += dock->w - ob_rr_theme->bwidth;
+ dock->x += dock->w - ob_rr_theme->fbwidth;
break;
}
break;
case OB_DIRECTION_WEST:
- dock->x -= dock->w - ob_rr_theme->bwidth;
+ dock->x -= dock->w - ob_rr_theme->fbwidth;
break;
case OB_DIRECTION_EAST:
- dock->x += dock->w - ob_rr_theme->bwidth;
+ dock->x += dock->w - ob_rr_theme->fbwidth;
break;
case OB_DIRECTION_SOUTHWEST:
switch (config_dock_orient) {
case OB_ORIENTATION_HORZ:
- dock->y += dock->h - ob_rr_theme->bwidth;
+ dock->y += dock->h - ob_rr_theme->fbwidth;
break;
case OB_ORIENTATION_VERT:
- dock->x -= dock->w - ob_rr_theme->bwidth;
+ dock->x -= dock->w - ob_rr_theme->fbwidth;
break;
} break;
case OB_DIRECTION_SOUTH:
- dock->y += dock->h - ob_rr_theme->bwidth;
+ dock->y += dock->h - ob_rr_theme->fbwidth;
break;
case OB_DIRECTION_SOUTHEAST:
switch (config_dock_orient) {
case OB_ORIENTATION_HORZ:
- dock->y += dock->h - ob_rr_theme->bwidth;
+ dock->y += dock->h - ob_rr_theme->fbwidth;
break;
case OB_ORIENTATION_VERT:
- dock->x += dock->w - ob_rr_theme->bwidth;
+ dock->x += dock->w - ob_rr_theme->fbwidth;
break;
}
break;
@@ -402,8 +402,8 @@ void dock_configure()
}
if (!config_dock_floating && config_dock_hide) {
- strw = ob_rr_theme->bwidth;
- strh = ob_rr_theme->bwidth;
+ strw = ob_rr_theme->fbwidth;
+ strh = ob_rr_theme->fbwidth;
} else {
strw = dock->w;
strh = dock->h;
@@ -501,8 +501,8 @@ void dock_configure()
dock->h += minh;
/* not used for actually sizing shit */
- dock->w -= ob_rr_theme->bwidth * 2;
- dock->h -= ob_rr_theme->bwidth * 2;
+ dock->w -= ob_rr_theme->fbwidth * 2;
+ dock->h -= ob_rr_theme->fbwidth * 2;
if (dock->dock_apps) {
g_assert(dock->w > 0);
@@ -517,8 +517,8 @@ void dock_configure()
XUnmapWindow(ob_display, dock->frame);
/* but they are useful outside of this function! */
- dock->w += ob_rr_theme->bwidth * 2;
- dock->h += ob_rr_theme->bwidth * 2;
+ dock->w += ob_rr_theme->fbwidth * 2;
+ dock->h += ob_rr_theme->fbwidth * 2;
screen_update_areas();
}
diff --git a/openbox/event.c b/openbox/event.c
index b978f563..6314c9f7 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -597,9 +597,9 @@ static void event_handle_root(XEvent *e)
} else if (msgtype == prop_atoms.net_showing_desktop) {
screen_show_desktop(e->xclient.data.l[0] != 0);
} else if (msgtype == prop_atoms.ob_control) {
- if ((Atom)e->xclient.data.l[0] == 1)
+ if (e->xclient.data.l[0] == 1)
ob_reconfigure();
- else if ((Atom)e->xclient.data.l[0] == 2)
+ else if (e->xclient.data.l[0] == 2)
ob_restart();
}
break;
diff --git a/openbox/focus.c b/openbox/focus.c
index edd26b69..f867ff16 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -392,7 +392,7 @@ void focus_cycle_draw_indicator()
wt = wl = wr = wb = MAX(3,
ob_rr_theme->handle_height +
- ob_rr_theme->bwidth * 2);
+ ob_rr_theme->fbwidth * 2);
x = focus_cycle_target->frame->area.x;
y = focus_cycle_target->frame->area.y;
diff --git a/openbox/frame.c b/openbox/frame.c
index 57a1b8ab..b92c3f12 100644
--- a/openbox/frame.c
+++ b/openbox/frame.c
@@ -159,15 +159,15 @@ static void set_theme_statics(ObFrame *self)
{
/* set colors/appearance/sizes for stuff that doesn't change */
XSetWindowBorder(ob_display, self->window,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->frame_b_color));
XSetWindowBorder(ob_display, self->title,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->frame_b_color));
XSetWindowBorder(ob_display, self->handle,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->frame_b_color));
XSetWindowBorder(ob_display, self->rgrip,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->frame_b_color));
XSetWindowBorder(ob_display, self->lgrip,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->frame_b_color));
XResizeWindow(ob_display, self->max,
ob_rr_theme->button_size, ob_rr_theme->button_size);
@@ -181,14 +181,16 @@ static void set_theme_statics(ObFrame *self)
ob_rr_theme->button_size, ob_rr_theme->button_size);
XResizeWindow(ob_display, self->shade,
ob_rr_theme->button_size, ob_rr_theme->button_size);
- XResizeWindow(ob_display, self->lgrip,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
- XResizeWindow(ob_display, self->rgrip,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ if (ob_rr_theme->handle_height > 0) {
+ XResizeWindow(ob_display, self->lgrip,
+ ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ XResizeWindow(ob_display, self->rgrip,
+ ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ }
XResizeWindow(ob_display, self->tlresize,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ ob_rr_theme->grip_width, ob_rr_theme->top_grip_height);
XResizeWindow(ob_display, self->trresize,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ ob_rr_theme->grip_width, ob_rr_theme->top_grip_height);
/* set up the dynamic appearances */
self->a_unfocused_title = RrAppearanceCopy(ob_rr_theme->a_unfocused_title);
@@ -272,8 +274,8 @@ void frame_adjust_shape(ObFrame *self)
num = 0;
if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
- xrect[0].x = -ob_rr_theme->bwidth;
- xrect[0].y = -ob_rr_theme->bwidth;
+ xrect[0].x = -ob_rr_theme->fbwidth;
+ xrect[0].y = -ob_rr_theme->fbwidth;
xrect[0].width = self->width + self->rbwidth * 2;
xrect[0].height = ob_rr_theme->title_height +
self->bwidth * 2;
@@ -281,7 +283,7 @@ void frame_adjust_shape(ObFrame *self)
}
if (self->decorations & OB_FRAME_DECOR_HANDLE) {
- xrect[1].x = -ob_rr_theme->bwidth;
+ xrect[1].x = -ob_rr_theme->fbwidth;
xrect[1].y = FRAME_HANDLE_Y(self);
xrect[1].width = self->width + self->rbwidth * 2;
xrect[1].height = ob_rr_theme->handle_height +
@@ -308,8 +310,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
self->max_horz = self->client->max_horz;
if (self->decorations & OB_FRAME_DECOR_BORDER) {
- self->bwidth = ob_rr_theme->bwidth;
- self->cbwidth_x = self->cbwidth_y = ob_rr_theme->cbwidth;
+ self->bwidth = ob_rr_theme->fbwidth;
+ self->cbwidth_x = ob_rr_theme->cbwidthx;
+ self->cbwidth_y = ob_rr_theme->cbwidthy;
} else {
self->bwidth = self->cbwidth_x = self->cbwidth_y = 0;
}
@@ -340,7 +343,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
self->innersize.top += ob_rr_theme->title_height + self->rbwidth +
(self->rbwidth - self->bwidth);
if (self->decorations & OB_FRAME_DECOR_HANDLE &&
- ob_rr_theme->show_handle)
+ ob_rr_theme->handle_height > 0)
self->innersize.bottom += ob_rr_theme->handle_height +
self->rbwidth + (self->rbwidth - self->bwidth);
@@ -382,7 +385,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
if (!fake) {
if (self->decorations & OB_FRAME_DECOR_HANDLE &&
- ob_rr_theme->show_handle)
+ ob_rr_theme->handle_height > 0)
{
XMoveResizeWindow(ob_display, self->handle,
-self->bwidth, FRAME_HANDLE_Y(self),
@@ -401,12 +404,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
XUnmapWindow(ob_display, self->lgrip);
XUnmapWindow(ob_display, self->rgrip);
}
-
- /* XXX make a subwindow with these dimentions?
- ob_rr_theme->grip_width + self->bwidth, 0,
- self->width - (ob_rr_theme->grip_width + self->bwidth) * 2,
- ob_rr_theme->handle_height);
- */
} else
XUnmapWindow(ob_display, self->handle);
@@ -608,14 +605,14 @@ static void layout_title(ObFrame *self)
n = d = i = l = m = c = s = FALSE;
/* figure out whats being shown, and the width of the label */
- self->label_width = self->width - (ob_rr_theme->padding + 1) * 2;
+ self->label_width = self->width - (ob_rr_theme->paddingx + 1) * 2;
for (lc = config_title_layout; *lc != '\0'; ++lc) {
switch (*lc) {
case 'N':
if (n) { *lc = ' '; break; } /* rm duplicates */
n = TRUE;
self->label_width -= (ob_rr_theme->button_size + 2 +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
case 'D':
if (d) { *lc = ' '; break; }
@@ -624,7 +621,7 @@ static void layout_title(ObFrame *self)
break;
d = TRUE;
self->label_width -= (ob_rr_theme->button_size +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
case 'S':
if (s) { *lc = ' '; break; }
@@ -633,7 +630,7 @@ static void layout_title(ObFrame *self)
break;
s = TRUE;
self->label_width -= (ob_rr_theme->button_size +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
case 'I':
if (i) { *lc = ' '; break; }
@@ -642,7 +639,7 @@ static void layout_title(ObFrame *self)
break;
i = TRUE;
self->label_width -= (ob_rr_theme->button_size +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
case 'L':
if (l) { *lc = ' '; break; }
@@ -655,7 +652,7 @@ static void layout_title(ObFrame *self)
break;
m = TRUE;
self->label_width -= (ob_rr_theme->button_size +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
case 'C':
if (c) { *lc = ' '; break; }
@@ -664,7 +661,7 @@ static void layout_title(ObFrame *self)
break;
c = TRUE;
self->label_width -= (ob_rr_theme->button_size +
- ob_rr_theme->padding + 1);
+ ob_rr_theme->paddingx + 1);
break;
}
}
@@ -678,57 +675,57 @@ static void layout_title(ObFrame *self)
if (!m) XUnmapWindow(ob_display, self->max);
if (!c) XUnmapWindow(ob_display, self->close);
- x = ob_rr_theme->padding + 1;
+ x = ob_rr_theme->paddingx + 1;
for (lc = config_title_layout; *lc != '\0'; ++lc) {
switch (*lc) {
case 'N':
if (!n) break;
self->icon_x = x;
XMapWindow(ob_display, self->icon);
- XMoveWindow(ob_display, self->icon, x, ob_rr_theme->padding);
- x += ob_rr_theme->button_size + 2 + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->icon, x, ob_rr_theme->paddingx);
+ x += ob_rr_theme->button_size + 2 + ob_rr_theme->paddingx + 1;
break;
case 'D':
if (!d) break;
self->desk_x = x;
XMapWindow(ob_display, self->desk);
- XMoveWindow(ob_display, self->desk, x, ob_rr_theme->padding + 1);
- x += ob_rr_theme->button_size + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->desk, x, ob_rr_theme->paddingx + 1);
+ x += ob_rr_theme->button_size + ob_rr_theme->paddingx + 1;
break;
case 'S':
if (!s) break;
self->shade_x = x;
XMapWindow(ob_display, self->shade);
- XMoveWindow(ob_display, self->shade, x, ob_rr_theme->padding + 1);
- x += ob_rr_theme->button_size + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->shade, x, ob_rr_theme->paddingx + 1);
+ x += ob_rr_theme->button_size + ob_rr_theme->paddingx + 1;
break;
case 'I':
if (!i) break;
self->iconify_x = x;
XMapWindow(ob_display, self->iconify);
- XMoveWindow(ob_display,self->iconify, x, ob_rr_theme->padding + 1);
- x += ob_rr_theme->button_size + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display,self->iconify, x, ob_rr_theme->paddingx + 1);
+ x += ob_rr_theme->button_size + ob_rr_theme->paddingx + 1;
break;
case 'L':
if (!l) break;
self->label_x = x;
XMapWindow(ob_display, self->label);
- XMoveWindow(ob_display, self->label, x, ob_rr_theme->padding);
- x += self->label_width + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->label, x, ob_rr_theme->paddingx);
+ x += self->label_width + ob_rr_theme->paddingx + 1;
break;
case 'M':
if (!m) break;
self->max_x = x;
XMapWindow(ob_display, self->max);
- XMoveWindow(ob_display, self->max, x, ob_rr_theme->padding + 1);
- x += ob_rr_theme->button_size + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->max, x, ob_rr_theme->paddingx + 1);
+ x += ob_rr_theme->button_size + ob_rr_theme->paddingx + 1;
break;
case 'C':
if (!c) break;
self->close_x = x;
XMapWindow(ob_display, self->close);
- XMoveWindow(ob_display, self->close, x, ob_rr_theme->padding + 1);
- x += ob_rr_theme->button_size + ob_rr_theme->padding + 1;
+ XMoveWindow(ob_display, self->close, x, ob_rr_theme->paddingx + 1);
+ x += ob_rr_theme->button_size + ob_rr_theme->paddingx + 1;
break;
}
}
diff --git a/openbox/framerender.c b/openbox/framerender.c
index 464e1c6b..2195ff74 100644
--- a/openbox/framerender.c
+++ b/openbox/framerender.c
@@ -147,43 +147,42 @@ void framerender_frame(ObFrame *self)
ob_rr_theme->a_clear->surface.parenty = 0;
RrPaint(ob_rr_theme->a_clear, self->tlresize,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
+ ob_rr_theme->grip_width, ob_rr_theme->top_grip_height);
ob_rr_theme->a_clear->surface.parentx =
self->width - ob_rr_theme->grip_width;
RrPaint(ob_rr_theme->a_clear, self->trresize,
- ob_rr_theme->grip_width, ob_rr_theme->handle_height);
-
+ ob_rr_theme->grip_width, ob_rr_theme->top_grip_height);
/* set parents for any parent relative guys */
l->surface.parent = t;
l->surface.parentx = self->label_x;
- l->surface.parenty = ob_rr_theme->padding;
+ l->surface.parenty = ob_rr_theme->paddingy;
m->surface.parent = t;
m->surface.parentx = self->max_x;
- m->surface.parenty = ob_rr_theme->padding + 1;
+ m->surface.parenty = ob_rr_theme->paddingy + 1;
n->surface.parent = t;
n->surface.parentx = self->icon_x;
- n->surface.parenty = ob_rr_theme->padding;
+ n->surface.parenty = ob_rr_theme->paddingy;
i->surface.parent = t;
i->surface.parentx = self->iconify_x;
- i->surface.parenty = ob_rr_theme->padding + 1;
+ i->surface.parenty = ob_rr_theme->paddingy + 1;
d->surface.parent = t;
d->surface.parentx = self->desk_x;
- d->surface.parenty = ob_rr_theme->padding + 1;
+ d->surface.parenty = ob_rr_theme->paddingy + 1;
s->surface.parent = t;
s->surface.parentx = self->shade_x;
- s->surface.parenty = ob_rr_theme->padding + 1;
+ s->surface.parenty = ob_rr_theme->paddingy + 1;
c->surface.parent = t;
c->surface.parentx = self->close_x;
- c->surface.parenty = ob_rr_theme->padding + 1;
+ c->surface.parenty = ob_rr_theme->paddingy + 1;
framerender_label(self, l);
framerender_max(self, m);
@@ -194,7 +193,9 @@ void framerender_frame(ObFrame *self)
framerender_close(self, c);
}
- if (self->decorations & OB_FRAME_DECOR_HANDLE) {
+ if (self->decorations & OB_FRAME_DECOR_HANDLE &&
+ ob_rr_theme->handle_height > 0)
+ {
RrAppearance *h, *g;
h = (self->focused ?
diff --git a/openbox/menu.c b/openbox/menu.c
index 243fc55b..868293c6 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -313,7 +313,7 @@ void menu_show(gchar *name, gint x, gint y, ObClient *client)
menu_frame_move(frame, x, y);
} else
menu_frame_move(frame,
- x - ob_rr_theme->bwidth, y - ob_rr_theme->bwidth);
+ x - ob_rr_theme->mbwidth, y - ob_rr_theme->mbwidth);
for (i = 0; i < screen_num_monitors; ++i) {
Rect *a = screen_physical_area_monitor(i);
if (RECT_CONTAINS(*a, x, y)) {
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index e9fc32da..743f4204 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -412,25 +412,25 @@ static void menu_frame_render(ObMenuFrame *self)
gboolean has_icon = FALSE;
ObMenu *sub;
- XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->bwidth);
+ XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth);
XSetWindowBorder(ob_display, self->window,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->menu_b_color));
if (!self->parent && self->show_title) {
XMoveWindow(ob_display, self->title,
- -ob_rr_theme->bwidth, h - ob_rr_theme->bwidth);
+ -ob_rr_theme->mbwidth, h - ob_rr_theme->mbwidth);
self->a_title->texture[0].data.text.string = self->menu->title;
RrMinsize(self->a_title, &tw, &th);
- tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->padding * 2;
+ tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->paddingx * 2;
w = MAX(w, tw);
th = ob_rr_theme->menu_title_height;
- h += (self->title_h = th + ob_rr_theme->bwidth);
+ h += (self->title_h = th + ob_rr_theme->mbwidth);
- XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth);
+ XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->mbwidth);
XSetWindowBorder(ob_display, self->title,
- RrColorPixel(ob_rr_theme->b_color));
+ RrColorPixel(ob_rr_theme->menu_b_color));
}
XMoveWindow(ob_display, self->items, 0, h);
@@ -538,9 +538,9 @@ static void menu_frame_render(ObMenuFrame *self)
if (!self->parent && self->show_title) {
XResizeWindow(ob_display, self->title,
- w, self->title_h - ob_rr_theme->bwidth);
+ w, self->title_h - ob_rr_theme->mbwidth);
RrPaint(self->a_title, self->title,
- w, self->title_h - ob_rr_theme->bwidth);
+ w, self->title_h - ob_rr_theme->mbwidth);
XMapWindow(ob_display, self->title);
} else
XUnmapWindow(ob_display, self->title);
@@ -550,8 +550,8 @@ static void menu_frame_render(ObMenuFrame *self)
for (it = self->entries; it; it = g_list_next(it))
menu_entry_frame_render(it->data);
- w += ob_rr_theme->bwidth * 2;
- h += ob_rr_theme->bwidth * 2;
+ w += ob_rr_theme->mbwidth * 2;
+ h += ob_rr_theme->mbwidth * 2;
RECT_SET_SIZE(self->area, w, h);
@@ -721,8 +721,8 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y)
GList *it;
if ((frame = menu_frame_under(x, y))) {
- x -= ob_rr_theme->bwidth + frame->area.x;
- y -= frame->title_h + ob_rr_theme->bwidth + frame->area.y;
+ x -= ob_rr_theme->mbwidth + frame->area.x;
+ y -= frame->title_h + ob_rr_theme->mbwidth + frame->area.y;
for (it = frame->entries; it; it = g_list_next(it)) {
ObMenuEntryFrame *e = it->data;
@@ -795,7 +795,7 @@ void menu_entry_frame_show_submenu(ObMenuEntryFrame *self)
self->frame->area.x
+ self->frame->area.width
- ob_rr_theme->menu_overlap
- - ob_rr_theme->bwidth,
+ - ob_rr_theme->mbwidth,
self->frame->area.y
+ self->frame->title_h
+ self->area.y
diff --git a/openbox/popup.c b/openbox/popup.c
index 4a0ae890..6b118792 100644
--- a/openbox/popup.c
+++ b/openbox/popup.c
@@ -36,8 +36,8 @@ ObPopup *popup_new(gboolean hasicon)
self->hasicon = hasicon;
self->gravity = NorthWestGravity;
self->x = self->y = self->w = self->h = 0;
- self->a_bg = RrAppearanceCopy(ob_rr_theme->app_hilite_bg);
- self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
+ self->a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
+ self->a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);
attrib.override_redirect = True;
self->bg = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen),
@@ -88,11 +88,11 @@ void popup_size_to_string(ObPopup *self, gchar *text)
self->a_text->texture[0].data.text.string = text;
RrMinsize(self->a_text, &textw, &texth);
/*XXX textw += ob_rr_theme->bevel * 2;*/
- texth += ob_rr_theme->padding * 2;
+ texth += ob_rr_theme->paddingy * 2;
- self->h = texth + ob_rr_theme->padding * 2;
+ self->h = texth + ob_rr_theme->paddingy * 2;
iconw = (self->hasicon ? texth : 0);
- self->w = textw + iconw + ob_rr_theme->padding * (self->hasicon ? 3 : 2);
+ self->w = textw + iconw + ob_rr_theme->paddingx * (self->hasicon ? 3 : 2);
}
void popup_set_text_align(ObPopup *self, RrJustify align)
@@ -115,8 +115,8 @@ void popup_show(ObPopup *self, gchar *text)
RrMargins(self->a_bg, &l, &t, &r, &b);
- XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth);
- XSetWindowBorder(ob_display, self->bg, ob_rr_theme->b_color->pixel);
+ XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->fbwidth);
+ XSetWindowBorder(ob_display, self->bg, ob_rr_theme->frame_b_color->pixel);
/* set up the textures */
self->a_text->texture[0].data.text.string = text;
@@ -124,22 +124,22 @@ void popup_show(ObPopup *self, gchar *text)
/* measure the shit out */
RrMinsize(self->a_text, &textw, &texth);
/*XXX textw += ob_rr_theme->padding * 2;*/
- texth += ob_rr_theme->padding * 2;
+ texth += ob_rr_theme->paddingy * 2;
/* set the sizes up and reget the text sizes from the calculated
outer sizes */
if (self->h) {
h = self->h;
- texth = h - (t+b + ob_rr_theme->padding * 2);
+ texth = h - (t+b + ob_rr_theme->paddingy * 2);
} else
- h = t+b + texth + ob_rr_theme->padding * 2;
+ h = t+b + texth + ob_rr_theme->paddingy * 2;
iconw = (self->hasicon ? texth : 0);
if (self->w) {
w = self->w;
- textw = w - (l+r + iconw + ob_rr_theme->padding *
+ textw = w - (l+r + iconw + ob_rr_theme->paddingx *
(self->hasicon ? 3 : 2));
} else
- w = l+r + textw + iconw + ob_rr_theme->padding *
+ w = l+r + textw + iconw + ob_rr_theme->paddingx *
(self->hasicon ? 3 : 2);
/* sanity checks to avoid crashes! */
if (w < 1) w = 1;
@@ -185,12 +185,12 @@ void popup_show(ObPopup *self, gchar *text)
self->a_text->surface.parent = self->a_bg;
self->a_text->surface.parentx = l + iconw +
- ob_rr_theme->padding * (self->hasicon ? 2 : 1);
- self->a_text->surface.parenty = t + ob_rr_theme->padding;
+ ob_rr_theme->paddingx * (self->hasicon ? 2 : 1);
+ self->a_text->surface.parenty = t + ob_rr_theme->paddingy;
XMoveResizeWindow(ob_display, self->text,
- l + iconw + ob_rr_theme->padding *
+ l + iconw + ob_rr_theme->paddingx *
(self->hasicon ? 2 : 1),
- t + ob_rr_theme->padding, textw, texth);
+ t + ob_rr_theme->paddingy, textw, texth);
RrPaint(self->a_bg, self->bg, w, h);
RrPaint(self->a_text, self->text, textw, texth);
@@ -198,7 +198,8 @@ void popup_show(ObPopup *self, gchar *text)
if (self->hasicon) {
if (iconw < 1) iconw = 1; /* sanity check for crashes */
if (self->draw_icon)
- self->draw_icon(l + ob_rr_theme->padding, t + ob_rr_theme->padding,
+ self->draw_icon(l + ob_rr_theme->paddingx,
+ t + ob_rr_theme->paddingy,
iconw, texth, self->draw_icon_data);
}
@@ -282,20 +283,20 @@ static void pager_popup_draw_icon(gint px, gint py, gint w, gint h,
guint r, c;
gint eachw, eachh;
- eachw = (w - ob_rr_theme->bwidth -
- (screen_desktop_layout.columns * ob_rr_theme->bwidth))
+ eachw = (w - ob_rr_theme->fbwidth -
+ (screen_desktop_layout.columns * ob_rr_theme->fbwidth))
/ screen_desktop_layout.columns;
- eachh = (h - ob_rr_theme->bwidth -
- (screen_desktop_layout.rows * ob_rr_theme->bwidth))
+ eachh = (h - ob_rr_theme->fbwidth -
+ (screen_desktop_layout.rows * ob_rr_theme->fbwidth))
/ screen_desktop_layout.rows;
/* make them squares */
eachw = eachh = MIN(eachw, eachh);
/* center */
- px += (w - (screen_desktop_layout.columns * (eachw + ob_rr_theme->bwidth) +
- ob_rr_theme->bwidth)) / 2;
- py += (h - (screen_desktop_layout.rows * (eachh + ob_rr_theme->bwidth) +
- ob_rr_theme->bwidth)) / 2;
+ px += (w - (screen_desktop_layout.columns * (eachw + ob_rr_theme->fbwidth) +
+ ob_rr_theme->fbwidth)) / 2;
+ py += (h - (screen_desktop_layout.rows * (eachh + ob_rr_theme->fbwidth) +
+ ob_rr_theme->fbwidth)) / 2;
if (eachw <= 0 || eachh <= 0)
return;
@@ -361,10 +362,10 @@ static void pager_popup_draw_icon(gint px, gint py, gint w, gint h,
rown = n;
for (r = 0, y = 0; r < screen_desktop_layout.rows;
- ++r, y += eachh + ob_rr_theme->bwidth)
+ ++r, y += eachh + ob_rr_theme->fbwidth)
{
for (c = 0, x = 0; c < screen_desktop_layout.columns;
- ++c, x += eachw + ob_rr_theme->bwidth)
+ ++c, x += eachw + ob_rr_theme->fbwidth)
{
RrAppearance *a;
@@ -393,8 +394,8 @@ ObPagerPopup *pager_popup_new()
self->desks = 0;
self->wins = g_new(Window, self->desks);
- self->hilight = RrAppearanceCopy(ob_rr_theme->app_hilite_fg);
- self->unhilight = RrAppearanceCopy(ob_rr_theme->app_unhilite_fg);
+ self->hilight = RrAppearanceCopy(ob_rr_theme->osd_hilite_fg);
+ self->unhilight = RrAppearanceCopy(ob_rr_theme->osd_unhilite_fg);
self->popup->draw_icon = pager_popup_draw_icon;
self->popup->draw_icon_data = self;
@@ -432,9 +433,9 @@ void pager_popup_show(ObPagerPopup *self, gchar *text, guint desk)
for (i = self->desks; i < screen_num_desktops; ++i) {
XSetWindowAttributes attr;
- attr.border_pixel = RrColorPixel(ob_rr_theme->b_color);
+ attr.border_pixel = RrColorPixel(ob_rr_theme->frame_b_color);
self->wins[i] = XCreateWindow(ob_display, self->popup->bg,
- 0, 0, 1, 1, ob_rr_theme->bwidth,
+ 0, 0, 1, 1, ob_rr_theme->fbwidth,
RrDepth(ob_rr_inst), InputOutput,
RrVisual(ob_rr_inst), CWBorderPixel,
&attr);
diff --git a/parser/parse.c b/parser/parse.c
index 6df24725..9db02fb0 100644
--- a/parser/parse.c
+++ b/parser/parse.c
@@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
parse.c for the Openbox window manager
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
static gboolean xdg_start;
static gchar *xdg_config_home_path;
@@ -67,7 +68,7 @@ void parse_register(ObParseInst *i, const gchar *tag,
struct Callback *c;
if ((c = g_hash_table_lookup(i->callbacks, tag))) {
- g_warning("tag '%s' already registered", tag);
+ g_warning("Tag '%s' already registered", tag);
return;
}
@@ -90,7 +91,35 @@ gboolean parse_load_rc(xmlDocPtr *doc, xmlNodePtr *root)
g_free(path);
}
if (!r)
- g_warning("unable to find a valid config file, using defaults");
+ g_warning("Unable to find a valid config file, using defaults");
+ return r;
+}
+
+gboolean parse_load_theme(const gchar *name, xmlDocPtr *doc, xmlNodePtr *root,
+ gchar **retpath)
+{
+ GSList *it;
+ gchar *path;
+ gboolean r = FALSE;
+
+ /* backward compatibility.. */
+ path = g_build_filename(g_get_home_dir(), ".themes", name,
+ "openbox-3", "themerc.xml", NULL);
+ if ((r = parse_load(path, "openbox_theme", doc, root)))
+ *retpath = g_path_get_dirname(path);
+ g_free(path);
+
+ if (!r) {
+ for (it = xdg_data_dir_paths; !r && it; it = g_slist_next(it)) {
+ path = g_build_filename(it->data, "themes", name, "openbox-3",
+ "themerc.xml", NULL);
+ if ((r = parse_load(path, "openbox_theme", doc, root)))
+ *retpath = g_path_get_dirname(path);
+ g_free(path);
+ }
+ }
+ if (!r)
+ g_warning("Unable to load the theme %s", name);
return r;
}
@@ -110,14 +139,20 @@ gboolean parse_load_menu(const gchar *file, xmlDocPtr *doc, xmlNodePtr *root)
}
}
if (!r)
- g_warning("unable to find a valid menu file '%s'", file);
+ g_warning("Unable to find a valid menu file '%s'", file);
return r;
}
gboolean parse_load(const gchar *path, const gchar *rootname,
xmlDocPtr *doc, xmlNodePtr *root)
{
- if ((*doc = xmlParseFile(path))) {
+ struct stat s;
+ if (stat(path, &s) < 0)
+ return FALSE;
+
+ /* XML_PARSE_BLANKS is needed apparently. When it loads a theme file,
+ without this option, the tree is weird and has extra nodes in it. */
+ if ((*doc = xmlReadFile(path, NULL, XML_PARSE_NOBLANKS))) {
*root = xmlDocGetRootElement(*doc);
if (!*root) {
xmlFreeDoc(*doc);
@@ -127,7 +162,7 @@ gboolean parse_load(const gchar *path, const gchar *rootname,
if (xmlStrcasecmp((*root)->name, (const xmlChar*)rootname)) {
xmlFreeDoc(*doc);
*doc = NULL;
- g_warning("document %s is of wrong type. root node is "
+ g_warning("Document %s is of wrong type. root node is "
"not '%s'", path, rootname);
}
}
@@ -150,7 +185,7 @@ gboolean parse_load_mem(gpointer data, guint len, const gchar *rootname,
if (xmlStrcasecmp((*root)->name, (const xmlChar*)rootname)) {
xmlFreeDoc(*doc);
*doc = NULL;
- g_warning("document in given memory is of wrong type. root "
+ g_warning("Document in given memory is of wrong type. root "
"node is not '%s'", rootname);
}
}
@@ -395,6 +430,10 @@ void parse_paths_shutdown()
g_free(it->data);
g_slist_free(xdg_data_dir_paths);
xdg_data_dir_paths = NULL;
+ g_free(xdg_config_home_path);
+ xdg_config_home_path = NULL;
+ g_free(xdg_data_home_path);
+ xdg_data_home_path = NULL;
}
gchar *parse_expand_tilde(const gchar *f)
diff --git a/parser/parse.h b/parser/parse.h
index ac3acba2..d2a6606b 100644
--- a/parser/parse.h
+++ b/parser/parse.h
@@ -38,6 +38,9 @@ void parse_shutdown(ObParseInst *inst);
gboolean parse_load_rc(xmlDocPtr *doc, xmlNodePtr *root);
/* Loads an Openbox menu, from the normal paths */
gboolean parse_load_menu(const gchar *file, xmlDocPtr *doc, xmlNodePtr *root);
+/* Loads an Openbox menu, from the normal paths */
+gboolean parse_load_theme(const gchar *name, xmlDocPtr *doc, xmlNodePtr *root,
+ gchar **path);
void parse_register(ObParseInst *inst, const gchar *tag,
ParseCallback func, gpointer data);
diff --git a/render/font.c b/render/font.c
index 3c64cce9..c3353b67 100644
--- a/render/font.c
+++ b/render/font.c
@@ -121,29 +121,29 @@ void RrFontClose(RrFont *f)
}
static void font_measure_full(const RrFont *f, const gchar *str,
- gint *x, gint *y, gint shadow_offset)
+ gint *x, gint *y, gint shadow_x, gint shadow_y)
{
PangoRectangle rect;
pango_layout_set_text(f->layout, str, -1);
pango_layout_set_width(f->layout, -1);
pango_layout_get_pixel_extents(f->layout, NULL, &rect);
- *x = rect.width + ABS(shadow_offset);
- *y = rect.height + ABS(shadow_offset);
+ *x = rect.width + ABS(shadow_x);
+ *y = rect.height + ABS(shadow_y);
}
RrSize *RrFontMeasureString(const RrFont *f, const gchar *str,
- gint shadow_offset)
+ gint shadow_x, gint shadow_y)
{
RrSize *size;
size = g_new(RrSize, 1);
- font_measure_full(f, str, &size->width, &size->height, shadow_offset);
+ font_measure_full(f, str, &size->width, &size->height, shadow_x, shadow_y);
return size;
}
-gint RrFontHeight(const RrFont *f, gint shadow_offset)
+gint RrFontHeight(const RrFont *f, gint shadow_y)
{
- return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_offset);
+ return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_y);
}
static inline int font_calculate_baseline(RrFont *f, gint height)
@@ -207,27 +207,17 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
break;
}
- if (t->shadow_offset) {
- if (t->shadow_tint >= 0) {
- c.color.red = 0;
- c.color.green = 0;
- c.color.blue = 0;
- c.color.alpha = 0xffff * t->shadow_tint / 100;
- c.pixel = BlackPixel(RrDisplay(t->font->inst),
- RrScreen(t->font->inst));
- } else {
- c.color.red = 0xffff;
- c.color.green = 0xffff;
- c.color.blue = 0xffff;
- c.color.alpha = 0xffff * -t->shadow_tint / 100;
- c.pixel = WhitePixel(RrDisplay(t->font->inst),
- RrScreen(t->font->inst));
- }
+ if (t->shadow_offset_x || t->shadow_offset_y) {
+ c.color.red = t->shadow_color->r | t->shadow_color->r << 8;
+ c.color.green = t->shadow_color->g | t->shadow_color->g << 8;
+ c.color.blue = t->shadow_color->b | t->shadow_color->b << 8;
+ c.color.alpha = 0xffff * t->shadow_alpha / 255;
+ c.pixel = t->shadow_color->pixel;
/* see below... */
pango_xft_render_layout_line
(d, &c, pango_layout_get_line(t->font->layout, 0),
- (x + t->shadow_offset) * PANGO_SCALE,
- (y + t->shadow_offset) * PANGO_SCALE);
+ (x + t->shadow_offset_x) * PANGO_SCALE,
+ (y + t->shadow_offset_y) * PANGO_SCALE);
}
c.color.red = t->color->r | t->color->r << 8;
diff --git a/render/render.c b/render/render.c
index 962d3ec9..669761d5 100644
--- a/render/render.c
+++ b/render/render.c
@@ -349,10 +349,11 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h)
case RR_TEXTURE_TEXT:
m = RrFontMeasureString(a->texture[i].data.text.font,
a->texture[i].data.text.string,
- a->texture[i].data.text.shadow_offset);
+ a->texture[i].data.text.shadow_offset_x,
+ a->texture[i].data.text.shadow_offset_y);
*w = MAX(*w, m->width + 4);
m->height = RrFontHeight(a->texture[i].data.text.font,
- a->texture[i].data.text.shadow_offset);
+ a->texture[i].data.text.shadow_offset_y);
*h += MAX(*h, m->height);
g_free(m);
break;
diff --git a/render/render.h b/render/render.h
index 65d16f22..d03db8d5 100644
--- a/render/render.h
+++ b/render/render.h
@@ -2,7 +2,7 @@
render.h for the Openbox window manager
Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
Copyright (c) 2003 Derek Foreman
This program is free software; you can redistribute it and/or modify
@@ -121,8 +121,10 @@ struct _RrTextureText {
RrJustify justify;
RrColor *color;
gchar *string;
- gint shadow_offset;
- gchar shadow_tint;
+ gint shadow_offset_x;
+ gint shadow_offset_y;
+ RrColor *shadow_color;
+ gchar shadow_alpha;
};
struct _RrPixmapMask {
@@ -231,8 +233,8 @@ RrFont *RrFontOpen (const RrInstance *inst, gchar *name, gint size,
RrFont *RrFontOpenDefault (const RrInstance *inst);
void RrFontClose (RrFont *f);
RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
- gint shadow_offset);
-gint RrFontHeight (const RrFont *f, gint shadow_offset);
+ gint shadow_offset_x, gint shadow_offset_y);
+gint RrFontHeight (const RrFont *f, gint shadow_offset_y);
gint RrFontMaxCharWidth (const RrFont *f);
void RrPaint (RrAppearance *a, Window win, gint w, gint h);
diff --git a/render/theme.c b/render/theme.c
index c8762181..c31ca112 100644
--- a/render/theme.c
+++ b/render/theme.c
@@ -2,7 +2,7 @@
theme.c for the Openbox window manager
Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -26,44 +26,71 @@
#include "parser/parse.h"
#include
-#include
#include
#include
#include
-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,
- gchar *rname, RrColor **value);
-static gboolean read_mask(const RrInstance *inst,
- gchar *maskname, RrTheme *theme,
+typedef struct {
+ xmlDocPtr doc;
+ const RrInstance *inst;
+ gchar *path;
+} ParseState;
+
+static void parse_style(gchar *tex, RrSurfaceColorType *grad,
+ RrReliefType *relief, RrBevelType *bevel,
+ gboolean *interlaced, gboolean *border,
+ gboolean allow_trans);
+static gboolean read_mask(ParseState *ps, gchar *maskname,
RrPixmapMask **value);
-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);
+static xmlNodePtr find_node(xmlNodePtr n, gchar *names[]);
+static gboolean find_int(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gint *integer, gint lower, gint upper);
+static gboolean find_string(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gchar **string);
+static gboolean find_color(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrColor **color, gchar *alpha);
+ static gboolean find_point(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gint *x, gint *y,
+ gint lowx, gint lowy, gint upx, gint upy);
+static gboolean find_shadow(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrAppearance *a);
+static gboolean find_appearance(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrAppearance *a, gboolean allow_trans);
+
+/* make a null terminated array out of a list of strings */
+#define L(args...) (gchar*[]){args,NULL}
+/* shortcut to the various find_* functions */
+#define FIND(type, args...) find_##type(&ps, root, args)
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;
+ ParseState ps;
+ xmlNodePtr root;
RrJustify winjust, mtitlejust;
- gboolean b;
gchar *str;
RrTheme *theme;
- gint offset;
- gint tint;
+
+ if (name) {
+ if (!parse_load_theme(name, &ps.doc, &root, &ps.path)) {
+ g_warning("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))
+ return NULL;
+ }
+ ps.inst = inst;
theme = g_new0(RrTheme, 1);
-
theme->inst = inst;
- theme->show_handle = TRUE;
-
theme->a_disabled_focused_max = RrAppearanceNew(inst, 1);
theme->a_disabled_unfocused_max = RrAppearanceNew(inst, 1);
theme->a_hover_focused_max = RrAppearanceNew(inst, 1);
@@ -96,25 +123,8 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->a_clear = RrAppearanceNew(inst, 0);
theme->a_clear_tex = RrAppearanceNew(inst, 1);
- if (name) {
- db = loaddb(theme, name);
- if (db == NULL) {
- g_warning("Failed to load the theme '%s'\n"
- "Falling back to the default: '%s'",
- name, DEFAULT_THEME);
- } else
- theme->name = g_path_get_basename(name);
- }
- if (db == NULL) {
- db = loaddb(theme, DEFAULT_THEME);
- if (db == NULL) {
- g_warning("Failed to load the theme '%s'.", DEFAULT_THEME);
- return NULL;
- } else
- theme->name = g_path_get_basename(DEFAULT_THEME);
- }
-
/* load the font stuff */
+
if (active_window_font) {
theme->win_font_focused = active_window_font;
RrFontRef(active_window_font);
@@ -128,10 +138,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->win_font_unfocused = RrFontOpenDefault(inst);
winjust = RR_JUSTIFY_LEFT;
- if (read_string(db, "window.label.text.justify", &str)) {
- if (!g_ascii_strcasecmp(str, "right"))
+ if (FIND(string, L( "window", "justify"), &str)) {
+ if (strcmp(str, "right") == 0)
winjust = RR_JUSTIFY_RIGHT;
- else if (!g_ascii_strcasecmp(str, "center"))
+ else if (strcmp(str, "center") == 0)
winjust = RR_JUSTIFY_CENTER;
}
@@ -142,10 +152,10 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->menu_title_font = RrFontOpenDefault(inst);
mtitlejust = RR_JUSTIFY_LEFT;
- if (read_string(db, "menu.title.text.justify", &str)) {
- if (!g_ascii_strcasecmp(str, "right"))
+ if (FIND(string, L("menu", "justify"), &str)) {
+ if (strcmp(str, "right") == 0)
mtitlejust = RR_JUSTIFY_RIGHT;
- else if (!g_ascii_strcasecmp(str, "center"))
+ else if (strcmp(str, "center") == 0)
mtitlejust = RR_JUSTIFY_CENTER;
}
@@ -156,143 +166,195 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->menu_font = RrFontOpenDefault(inst);
/* load direct dimensions */
- if (!read_int(db, "menu.overlap", &theme->menu_overlap) ||
- theme->menu_overlap < 0 || theme->menu_overlap > 20)
+ if (!FIND(int, L("menu","overlap"),
+ &theme->menu_overlap, -100, 100))
theme->menu_overlap = 0;
- if (!read_int(db, "window.handle.width", &theme->handle_height))
+
+ if (!FIND(int, L("dimensions","handle"), &theme->handle_height, 0, 100))
theme->handle_height = 6;
- if (!theme->handle_height)
- theme->show_handle = FALSE;
- if (theme->handle_height <= 0 || theme->handle_height > 100)
- theme->handle_height = 6;
- if (!read_int(db, "padding.width", &theme->padding) ||
- theme->padding < 0 || theme->padding > 100)
- theme->padding = 3;
- if (!read_int(db, "border.width", &theme->bwidth) ||
- theme->bwidth < 0 || theme->bwidth > 100)
- theme->bwidth = 1;
- if (!read_int(db, "window.client.padding.width", &theme->cbwidth) ||
- theme->cbwidth < 0 || theme->cbwidth > 100)
- theme->cbwidth = theme->padding;
+
+ if (!FIND(point, L("dimensions","padding"),
+ &theme->paddingx, &theme->paddingy, 0, 100, 0, 100))
+ theme->paddingx = theme->paddingy = 3;
+
+ if (!FIND(int, L("window","border","width"),
+ &theme->fbwidth, 0, 100))
+ theme->fbwidth = 1;
+
+ /* menu border width inherits from frame border width */
+ if (!FIND(int, L("menu","border","width"),
+ &theme->mbwidth, 0, 100))
+ theme->mbwidth = theme->fbwidth;
+
+ if (!FIND(point, L("window","clientpadding"), &theme->cbwidthx,
+ &theme->cbwidthy, 0, 100, 0, 100))
+ theme->cbwidthx = theme->cbwidthy = 1;
/* load colors */
- if (!read_color(db, inst,
- "border.color", &theme->b_color))
- theme->b_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "window.active.client.color",
- &theme->cb_focused_color))
- theme->cb_focused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.inactive.client.color",
- &theme->cb_unfocused_color))
- theme->cb_unfocused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.active.label.text.color",
- &theme->title_focused_color))
+ if (!FIND(color, L("window","border","primary"),
+ &theme->frame_b_color, NULL))
+ theme->frame_b_color = RrColorNew(inst, 0, 0, 0);
+
+ /* menu border color inherits from frame border color */
+ if (!FIND(color, L("menu","border","primary"),
+ &theme->menu_b_color, NULL))
+ theme->menu_b_color = RrColorNew(inst,
+ theme->frame_b_color->r,
+ theme->frame_b_color->g,
+ theme->frame_b_color->b);
+ if (!FIND(color, L("window","active","clientpadding"),
+ &theme->cb_focused_color, NULL))
+ theme->cb_focused_color = RrColorNew(inst, 255, 255, 255);
+ if (!FIND(color, L("window","inactive","clientpadding"),
+ &theme->cb_unfocused_color, NULL))
+ theme->cb_unfocused_color = RrColorNew(inst, 255, 255, 255);
+ if (!FIND(color, L("window","active","label","text","primary"),
+ &theme->title_focused_color, NULL))
theme->title_focused_color = RrColorNew(inst, 0x0, 0x0, 0x0);
- if (!read_color(db, inst,
- "window.inactive.label.text.color",
- &theme->title_unfocused_color))
+ if (!FIND(color, L("osd","text","primary"),
+ &theme->osd_color, NULL))
+ theme->osd_color = RrColorNew(inst,
+ theme->title_focused_color->r,
+ theme->title_focused_color->g,
+ theme->title_focused_color->b);
+ if (!FIND(color, L("window","inactive","label","text","primary"),
+ &theme->title_unfocused_color, NULL))
theme->title_unfocused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.active.button.unpressed.image.color",
- &theme->titlebut_focused_unpressed_color))
+ if (!FIND(color, L("window","active","buttons","unpressed","image"),
+ &theme->titlebut_focused_unpressed_color, NULL))
theme->titlebut_focused_unpressed_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "window.inactive.button.unpressed.image.color",
- &theme->titlebut_unfocused_unpressed_color))
+ if (!FIND(color, L("window","inactive","buttons", "unpressed","image"),
+ &theme->titlebut_unfocused_unpressed_color, NULL))
theme->titlebut_unfocused_unpressed_color =
RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.active.button.pressed.image.color",
- &theme->titlebut_focused_pressed_color))
+ if (!FIND(color, L("window","active","buttons","pressed","image"),
+ &theme->titlebut_focused_pressed_color, NULL))
theme->titlebut_focused_pressed_color =
RrColorNew(inst,
theme->titlebut_focused_unpressed_color->r,
theme->titlebut_focused_unpressed_color->g,
theme->titlebut_focused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.pressed.image.color",
- &theme->titlebut_unfocused_pressed_color))
+ if (!FIND(color, L("window","inactive","buttons","pressed","image"),
+ &theme->titlebut_unfocused_pressed_color, NULL))
theme->titlebut_unfocused_pressed_color =
RrColorNew(inst,
theme->titlebut_unfocused_unpressed_color->r,
theme->titlebut_unfocused_unpressed_color->g,
theme->titlebut_unfocused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.disabled.image.color",
- &theme->titlebut_disabled_focused_color))
+ if (!FIND(color, L("window","active","buttons","disabled","image"),
+ &theme->titlebut_disabled_focused_color, NULL))
theme->titlebut_disabled_focused_color =
RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.inactive.button.disabled.image.color",
- &theme->titlebut_disabled_unfocused_color))
+ if (!FIND(color, L("window","inactive","buttons","disabled","image"),
+ &theme->titlebut_disabled_unfocused_color, NULL))
theme->titlebut_disabled_unfocused_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "window.active.button.hover.image.color",
- &theme->titlebut_hover_focused_color))
+ if (!FIND(color,
+ L("window","active","buttons","hover","image"),
+ &theme->titlebut_hover_focused_color, NULL))
theme->titlebut_hover_focused_color =
RrColorNew(inst,
theme->titlebut_focused_unpressed_color->r,
theme->titlebut_focused_unpressed_color->g,
theme->titlebut_focused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.hover.image.color",
- &theme->titlebut_hover_unfocused_color))
+ if (!FIND(color, L("window","inactive","buttons","hover","image"),
+ &theme->titlebut_hover_unfocused_color, NULL))
theme->titlebut_hover_unfocused_color =
RrColorNew(inst,
theme->titlebut_unfocused_unpressed_color->r,
theme->titlebut_unfocused_unpressed_color->g,
theme->titlebut_unfocused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.toggled.image.color",
- &theme->titlebut_toggled_focused_color))
+ if (!FIND(color, L("window","active","buttons","toggled","image"),
+ &theme->titlebut_toggled_focused_color, NULL))
theme->titlebut_toggled_focused_color =
RrColorNew(inst,
theme->titlebut_focused_pressed_color->r,
theme->titlebut_focused_pressed_color->g,
theme->titlebut_focused_pressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.toggled.image.color",
- &theme->titlebut_toggled_unfocused_color))
+ if (!FIND(color, L("window","inactive","buttons","toggled","image"),
+ &theme->titlebut_toggled_unfocused_color, NULL))
theme->titlebut_toggled_unfocused_color =
RrColorNew(inst,
theme->titlebut_unfocused_pressed_color->r,
theme->titlebut_unfocused_pressed_color->g,
theme->titlebut_unfocused_pressed_color->b);
- if (!read_color(db, inst,
- "menu.title.text.color", &theme->menu_title_color))
+ if (!FIND(color, L("menu","title","text","primary"),
+ &theme->menu_title_color, NULL))
theme->menu_title_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "menu.items.text.color", &theme->menu_color))
+ if (!FIND(color, L("menu","inactive","primary"), &theme->menu_color, NULL))
theme->menu_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "menu.items.disabled.text.color",
- &theme->menu_disabled_color))
+ if (!FIND(color, L("menu","disabled","primary"),
+ &theme->menu_disabled_color, NULL))
theme->menu_disabled_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "menu.items.active.text.color",
- &theme->menu_selected_color))
+ if (!FIND(color, L("menu","active","text","primary"),
+ &theme->menu_selected_color, NULL))
theme->menu_selected_color = RrColorNew(inst, 0, 0, 0);
+ if (!FIND(color, L("window","active","label","text","shadow","primary"),
+ &theme->title_focused_shadow_color,
+ &theme->title_focused_shadow_alpha))
+ {
+ theme->title_focused_shadow_color = RrColorNew(inst, 0, 0, 0);
+ theme->title_focused_shadow_alpha = 50;
+ }
+ if (!FIND(color, L("osd","text","shadow","primary"),
+ &theme->osd_shadow_color, &theme->osd_shadow_alpha))
+ {
+ theme->osd_shadow_color =
+ RrColorNew(inst, theme->title_focused_shadow_color->r,
+ theme->title_focused_shadow_color->g,
+ theme->title_focused_shadow_color->b);
+ theme->osd_shadow_alpha = theme->title_focused_shadow_alpha;
+ }
+ if (!FIND(color, L("window","inactive","label","text","shadow","primary"),
+ &theme->title_unfocused_shadow_color,
+ &theme->title_unfocused_shadow_alpha))
+ {
+ theme->title_unfocused_shadow_color = RrColorNew(inst, 0, 0, 0);
+ theme->title_unfocused_shadow_alpha = 50;
+ }
+ if (!FIND(color, L("menu","title","text","shadow","primary"),
+ &theme->menu_title_shadow_color,
+ &theme->menu_title_shadow_alpha))
+ {
+ theme->menu_title_shadow_color = RrColorNew(inst, 0, 0, 0);
+ theme->menu_title_shadow_alpha = 50;
+ }
+ if (!FIND(color, L("menu","inactive","shadow","primary"),
+ &theme->menu_text_normal_shadow_color,
+ &theme->menu_text_normal_shadow_alpha))
+ {
+ theme->menu_text_normal_shadow_color = RrColorNew(inst, 0, 0, 0);
+ theme->menu_text_normal_shadow_alpha = 50;
+ }
+ if (!FIND(color, L("menu","active","text","shadow","primary"),
+ &theme->menu_text_selected_shadow_color,
+ &theme->menu_text_selected_shadow_alpha))
+ {
+ theme->menu_text_selected_shadow_color = RrColorNew(inst, 0, 0, 0);
+ theme->menu_text_selected_shadow_alpha = 50;
+ }
+ if (!FIND(color, L("menu","disabled","shadow","primary"),
+ &theme->menu_text_disabled_shadow_color,
+ &theme->menu_text_disabled_shadow_alpha))
+ {
+ theme->menu_text_disabled_shadow_color =
+ RrColorNew(inst, theme->menu_text_normal_shadow_color->r,
+ theme->menu_text_normal_shadow_color->g,
+ theme->menu_text_normal_shadow_color->b);
+ theme->menu_text_disabled_shadow_alpha =
+ theme->menu_text_normal_shadow_alpha;
+ }
- if (read_mask(inst, "max.xbm", theme, &theme->max_mask)) {
- if (!read_mask(inst, "max_pressed.xbm", theme,
- &theme->max_pressed_mask)) {
+ /* 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(inst, "max_toggled.xbm", theme,
- &theme->max_toggled_mask)) {
+ if (!read_mask(&ps, "max_toggled.xbm", &theme->max_toggled_mask))
theme->max_toggled_mask =
RrPixmapMaskCopy(theme->max_pressed_mask);
- }
- if (!read_mask(inst, "max_disabled.xbm", theme,
- &theme->max_disabled_mask)) {
+ if (!read_mask(&ps, "max_disabled.xbm", &theme->max_disabled_mask))
theme->max_disabled_mask = RrPixmapMaskCopy(theme->max_mask);
- }
- if (!read_mask(inst, "max_hover.xbm", theme, &theme->max_hover_mask)) {
+ if (!read_mask(&ps, "max_hover.xbm", &theme->max_hover_mask))
theme->max_hover_mask = RrPixmapMaskCopy(theme->max_mask);
- }
} else {
{
guchar data[] = { 0x7f, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f };
@@ -307,21 +369,17 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->max_hover_mask = RrPixmapMaskCopy(theme->max_mask);
}
- if (read_mask(inst, "iconify.xbm", theme, &theme->iconify_mask)) {
- if (!read_mask(inst, "iconify_pressed.xbm", theme,
- &theme->iconify_pressed_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(inst, "iconify_disabled.xbm", theme,
- &theme->iconify_disabled_mask)) {
+ if (!read_mask(&ps, "iconify_disabled.xbm",
+ &theme->iconify_disabled_mask))
theme->iconify_disabled_mask =
RrPixmapMaskCopy(theme->iconify_mask);
- }
- if (!read_mask(inst, "iconify_hover.xbm", theme,
- &theme->iconify_hover_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, 0x7f, 0x7f, 0x7f };
@@ -336,24 +394,16 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
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)) {
+ 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(inst, "desk_toggled.xbm", theme,
- &theme->desk_toggled_mask)) {
+ if (!read_mask(&ps, "desk_toggled.xbm", &theme->desk_toggled_mask))
theme->desk_toggled_mask =
RrPixmapMaskCopy(theme->desk_pressed_mask);
- }
- if (!read_mask(inst, "desk_disabled.xbm", theme,
- &theme->desk_disabled_mask)) {
+ if (!read_mask(&ps, "desk_disabled.xbm", &theme->desk_disabled_mask))
theme->desk_disabled_mask = RrPixmapMaskCopy(theme->desk_mask);
- }
- if (!read_mask(inst, "desk_hover.xbm", theme,
- &theme->desk_hover_mask)) {
+ if (!read_mask(&ps, "desk_hover.xbm", &theme->desk_hover_mask))
theme->desk_hover_mask = RrPixmapMaskCopy(theme->desk_mask);
- }
} else {
{
guchar data[] = { 0x63, 0x63, 0x00, 0x00, 0x00, 0x63, 0x63 };
@@ -369,24 +419,16 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->desk_hover_mask = RrPixmapMaskCopy(theme->desk_mask);
}
- if (read_mask(inst, "shade.xbm", theme, &theme->shade_mask)) {
- if (!read_mask(inst, "shade_pressed.xbm", theme,
- &theme->shade_pressed_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(inst, "shade_toggled.xbm", theme,
- &theme->shade_toggled_mask)) {
+ if (!read_mask(&ps, "shade_toggled.xbm", &theme->shade_toggled_mask))
theme->shade_toggled_mask =
RrPixmapMaskCopy(theme->shade_pressed_mask);
- }
- if (!read_mask(inst, "shade_disabled.xbm", theme,
- &theme->shade_disabled_mask)) {
+ if (!read_mask(&ps, "shade_disabled.xbm", &theme->shade_disabled_mask))
theme->shade_disabled_mask = RrPixmapMaskCopy(theme->shade_mask);
- }
- if (!read_mask(inst, "shade_hover.xbm", theme,
- &theme->shade_hover_mask)) {
+ if (!read_mask(&ps, "shade_hover.xbm", &theme->shade_hover_mask))
theme->shade_hover_mask = RrPixmapMaskCopy(theme->shade_mask);
- }
} else {
{
guchar data[] = { 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00 };
@@ -402,19 +444,13 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->shade_hover_mask = RrPixmapMaskCopy(theme->shade_mask);
}
- if (read_mask(inst, "close.xbm", theme, &theme->close_mask)) {
- if (!read_mask(inst, "close_pressed.xbm", theme,
- &theme->close_pressed_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(inst, "close_disabled.xbm", theme,
- &theme->close_disabled_mask)) {
+ if (!read_mask(&ps, "close_disabled.xbm", &theme->close_disabled_mask))
theme->close_disabled_mask = RrPixmapMaskCopy(theme->close_mask);
- }
- if (!read_mask(inst, "close_hover.xbm", theme,
- &theme->close_hover_mask)) {
+ if (!read_mask(&ps, "close_hover.xbm", &theme->close_hover_mask))
theme->close_hover_mask = RrPixmapMaskCopy(theme->close_mask);
- }
} else {
{
guchar data[] = { 0x63, 0x77, 0x3e, 0x1c, 0x3e, 0x77, 0x63 };
@@ -425,140 +461,104 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->close_hover_mask = RrPixmapMaskCopy(theme->close_mask);
}
- if (!read_mask(inst, "bullet.xbm", theme, &theme->menu_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);
}
/* read the decoration textures */
- if (!read_appearance(db, inst,
- "window.active.title.bg", theme->a_focused_title,
- FALSE))
+ if (!FIND(appearance, L("window","active","titlebar"),
+ theme->a_focused_title, FALSE))
set_default_appearance(theme->a_focused_title);
- if (!read_appearance(db, inst,
- "window.inactive.title.bg", theme->a_unfocused_title,
- FALSE))
+ if (!FIND(appearance, L("window","inactive","titlebar"),
+ theme->a_unfocused_title, FALSE))
set_default_appearance(theme->a_unfocused_title);
- if (!read_appearance(db, inst,
- "window.active.label.bg", theme->a_focused_label,
- TRUE))
+ if (!FIND(appearance, L("window","active","label"),
+ theme->a_focused_label, TRUE))
set_default_appearance(theme->a_focused_label);
- if (!read_appearance(db, inst,
- "window.inactive.label.bg", theme->a_unfocused_label,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","label"),
+ theme->a_unfocused_label, TRUE))
set_default_appearance(theme->a_unfocused_label);
- if (!read_appearance(db, inst,
- "window.active.handle.bg", theme->a_focused_handle,
- FALSE))
+ if (!FIND(appearance, L("window","active","handle"),
+ theme->a_focused_handle, FALSE))
set_default_appearance(theme->a_focused_handle);
- if (!read_appearance(db, inst,
- "window.inactive.handle.bg",theme->a_unfocused_handle,
- FALSE))
+ if (!FIND(appearance, L("window","inactive","handle"),
+ theme->a_unfocused_handle, FALSE))
set_default_appearance(theme->a_unfocused_handle);
- if (!read_appearance(db, inst,
- "window.active.grip.bg", theme->a_focused_grip,
- TRUE))
+ if (!FIND(appearance, L("window","active","grip"),
+ theme->a_focused_grip, TRUE))
set_default_appearance(theme->a_focused_grip);
- if (!read_appearance(db, inst,
- "window.inactive.grip.bg", theme->a_unfocused_grip,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","grip"),
+ theme->a_unfocused_grip, TRUE))
set_default_appearance(theme->a_unfocused_grip);
- if (!read_appearance(db, inst,
- "menu.items.bg", theme->a_menu,
- FALSE))
+ if (!FIND(appearance, L("menu","entries"), theme->a_menu, FALSE))
set_default_appearance(theme->a_menu);
- if (!read_appearance(db, inst,
- "menu.title.bg", theme->a_menu_title,
- FALSE))
+ if (!FIND(appearance, L("menu","title"), theme->a_menu_title, FALSE))
set_default_appearance(theme->a_menu_title);
- if (!read_appearance(db, inst,
- "menu.items.active.bg", theme->a_menu_selected,
- TRUE))
+ if (!FIND(appearance, L("menu", "active"), theme->a_menu_selected, TRUE))
set_default_appearance(theme->a_menu_selected);
/* read the appearances for rendering non-decorations */
- theme->app_hilite_bg = RrAppearanceCopy(theme->a_focused_title);
- theme->app_hilite_label = RrAppearanceCopy(theme->a_focused_label);
+ 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->app_hilite_fg = RrAppearanceCopy(theme->a_focused_label);
+ theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_label);
else
- theme->app_hilite_fg = RrAppearanceCopy(theme->a_focused_title);
- theme->app_unhilite_bg = RrAppearanceCopy(theme->a_unfocused_title);
- theme->app_unhilite_label = RrAppearanceCopy(theme->a_unfocused_label);
+ theme->osd_hilite_fg = RrAppearanceCopy(theme->a_focused_title);
if (theme->a_unfocused_label->surface.grad != RR_SURFACE_PARENTREL)
- theme->app_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_label);
+ theme->osd_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_label);
else
- theme->app_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_title);
+ theme->osd_unhilite_fg = RrAppearanceCopy(theme->a_unfocused_title);
/* read buttons textures */
- if (!read_appearance(db, inst,
- "window.active.button.disabled.bg",
- theme->a_disabled_focused_max,
- TRUE))
+ if (!FIND(appearance, L("window","active","buttons","disabled"),
+ theme->a_disabled_focused_max, TRUE))
set_default_appearance(theme->a_disabled_focused_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.disabled.bg",
- theme->a_disabled_unfocused_max,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","buttons","disabled"),
+ theme->a_disabled_unfocused_max, TRUE))
set_default_appearance(theme->a_disabled_unfocused_max);
- if (!read_appearance(db, inst,
- "window.active.button.pressed.bg",
- theme->a_focused_pressed_max,
- TRUE))
+ if (!FIND(appearance, L("window","active","buttons","pressed"),
+ theme->a_focused_pressed_max, TRUE))
set_default_appearance(theme->a_focused_pressed_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.pressed.bg",
- theme->a_unfocused_pressed_max,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","buttons","pressed"),
+ theme->a_unfocused_pressed_max, TRUE))
set_default_appearance(theme->a_unfocused_pressed_max);
- if (!read_appearance(db, inst,
- "window.active.button.toggled.bg",
- theme->a_toggled_focused_max,
- TRUE))
+ if (!FIND(appearance, L("window","active","buttons","toggled"),
+ theme->a_toggled_focused_max, TRUE))
{
RrAppearanceFree(theme->a_toggled_focused_max);
theme->a_toggled_focused_max =
RrAppearanceCopy(theme->a_focused_pressed_max);
}
- if (!read_appearance(db, inst,
- "window.inactive.button.toggled.bg",
- theme->a_toggled_unfocused_max,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","buttons","toggled"),
+ theme->a_toggled_unfocused_max, TRUE))
{
RrAppearanceFree(theme->a_toggled_unfocused_max);
theme->a_toggled_unfocused_max =
RrAppearanceCopy(theme->a_unfocused_pressed_max);
}
- if (!read_appearance(db, inst,
- "window.active.button.unpressed.bg",
- theme->a_focused_unpressed_max,
- TRUE))
+ if (!FIND(appearance, L("window","active","buttons","unpressed"),
+ theme->a_focused_unpressed_max, TRUE))
set_default_appearance(theme->a_focused_unpressed_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.unpressed.bg",
- theme->a_unfocused_unpressed_max,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","buttons","unpressed"),
+ theme->a_unfocused_unpressed_max, TRUE))
set_default_appearance(theme->a_unfocused_unpressed_max);
- if (!read_appearance(db, inst,
- "window.active.button.hover.bg",
- theme->a_hover_focused_max,
- TRUE))
+ if (!FIND(appearance, L("window","active","buttons","hover"),
+ theme->a_hover_focused_max, TRUE))
{
RrAppearanceFree(theme->a_hover_focused_max);
theme->a_hover_focused_max =
RrAppearanceCopy(theme->a_focused_unpressed_max);
}
- if (!read_appearance(db, inst,
- "window.inactive.button.hover.bg",
- theme->a_hover_unfocused_max,
- TRUE))
+ if (!FIND(appearance, L("window","inactive","buttons","hover"),
+ theme->a_hover_unfocused_max, TRUE))
{
RrAppearanceFree(theme->a_hover_unfocused_max);
theme->a_hover_unfocused_max =
RrAppearanceCopy(theme->a_unfocused_unpressed_max);
}
- theme->a_disabled_focused_close =
+ theme->a_disabled_focused_close =
RrAppearanceCopy(theme->a_disabled_focused_max);
theme->a_disabled_unfocused_close =
RrAppearanceCopy(theme->a_disabled_unfocused_max);
@@ -644,79 +644,68 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
/* set up the textures */
theme->a_focused_label->texture[0].type =
- theme->app_hilite_label->texture[0].type = RR_TEXTURE_TEXT;
+ theme->osd_hilite_label->texture[0].type = RR_TEXTURE_TEXT;
theme->a_focused_label->texture[0].data.text.justify = winjust;
- theme->app_hilite_label->texture[0].data.text.justify = RR_JUSTIFY_LEFT;
+ theme->osd_hilite_label->texture[0].data.text.justify = RR_JUSTIFY_LEFT;
theme->a_focused_label->texture[0].data.text.font =
- theme->app_hilite_label->texture[0].data.text.font =
+ theme->osd_hilite_label->texture[0].data.text.font =
theme->win_font_focused;
theme->a_focused_label->texture[0].data.text.color =
- theme->app_hilite_label->texture[0].data.text.color =
theme->title_focused_color;
+ theme->osd_hilite_label->texture[0].data.text.color =
+ theme->osd_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 (!FIND(shadow, L("window","active","label","text","shadow","offset"),
+ theme->a_focused_label))
+ theme->a_focused_label->texture[0].data.text.shadow_offset_x =
+ theme->a_focused_label->texture[0].data.text.shadow_offset_y = 0;
+ theme->a_focused_label->texture[0].data.text.shadow_color =
+ theme->title_focused_shadow_color;
+ theme->a_focused_label->texture[0].data.text.shadow_alpha =
+ theme->title_focused_shadow_alpha;
- 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;
+ if (!FIND(shadow, L("osd","text","shadow","offset"),
+ theme->osd_hilite_label))
+ {
+ theme->osd_hilite_label->texture[0].data.text.shadow_offset_x =
+ theme->a_focused_label->texture[0].data.text.shadow_offset_x;
+ theme->osd_hilite_label->texture[0].data.text.shadow_offset_y =
+ theme->a_focused_label->texture[0].data.text.shadow_offset_y;
}
- 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->osd_hilite_label->texture[0].data.text.shadow_color =
+ theme->osd_shadow_color;
+ theme->osd_hilite_label->texture[0].data.text.shadow_alpha =
+ theme->osd_shadow_alpha;
- theme->a_unfocused_label->texture[0].type =
- theme->app_unhilite_label->texture[0].type = RR_TEXTURE_TEXT;
+ theme->a_unfocused_label->texture[0].type = RR_TEXTURE_TEXT;
theme->a_unfocused_label->texture[0].data.text.justify = winjust;
- theme->app_unhilite_label->texture[0].data.text.justify =
- RR_JUSTIFY_LEFT;
theme->a_unfocused_label->texture[0].data.text.font =
- theme->app_unhilite_label->texture[0].data.text.font =
theme->win_font_unfocused;
theme->a_unfocused_label->texture[0].data.text.color =
- 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;
+ if (!FIND(shadow, L("window","inactive","label","text","shadow","offset"),
+ theme->a_unfocused_label))
+ theme->a_unfocused_label->texture[0].data.text.shadow_offset_x =
+ theme->a_unfocused_label->texture[0].data.text.shadow_offset_y = 0;
+ theme->a_unfocused_label->texture[0].data.text.shadow_color =
+ theme->title_unfocused_shadow_color;
+ theme->a_unfocused_label->texture[0].data.text.shadow_alpha =
+ theme->title_unfocused_shadow_alpha;
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;
+ if (!FIND(shadow, L("menu","title","text","shadow","offset"),
+ theme->a_menu_title))
+ theme->a_menu_title->texture[0].data.text.shadow_offset_x =
+ theme->a_menu_title->texture[0].data.text.shadow_offset_y = 0;
+ theme->a_menu_title->texture[0].data.text.shadow_color =
+ theme->menu_title_shadow_color;
+ theme->a_menu_title->texture[0].data.text.shadow_alpha =
+ theme->menu_title_shadow_alpha;
theme->a_menu_text_normal->texture[0].type =
theme->a_menu_text_disabled->texture[0].type =
@@ -735,24 +724,33 @@ 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;
+ if (!FIND(shadow, L("menu","inactive","shadow","offset"),
+ theme->a_menu_text_normal))
+ theme->a_menu_text_normal->texture[0].data.text.shadow_offset_x =
+ theme->a_menu_text_normal->texture[0].data.text.shadow_offset_y =
+ 0;
+ if (!FIND(shadow, L("menu","active","text","shadow","offset"),
+ theme->a_menu_text_selected))
+ theme->a_menu_text_selected->texture[0].data.text.shadow_offset_x =
+ theme->a_menu_text_selected->texture[0].data.text.shadow_offset_y =
+ 0;
+ if (!FIND(shadow, L("menu","disabled","shadow","offset"),
+ theme->a_menu_text_disabled))
+ 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;
+ theme->a_menu_text_normal->texture[0].data.text.shadow_color =
+ theme->menu_text_normal_shadow_color;
+ theme->a_menu_text_normal->texture[0].data.text.shadow_alpha =
+ theme->menu_text_normal_shadow_alpha;
+ theme->a_menu_text_selected->texture[0].data.text.shadow_color =
+ theme->menu_text_selected_shadow_color;
+ theme->a_menu_text_selected->texture[0].data.text.shadow_alpha =
+ theme->menu_text_selected_shadow_alpha;
+ theme->a_menu_text_disabled->texture[0].data.text.shadow_color =
+ theme->menu_text_disabled_shadow_color;
+ theme->a_menu_text_disabled->texture[0].data.text.shadow_alpha =
+ theme->menu_text_disabled_shadow_alpha;
theme->a_disabled_focused_max->texture[0].type =
theme->a_disabled_unfocused_max->texture[0].type =
@@ -802,7 +800,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->a_unfocused_pressed_iconify->texture[0].type =
theme->a_menu_bullet_normal->texture[0].type =
theme->a_menu_bullet_selected->texture[0].type = RR_TEXTURE_MASK;
-
+
theme->a_disabled_focused_max->texture[0].data.mask.mask =
theme->a_disabled_unfocused_max->texture[0].data.mask.mask =
theme->max_disabled_mask;
@@ -936,27 +934,35 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->a_menu_bullet_selected->texture[0].data.mask.color =
theme->menu_selected_color;
- XrmDestroyDatabase(db);
+ g_free(ps.path);
+ parse_close(ps.doc);
- /* 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;
+ RrAppearance *a, *b, *c;
+
+ /* caluclate the font heights*/
+ a = theme->a_focused_label;
+ theme->win_font_height =
+ RrFontHeight(theme->win_font_focused,
+ a->texture[0].data.text.shadow_offset_y);
+ a = theme->a_unfocused_label;
+ theme->win_font_height =
+ MAX(theme->win_font_height,
+ RrFontHeight(theme->win_font_unfocused,
+ a->texture[0].data.text.shadow_offset_y));
+ a = theme->a_menu_title;
+ theme->menu_title_font_height =
+ RrFontHeight(theme->menu_title_font,
+ a->texture[0].data.text.shadow_offset_y);
+ a = theme->a_menu_text_normal;
+ b = theme->a_menu_text_selected;
+ c = theme->a_menu_text_disabled;
+ theme->menu_font_height =
+ RrFontHeight(theme->menu_font,
+ MAX(a->texture[0].data.text.shadow_offset_y,
+ MAX(b->texture[0].data.text.shadow_offset_y,
+ c->texture[0].data.text.shadow_offset_y)));
RrMargins(theme->a_focused_label, &fl, &ft, &fr, &fb);
RrMargins(theme->a_unfocused_label, &ul, &ut, &ur, &ub);
@@ -973,14 +979,16 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
MAX(MAX(theme->padding * 2, ft + fb),
MAX(theme->padding * 2, ut + ub));
*/
- theme->title_height = theme->label_height + theme->padding * 2;
+ theme->title_height = theme->label_height + theme->paddingy * 2;
/* this should match the above title_height given the same font size
for both. */
theme->menu_title_height = theme->menu_title_font_height +
- theme->padding * 2;
+ theme->paddingy * 2;
}
theme->button_size = theme->label_height - 2;
theme->grip_width = 25;
+ theme->top_grip_height = MAX(theme->handle_height,
+ theme->title_height / 4);
return theme;
}
@@ -988,28 +996,34 @@ 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);
+ RrColorFree(theme->menu_b_color);
+ RrColorFree(theme->frame_b_color);
RrColorFree(theme->cb_unfocused_color);
RrColorFree(theme->cb_focused_color);
- RrColorFree(theme->title_unfocused_color);
RrColorFree(theme->title_focused_color);
+ RrColorFree(theme->title_unfocused_color);
RrColorFree(theme->titlebut_disabled_focused_color);
RrColorFree(theme->titlebut_disabled_unfocused_color);
RrColorFree(theme->titlebut_hover_focused_color);
RrColorFree(theme->titlebut_hover_unfocused_color);
RrColorFree(theme->titlebut_toggled_focused_color);
RrColorFree(theme->titlebut_toggled_unfocused_color);
- RrColorFree(theme->titlebut_unfocused_pressed_color);
RrColorFree(theme->titlebut_focused_pressed_color);
- RrColorFree(theme->titlebut_unfocused_unpressed_color);
+ RrColorFree(theme->titlebut_unfocused_pressed_color);
RrColorFree(theme->titlebut_focused_unpressed_color);
- RrColorFree(theme->menu_color);
+ RrColorFree(theme->titlebut_unfocused_unpressed_color);
RrColorFree(theme->menu_title_color);
+ RrColorFree(theme->menu_color);
RrColorFree(theme->menu_disabled_color);
RrColorFree(theme->menu_selected_color);
+ RrColorFree(theme->title_focused_shadow_color);
+ RrColorFree(theme->title_unfocused_shadow_color);
+ RrColorFree(theme->osd_color);
+ RrColorFree(theme->osd_shadow_color);
+ RrColorFree(theme->menu_title_shadow_color);
+ RrColorFree(theme->menu_text_normal_shadow_color);
+ RrColorFree(theme->menu_text_selected_shadow_color);
+ RrColorFree(theme->menu_text_disabled_shadow_color);
g_free(theme->def_win_icon);
@@ -1110,152 +1124,16 @@ void RrThemeFree(RrTheme *theme)
RrAppearanceFree(theme->a_menu_bullet_selected);
RrAppearanceFree(theme->a_clear);
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);
+ RrAppearanceFree(theme->osd_hilite_bg);
+ RrAppearanceFree(theme->osd_hilite_fg);
+ RrAppearanceFree(theme->osd_hilite_label);
+ RrAppearanceFree(theme->osd_unhilite_fg);
g_free(theme);
}
}
-static XrmDatabase loaddb(RrTheme *theme, gchar *name)
-{
- GSList *it;
- XrmDatabase db = NULL;
- gchar *s;
-
- if (name[0] == '/') {
- s = g_build_filename(name, "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- theme->path = g_path_get_dirname(s);
- g_free(s);
- } else {
- /* XXX backwards compatibility, remove me sometime later */
- s = g_build_filename(g_get_home_dir(), ".themes", name,
- "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- theme->path = g_path_get_dirname(s);
- g_free(s);
-
- for (it = parse_xdg_data_dir_paths(); !db && it;
- it = g_slist_next(it))
- {
- s = g_build_filename(it->data, "themes", name,
- "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- theme->path = g_path_get_dirname(s);
- g_free(s);
- }
- }
-
- if (db == NULL) {
- s = g_build_filename(name, "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- theme->path = g_path_get_dirname(s);
- g_free(s);
- }
-
- return db;
-}
-
-static gchar *create_class_name(gchar *rname)
-{
- gchar *rclass = g_strdup(rname);
- gchar *p = rclass;
-
- while (TRUE) {
- *p = toupper(*p);
- p = strchr(p+1, '.');
- if (p == NULL) break;
- ++p;
- if (*p == '\0') break;
- }
- 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;
- gchar *rclass = create_class_name(rname);
- gchar *rettype, *end;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- *value = (gint)strtol(retvalue.addr, &end, 10);
- if (end != retvalue.addr)
- ret = TRUE;
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_string(XrmDatabase db, gchar *rname, gchar **value)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *rettype;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- *value = retvalue.addr;
- ret = TRUE;
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_color(XrmDatabase db, const RrInstance *inst,
- gchar *rname, RrColor **value)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *rettype;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- RrColor *c = RrColorParse(inst, retvalue.addr);
- if (c != NULL) {
- *value = c;
- ret = TRUE;
- }
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_mask(const RrInstance *inst,
- gchar *maskname, RrTheme *theme,
+static gboolean read_mask(ParseState *ps, gchar *maskname,
RrPixmapMask **value)
{
gboolean ret = FALSE;
@@ -1264,10 +1142,10 @@ static gboolean read_mask(const RrInstance *inst,
guint w, h;
guchar *b;
- s = g_build_filename(theme->path, maskname, NULL);
+ s = g_build_filename(ps->path, maskname, NULL);
if (XReadBitmapFileData(s, &w, &h, &b, &hx, &hy) == BitmapSuccess) {
ret = TRUE;
- *value = RrPixmapMaskNew(inst, w, h, (gchar*)b);
+ *value = RrPixmapMaskNew(ps->inst, w, h, (gchar*)b);
XFree(b);
}
g_free(s);
@@ -1275,10 +1153,46 @@ static gboolean read_mask(const RrInstance *inst,
return ret;
}
-static void parse_appearance(gchar *tex, RrSurfaceColorType *grad,
- RrReliefType *relief, RrBevelType *bevel,
- gboolean *interlaced, gboolean *border,
- gboolean allow_trans)
+static void set_default_appearance(RrAppearance *a)
+{
+ a->surface.grad = RR_SURFACE_SOLID;
+ a->surface.relief = RR_RELIEF_FLAT;
+ a->surface.bevel = RR_BEVEL_1;
+ a->surface.interlaced = FALSE;
+ a->surface.border = FALSE;
+ 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;
+}
+
+static void parse_style(gchar *tex, RrSurfaceColorType *grad,
+ RrReliefType *relief, RrBevelType *bevel,
+ gboolean *interlaced, gboolean *border,
+ gboolean allow_trans)
{
gchar *t;
@@ -1333,86 +1247,115 @@ static void parse_appearance(gchar *tex, RrSurfaceColorType *grad,
}
}
-
-static gboolean read_appearance(XrmDatabase db, const RrInstance *inst,
- gchar *rname, RrAppearance *value,
- gboolean allow_trans)
+static xmlNodePtr find_node(xmlNodePtr n, gchar *names[])
{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *cname, *ctoname, *bcname, *icname;
- gchar *rettype;
- XrmValue retvalue;
-
- cname = g_strconcat(rname, ".color", NULL);
- ctoname = g_strconcat(rname, ".colorTo", NULL);
- bcname = g_strconcat(rname, ".border.color", NULL);
- icname = g_strconcat(rname, ".interlace.color", NULL);
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- parse_appearance(retvalue.addr,
- &value->surface.grad,
- &value->surface.relief,
- &value->surface.bevel,
- &value->surface.interlaced,
- &value->surface.border,
- allow_trans);
- if (!read_color(db, inst, cname, &value->surface.primary))
- value->surface.primary = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst, ctoname, &value->surface.secondary))
- value->surface.secondary = RrColorNew(inst, 0, 0, 0);
- if (value->surface.border)
- if (!read_color(db, inst, bcname,
- &value->surface.border_color))
- value->surface.border_color = RrColorNew(inst, 0, 0, 0);
- if (value->surface.interlaced)
- if (!read_color(db, inst, icname,
- &value->surface.interlace_color))
- value->surface.interlace_color = RrColorNew(inst, 0, 0, 0);
- ret = TRUE;
- }
-
- g_free(icname);
- g_free(bcname);
- g_free(ctoname);
- g_free(cname);
- g_free(rclass);
- return ret;
-}
-
-static void set_default_appearance(RrAppearance *a)
-{
- a->surface.grad = RR_SURFACE_SOLID;
- a->surface.relief = RR_RELIEF_FLAT;
- a->surface.bevel = RR_BEVEL_1;
- a->surface.interlaced = FALSE;
- a->surface.border = FALSE;
- 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;
+ for (i = 0; names[i] && n; ++i)
+ n = parse_find_node(names[i], n->children);
+ return n;
+}
+
+static gboolean find_int(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gint *integer, gint lower, gint upper)
+{
+ gint i;
+
+ if ((n = find_node(n, names))) {
+ i = parse_int(ps->doc, n);
+ if (i >= lower && i <= upper) {
+ *integer = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean find_string(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gchar **string)
+{
+ if ((n = find_node(n, names))) {
+ *string = parse_string(ps->doc, n);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean find_color(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrColor **color, gchar *alpha)
+{
+ if ((n = find_node(n, names))) {
+ int r,g,b,a;
+ if (parse_attr_int("r", n, &r) &&
+ parse_attr_int("g", n, &g) &&
+ parse_attr_int("b", n, &b) &&
+ parse_attr_int("a", n, &a) &&
+ r >= 0 && g >= 0 && b >= 0 && a >= 0 &&
+ r < 256 && g < 256 && b < 256 && a < 256)
+ {
+ *color = RrColorNew(ps->inst, r, g, b);
+ if (alpha) *alpha = a;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean find_point(ParseState *ps, xmlNodePtr n, gchar *names[],
+ gint *x, gint *y,
+ gint lowx, gint upx, gint lowy, gint upy)
+{
+ if ((n = find_node(n, names))) {
+ gint a, b;
+ if (parse_attr_int("horizontal", n, &a) &&
+ parse_attr_int("vertical", n, &b) &&
+ a >= lowx && a <= upx && b >= lowy && b <= upy)
+ {
+ *x = a; *y = b;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean find_shadow(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrAppearance *a)
+{
+ return find_point(ps, n, names,
+ &a->texture[0].data.text.shadow_offset_x,
+ &a->texture[0].data.text.shadow_offset_y,
+ -20, 20, -20, 20);
+}
+
+static gboolean find_appearance(ParseState *ps, xmlNodePtr n, gchar *names[],
+ RrAppearance *a, gboolean allow_trans)
+{
+ xmlNodePtr n2;
+
+ if (!(n = find_node(n, names)))
+ return FALSE;
+
+ if ((n2 = find_node(n, L("style")))) {
+ gchar *s = parse_string(ps->doc, n2);
+ parse_style(s, &a->surface.grad, &a->surface.relief,
+ &a->surface.bevel, &a->surface.interlaced,
+ &a->surface.border, allow_trans);
+ g_free(s);
+ } else
+ return FALSE;
+
+ if (!find_color(ps, n, L("primary"), &a->surface.primary, NULL))
+ a->surface.primary = RrColorNew(ps->inst, 0, 0, 0);
+ if (!find_color(ps, n, L("secondary"), &a->surface.secondary, NULL))
+ a->surface.secondary = RrColorNew(ps->inst, 0, 0, 0);
+ if (a->surface.border)
+ if (!find_color(ps, n, L("border"),
+ &a->surface.border_color, NULL))
+ a->surface.border_color = RrColorNew(ps->inst, 0, 0, 0);
+ if (a->surface.interlaced)
+ if (!find_color(ps, n, L("interlace"),
+ &a->surface.interlace_color, NULL))
+ a->surface.interlace_color = RrColorNew(ps->inst, 0, 0, 0);
+
+ return TRUE;
}
diff --git a/render/theme.h b/render/theme.h
index 22bf7e10..4d90dac8 100644
--- a/render/theme.h
+++ b/render/theme.h
@@ -2,7 +2,7 @@
theme.h for the Openbox window manager
Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -27,28 +27,37 @@ G_BEGIN_DECLS
typedef struct _RrTheme RrTheme;
struct _RrTheme {
- gchar *path;
- gchar *name;
-
const RrInstance *inst;
- /* style settings - optional decor */
- gboolean show_handle;
+ /* style settings - fonts */
+ RrFont *win_font_focused;
+ RrFont *win_font_unfocused;
+ RrFont *menu_title_font;
+ RrFont *menu_font;
/* style settings - geometry */
- gint padding;
+ gint paddingx;
+ gint paddingy;
gint handle_height;
- gint bwidth;
- gint cbwidth;
+ gint fbwidth; /*!< frame border width */
+ gint mbwidth; /*!< menu border width */
+ gint cbwidthx;
+ gint cbwidthy;
+ gint menu_overlap;
+ /* these ones are calculated, not set directly by the theme file */
+ gint win_font_height;
+ gint menu_title_font_height;
+ gint menu_font_height;
gint label_height;
gint title_height;
gint menu_title_height;
gint button_size;
gint grip_width;
- gint menu_overlap;
+ gint top_grip_height;
/* style settings - colors */
- RrColor *b_color;
+ RrColor *menu_b_color;
+ RrColor *frame_b_color;
RrColor *cb_focused_color;
RrColor *cb_unfocused_color;
RrColor *title_focused_color;
@@ -67,15 +76,21 @@ struct _RrTheme {
RrColor *menu_color;
RrColor *menu_disabled_color;
RrColor *menu_selected_color;
-
- /* style settings - fonts */
- gint win_font_height;
- RrFont *win_font_focused;
- RrFont *win_font_unfocused;
- gint menu_title_font_height;
- RrFont *menu_title_font;
- gint menu_font_height;
- RrFont *menu_font;
+ RrColor *title_focused_shadow_color;
+ gchar title_focused_shadow_alpha;
+ RrColor *title_unfocused_shadow_color;
+ gchar title_unfocused_shadow_alpha;
+ RrColor *osd_color;
+ RrColor *osd_shadow_color;
+ gchar osd_shadow_alpha;
+ RrColor *menu_title_shadow_color;
+ gchar menu_title_shadow_alpha;
+ RrColor *menu_text_normal_shadow_color;
+ gchar menu_text_normal_shadow_alpha;
+ RrColor *menu_text_selected_shadow_color;
+ gchar menu_text_selected_shadow_alpha;
+ RrColor *menu_text_disabled_shadow_color;
+ gchar menu_text_disabled_shadow_alpha;
/* style settings - pics */
RrPixel32 *def_win_icon; /* 48x48 RGBA */
@@ -178,12 +193,10 @@ struct _RrTheme {
RrAppearance *a_clear; /* clear with no texture */
RrAppearance *a_clear_tex; /* clear with a texture */
- RrAppearance *app_hilite_bg;
- RrAppearance *app_unhilite_bg;
- RrAppearance *app_hilite_fg; /* never parent relative */
- RrAppearance *app_unhilite_fg; /* never parent relative */
- RrAppearance *app_hilite_label; /* can be parent relative */
- RrAppearance *app_unhilite_label; /* can be parent relative */
+ RrAppearance *osd_hilite_bg; /* can never be parent relative */
+ RrAppearance *osd_hilite_fg; /* can never be parent relative */
+ RrAppearance *osd_hilite_label; /* can be parent relative */
+ RrAppearance *osd_unhilite_fg; /* can never be parent relative */
};
diff --git a/themes/Mikachu/openbox-3/themerc b/themes/Mikachu/openbox-3/themerc
deleted file mode 100644
index b4e75479..00000000
--- a/themes/Mikachu/openbox-3/themerc
+++ /dev/null
@@ -1,159 +0,0 @@
-!! Menu settings
-
-menu.title.bg: raised gradient crossdiagonal bevel1
-menu.title.bg.color: #6699CC
-menu.title.bg.colorTo: #334866
-menu.title.bg.border.color: #000000
-menu.title.text.color: #CCCCFF
-menu.title.text.justify: center
-
-menu.items.bg: flat gradient horizontal bevel1
-menu.items.bg.color: #AAAACC
-menu.items.bg.colorTo: #AAAAD0
-menu.items.bg.border.color: #000000
-menu.items.text.color: #000022
-menu.items.disabled.text.color: #711
-
-menu.items.active.bg: raised gradient horizontal bevel1
-menu.items.active.bg.color: #555577
-menu.items.active.bg.colorTo: #6699CC
-menu.items.active.bg.border.color: #000000
-menu.items.active.text.color: #CCCCFF
-
-menu.frame.justify: left
-
-!! General window settings
-window.label.text.justify: left
-
-!! focused window settings
-window.active.client.color: #8080A0
-
-window.active.title.bg: raised gradient crossdiagonal bevel1
-window.active.title.bg.color: #6699CC
-window.active.title.bg.colorTo: #334866
-window.active.title.bg.border.color: #000000
-
-window.active.handle.bg: flat gradient crossdiagonal bevel1
-window.active.handle.bg.color: #6699CC
-window.active.handle.bg.colorTo: #334866
-window.active.handle.bg.border.color: #000000
-
-window.active.grip.bg: parentrelative
-window.active.grip.bg.color: #000000
-window.active.grip.bg.colorTo: #000000
-window.active.grip.bg.border.color: #000000
-
-window.active.label.bg: parentrelative
-window.active.label.bg.color: #000000
-window.active.label.bg.colorTo: #000000
-window.active.label.bg.border.color: #000000
-window.active.label.text.color: #BFE9FF
-
-window.active.button.unpressed.bg: parentrelative
-window.active.button.unpressed.bg.color: #000000
-window.active.button.unpressed.bg.colorTo: #000000
-window.active.button.unpressed.bg.border.color: #000000
-window.active.button.unpressed.image.color: grey85
-
-window.active.button.pressed.bg: sunken gradient crossdiagonal bevel1
-window.active.button.pressed.bg.color: #6699CC
-window.active.button.pressed.bg.colorTo: #334866
-window.active.button.pressed.bg.border.color: #000000
-window.active.button.pressed.image.color: green
-
-window.active.button.toggled.bg: sunken gradient crossdiagonal bevel1
-window.active.button.toggled.bg.color: #6699CC
-window.active.button.toggled.bg.colorTo: #334866
-window.active.button.toggled.bg.border.color: #000000
-window.active.button.toggled.image.color: grey85
-
-window.active.button.disabled.bg: parentrelative
-window.active.button.disabled.bg.color: #000000
-window.active.button.disabled.bg.colorTo: #000000
-window.active.button.disabled.image.color: #000000
-window.active.button.disabled.bg.border.color: #000000
-
-window.active.button.hover.bg: parentrelative
-window.active.button.hover.image.color: #00FF00
-window.active.button.hover.bg.color: #000000
-window.active.button.hover.bg.colorTo: #000000
-window.active.button.hover.bg.border.color: #000000
-
-!window.active.button.hover.bg: raised gradient crossdiagonal bevel1
-!window.active.button.hover.image.color: #00FF00
-!window.active.button.hover.bg.color: #334866
-!window.active.button.hover.bg.colorTo: #6699CC
-!window.active.button.hover.bg.border.color: #000000
-
-!! unfocused window settings
-window.inactive.client.color: grey50
-
-window.inactive.title.bg: flat gradient diagonal bevel1
-window.inactive.title.bg.color: #7F7F88
-window.inactive.title.bg.colorTo: #33333B
-window.inactive.title.bg.border.color: #000000
-
-window.inactive.handle.bg: flat gradient diagonal bevel1
-window.inactive.handle.bg.color: grey50
-window.inactive.handle.bg.colorTo: grey20
-window.inactive.handle.bg.border.color: #000000
-
-window.inactive.grip.bg: parentrelative
-window.inactive.grip.bg.color: #000000
-window.inactive.grip.bg.colorTo: #000000
-window.inactive.grip.bg.border.color: #000000
-
-window.inactive.label.bg: parentrelative
-window.inactive.label.bg.color: #000000
-window.inactive.label.bg.colorTo: #000000
-window.inactive.label.bg.border.color: #000000
-window.inactive.label.text.color: grey70
-
-window.inactive.button.unpressed.bg: parentrelative
-window.inactive.button.unpressed.bg.color: #000000
-window.inactive.button.unpressed.bg.colorTo: #000000
-window.inactive.button.unpressed.bg.border.color: #000000
-window.inactive.button.unpressed.image.color: grey60
-
-window.inactive.button.pressed.bg: sunken gradient crossdiagonal bevel1
-window.inactive.button.pressed.bg.color: grey60
-window.inactive.button.pressed.bg.colorTo: grey20
-window.inactive.button.pressed.bg.border.color: #000000
-window.inactive.button.pressed.image.color: #00CC00
-
-window.inactive.button.disabled.bg: parentrelative
-window.inactive.button.disabled.bg.color: #000000
-window.inactive.button.disabled.bg.colorTo: #000000
-window.inactive.button.disabled.bg.border.color: #000000
-window.inactive.button.disabled.image.color: #000000
-
-window.inactive.button.toggled.bg: sunken gradient crossdiagonal bevel1
-window.inactive.button.toggled.bg.color: grey60
-window.inactive.button.toggled.bg.colorTo: grey20
-window.inactive.button.toggled.bg.border.color: #000000
-window.inactive.button.toggled.image.color: grey60
-
-window.inactive.button.hover.bg: parentrelative
-window.inactive.button.hover.bg.color: #000000
-window.inactive.button.hover.bg.colorTo: #000000
-window.inactive.button.hover.image.color: #00CC00
-window.inactive.button.hover.bg.border.color: #000000
-
-!! Global width settings
-border.width: 1
-padding.width: 1
-window.handle.width: 0
-window.client.padding.width: 0
-focus.inner.color: #A6CAF3
-focus.outer.color: #0000A0
-
-!! Miscellaneous settings
-border.color: #223344
-
-!! Font stuff
-window.active.label.text.font: Candara,sans:pixelsize=14:shadow=n:weight=0
-window.inactive.label.text.font: Candara,sans:pixelsize=14:shadowoffset=3:shadowtint=32:shadow=y:weight=0
-menu.title.text.font: Technical,sans:pixelsize=26:shadowoffset=2:shadowtint=35:shadow=y
-menu.items.font: Technical,sans:pixelsize=14:shadowoffset=2:shadowtint=15:shadow=y
-
-!menu.overlap: 3
diff --git a/themes/Mikachu/openbox-3/themerc.xml b/themes/Mikachu/openbox-3/themerc.xml
new file mode 100644
index 00000000..6ea59cb2
--- /dev/null
+++ b/themes/Mikachu/openbox-3/themerc.xml
@@ -0,0 +1,194 @@
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+ left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/Natura/openbox-3/themerc b/themes/Natura/openbox-3/themerc
deleted file mode 100644
index 10b30f17..00000000
--- a/themes/Natura/openbox-3/themerc
+++ /dev/null
@@ -1,96 +0,0 @@
-!! Natura by quandar (http://deletefactory.net/quandar)
-
-!! Global Width
-window.handle.width: 2
-
-window.client.padding.width: 0
-border.Width: 1
-padding.width: 2
-
-border.color: #000000
-menu.overlap: 0
-window.frameColor: #eeeeee
-window.*.client.color: #eeeeee
-*.text.justify: left
-
-!! Menu
-menu.title.bg: flat gradient splitvertical
-menu.title.bg.color: #5c4e45
-menu.title.bg.colorTo: #51443e
-menu.title.text.color: #ffffff
-
-menu.items.bg: flat solid
-menu.items.bg.color: #f9f2ee
-
-menu.items.text.color: #000000
-menu.items.disabled.text.color: #737573
-
-menu.items.active.bg: flat gradient splitvertical
-menu.items.active.bg.color: #5c4e45
-menu.items.active.bg.colorTo:#51443e
-menu.items.active.text.color: #f9f2ee
-
-!! Active Windows
-window.active.title.bg: flat gradient splitvertical
-window.active.title.bg.color: #5c4e45
-window.active.title.bg.colorTo: #51443e
-window.active.*.bg.border.color: #000000
-
-window.active.label.bg: parentrelative
-window.active.label.text.color: #f9f2ee
-
-window.active.button.*.bg: parentrelative
-window.active.button.*.image.color: #f9f2ee
-window.active.button.*.bg.border.color: #4e5860
-
-window.active.button.hover.bg.color: #576773
-window.active.button.hover.bg.border.color: #9aabb9
-window.active.button.pressed.bg.color: #343b40
-window.active.button.pressed.bg.colorTo: #000000
-window.active.button.pressed.image.color: #b6b6b6
-window.active.button.pressed.bg.border.color: #95a5b2
-
-window.active.button.disabled.bg: parentrelative
-window.active.button.disabled.image.color: #ffffff
-
-window.active.handle.bg: flat solid
-window.active.handle.bg.color:#51443e
-
-window.*.grip.bg: flat solid
-window.*.grip.bg.color: #51443e
-
-window.handle.width: 2
-
-!! Inactive Windows
-window.inactive.title.bg: flat gradient vertical
-window.inactive.title.bg.color: #f0ece3
-window.inactive.title.bg.colorTo: #f8f7f2
-window.inactive.*.border.color: #bfbfbf
-
-window.inactive.label.bg: parentrelative
-window.inactive.label.text.color: #919191
-
-window.inactive.button.*.bg: parentrelative
-window.inactive.button.*.bg.color: #eeeeee
-window.inactive.button.*.image.color: #b6b6b6
-window.inactive.button.*.bg.border.color: #c9c9c9
-
-window.inactive.button.pressed.bg.color: #c5c2c5
-window.inactive.button.pressed.bg.border.color: #7b7d7b
-window.inactive.button.pressed.image.color: #999999
-
-window.inactive.button.hover.bg.color: #afb1b2
-window.inactive.button.hover.bg.border.color: #d9dfe4
-window.inactive.button.hover.image.color: #ffffff
-window.inactive.button.disabled.bg: parentrelative
-window.inactive.button.disabled.image.color: #ffffff
-
-window.inactive.handle.bg: flat solid
-window.inactive.handle.bg.color: #f9f7f3
-window.inactive.grip.bg: parentrelative
-
-!! Fonts
-window.active.label.text.font: sans:pixelsize=12:bold:shadow=y:shadowoffset=1:shadowtint=75
-window.inactive.label.text.font: sans:pixelsize=12:bold:shadow=y:shadowoffset=1:shadowtint=0
-menu.items.font: sans:pixelsize=12
-menu.title.text.font: sans:pixelsize=12:bold:shadow=y:shadowoffset=1:shadowtint=75
diff --git a/themes/Natura/openbox-3/themerc.xml b/themes/Natura/openbox-3/themerc.xml
new file mode 100644
index 00000000..b94e2819
--- /dev/null
+++ b/themes/Natura/openbox-3/themerc.xml
@@ -0,0 +1,177 @@
+
+
+
+
+
+ 2
+
+
+
+
+ 1
+
+
+
+ left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/artwiz-boxed/openbox-3/themerc b/themes/artwiz-boxed/openbox-3/themerc
deleted file mode 100644
index e10ad8c0..00000000
--- a/themes/artwiz-boxed/openbox-3/themerc
+++ /dev/null
@@ -1,102 +0,0 @@
-menu.title.bg: raised gradient diagonal
-menu.title.bg.color: rgb:90/94/98
-menu.title.bg.colorTo: rgb:20/24/28
-menu.title.text.color: white
-menu.title.text.justify: center
-
-menu.items.bg: sunken gradient diagonal
-menu.items.bg.color: rgb:10/20/30
-menu.items.bg.colorTo: rgb:70/80/90
-menu.items.text.color: rgb:90/a0/b0
-menu.items.justify: center
-
-menu.items.active.bg: raised gradient diagonal
-menu.items.active.bg.color: rgb:90/94/98
-menu.items.active.bg.colorTo: rgb:20/24/28
-menu.items.active.text.color: white
-menu.bullet.image.color: rgb:90/a0/b0
-menu.bullet.selected.image.color: #ffffff
-
-window.active.title.bg: raised gradient vertical
-window.active.title.bg.color: rgb:80/84/88
-window.active.title.bg.colorTo: rgb:30/34/38
-window.inactive.title.bg: raised vertical gradient
-window.inactive.title.bg.color: rgb:50/54/58
-window.inactive.title.bg.colorTo: black
-
-window.active.label.bg: sunken diagonal gradient
-window.active.label.bg.color: rgb:10/20/30
-window.active.label.bg.colorTo: rgb:70/80/90
-window.active.label.text.color: white
-window.inactive.label.bg: sunken gradient diagonal
-window.inactive.label.bg.color: black
-window.inactive.label.bg.colorTo: rgb:40/50/60
-window.inactive.label.text.color: rgb:60/64/68
-window.label.text.justify: center
-
-window.active.button.unpressed.bg: raised gradient diagonal
-window.active.button.unpressed.bg.color: rgb:90/94/98
-window.active.button.unpressed.bg.colorTo: rgb:20/24/28
-window.active.button.unpressed.image.color: white
-
-window.inactive.button.unpressed.bg: raised gradient diagonal
-window.inactive.button.unpressed.bg.color: rgb:50/54/58
-window.inactive.button.unpressed.bg.colorTo: black
-window.inactive.button.unpressed.image.color: rgb:70/74/78
-
-window.active.button.pressed.bg: sunken gradient diagonal
-window.active.button.pressed.bg.color: rgb:20/40/50
-window.active.button.pressed.bg.colorTo: rgb:60/70/80
-
-window.inactive.button.pressed.bg: sunken gradient diagonal
-window.inactive.button.pressed.bg.color: rgb:50/54/58
-window.inactive.button.pressed.bg.colorTo: black
-window.inactive.button.pressed.image.color: rgb:70/74/78
-
-window.active.client.color: rgb:40/44/48
-window.inactive.client.color: rgb:20/24/28
-
-window.active.handle.bg: raised gradient diagonal
-window.active.handle.bg.color: rgb:70/74/78
-window.active.handle.bg.colorTo: rgb:40/44/48
-
-window.inactive.handle.bg: raised gradient diagonal
-window.inactive.handle.bg.color: rgb:50/54/58
-window.inactive.handle.bg.colorTo: black
-
-window.active.grip.bg: sunken diagonal gradient
-window.active.grip.bg.color: rgb:20/30/40
-window.active.grip.bg.colorTo: rgb:60/70/80
-
-window.inactive.grip.bg: sunken diagonal gradient
-window.inactive.grip.bg.color: black
-window.inactive.grip.bg.colorTo: rgb:30/40/50
-
-window.active.button.toggled.bg: raised gradient diagonal
-window.active.button.toggled.bg.color: rgb:90/94/98
-window.active.button.toggled.bg.colorTo: rgb:20/24/28
-window.active.button.toggled.image.color: white
-
-window.inactive.button.toggled.bg: raised gradient diagonal
-window.inactive.button.toggled.bg.color: rgb:50/54/58
-window.inactive.button.toggled.bg.colorTo: black
-window.inactive.button.toggled.image.color: rgb:70/74/78
-
-window.active.button.disabled.bg: raised gradient diagonal
-window.active.button.disabled.bg.color: rgb:90/94/98
-window.active.button.disabled.bg.colorTo: rgb:20/24/28
-window.active.button.disabled.image.color: grey
-
-window.inactive.button.disabled.bg: raised gradient diagonal
-window.inactive.button.disabled.bg.color: rgb:50/54/58
-window.inactive.button.disabled.bg.colorTo: black
-window.inactive.button.disabled.image.color: rgb:70/74/78
-
-border.color: black
-padding.width: 1
-borderWidth: 1
-window.handle.width: 4
-
-window.active.label.text.font: sans:pixelsize=10
-menu.title.text.font: sans:pixelsize=10
-menu.items.font: sans:pixelsize=10
diff --git a/themes/artwiz-boxed/openbox-3/themerc.xml b/themes/artwiz-boxed/openbox-3/themerc.xml
new file mode 100644
index 00000000..73cf82c4
--- /dev/null
+++ b/themes/artwiz-boxed/openbox-3/themerc.xml
@@ -0,0 +1,148 @@
+
+
+
+ 4
+
+
+
+
+ 1
+
+
+ center
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/bear2/openbox-3/themerc b/themes/bear2/openbox-3/themerc
deleted file mode 100644
index b4c51d03..00000000
--- a/themes/bear2/openbox-3/themerc
+++ /dev/null
@@ -1,78 +0,0 @@
-!!General
-
-window.handle.width: 4
-window.client.padding.width: 0
-border.Width: 1
-padding.width: 3
-menu.overlap: 2
-border.color: #4e4e4e
-window.frameColor: #eeeeec
-window.*.client.color: #eeeeec
-*.text.justify: center
-
-!!Fonts
-
-window.active.label.text.font: sans:pixelsize=12:shadow=y:shadowoffset=1:shadowtint=3:bold
-window.inactive.label.text.font: sans:pixelsize=12:shadow=y:shadowoffset=1:shadowtint=0:bold
-menu.items.font: sans:pixelsize=12
-menu.title.text.font: sans:pixelsize=12:shadow=y:shadowoffset=1:shadowtint=30:bold
-
-!!Menu
-menu.border.color: #9d9d9d
-menu.title.bg: flat border vertical gradient
-menu.title.bg.color: #3465A4
-menu.title.bg.colorTo: #407CCA
-menu.title.bg.border.color: #729fcf
-menu.title.text.color: #ffffff
-
-menu.items.bg: flat border solid
-menu.items.bg.color: #eeeeec
-menu.items.bg.border.color: #EFEBE7
-
-menu.items.text.color: #444444
-menu.items.disabled.text.color: #babdb6
-
-menu.items.active.bg: flat solid
-menu.items.active.bg.color: #4481c0
-menu.items.active.bg.colorTo: #4175aa
-menu.items.active.text.color: #f6f8fb
-menu.items.active.bg.border.color: #416c98
-
-!!Active
-
-window.active.title.bg: flat border gradient mirrorhorizontal
-window.active.title.bg.color: #3465A4
-window.active.title.bg.colorTo: #407CCA
-window.active.title.bg.border.color: #699acd
-
-window.active.label.bg: parentrelative
-window.active.label.text.color: #ffffff
-
-window.active.button.*.bg: parentrelative
-window.active.button.*.image.color: #efefef
-window.active.button.hover.bg.color: #729fcf
-window.active.button.hover.image.color: #ffffff
-window.active.button.pressed.bg.color: #a7cef2
-window.active.button.disabled.image.color: #dddddd
-
-window.active.handle.bg: raised solid
-window.active.handle.bg.color: #E7e7e7
-window.*.grip.bg: parentrelative
-
-!!Inactive
-
-window.inactive.title.bg: flat border gradient mirrorhorizontal
-window.inactive.title.bg.color: #dcdcdc
-window.inactive.title.bg.colorTo: #eeeeec
-window.inactive.title.bg.border.color: #efefef
-window.inactive.label.bg: parentrelative
-window.inactive.label.text.color: #888a85
-
-window.inactive.button.*.bg: parentrelative
-window.inactive.button.*.image.color: #888a85
-window.inactive.button.pressed.bg.color: #d3d7cf
-window.inactive.button.pressed.bg.color: #4f5051
-window.inactive.button.disabled.image.color: #ffffff
-
-window.inactive.handle.bg: raised solid
-window.inactive.handle.bg.color: #E7e7e7
diff --git a/themes/bear2/openbox-3/themerc.xml b/themes/bear2/openbox-3/themerc.xml
new file mode 100644
index 00000000..e1e17223
--- /dev/null
+++ b/themes/bear2/openbox-3/themerc.xml
@@ -0,0 +1,155 @@
+
+
+
+ 4
+
+
+
+
+ 1
+
+
+
+ center
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/orang/openbox-3/themerc b/themes/orang/openbox-3/themerc
deleted file mode 100644
index 0cebbab9..00000000
--- a/themes/orang/openbox-3/themerc
+++ /dev/null
@@ -1,100 +0,0 @@
-!! i be a mess
-
-menu.title.bg: flat solid border
-menu.title.bg.color: #ce5c00
-menu.title.bg.border.color: #fcaf3e
-menu.title.text.color: #ffffff
-
-menu.items.bg: flat solid
-#menu.items.bg.color: #ffffff
-menu.items.bg.color: #d3d7cf
-menu.items.text.color: #000000
-menu.items.disabled.text.color: #737573
-
-menu.items.active.bg: flat solid
-menu.items.active.bg.color: #ce5c00
-menu.items.active.text.color: #ffffff
-
-!! General window settings
-*.justify: left
-
-!! focused window settings
-window.active.client.color: #f7f7f7
-
-window.active.title.bg: flat border solid
-window.active.title.bg.color: #ce5c00
-window.active.title.bg.border.color: #fcaf3e
-
-window.active.handle.bg: flat solid border
-window.active.handle.bg.color: #d3d7cf
-window.active.handle.bg.border.color: #eeeeec
-!window.active.handle.bg.color: #969494
-window.active.grip.bg: parentrelative
-
-window.active.label.bg: parentrelative
-window.active.label.text.color: #ffffff
-
-window.active.button.*.bg: parentrelative
-window.active.button.*.image.color: #ffffff
-
-window.active.button.pressed.bg: flat solid bevel1
-!window.active.button.pressed.bg.color: #888888
-window.active.button.pressed.bg.color: #f57900
-window.active.button.pressed.image.color: #d3d7cf
-
-!#hover
-window.active.button.hover.bg: flat solid
-window.active.button.hover.image.color: #ffffff
-window.active.button.hover.bg.color: #fcaf3e
-
-window.active.button.disabled.bg: flat solid
-window.active.button.disabled.bg.color: #dfb454
-window.active.button.disabled.image.color: #ffffff
-
-
-!! unfocused window settings
-window.inactive.client.color: #f7f7f7
-
-window.inactive.title.bg: flat solid border
-window.inactive.title.bg.color: #d3d7cf
-window.inactive.title.bg.border.color: #dfe3db
-
-window.inactive.handle.bg: flat solid
-window.inactive.handle.bg.color: #d3d7cf
-
-window.inactive.grip.bg: parentrelative
-
-window.inactive.label.bg: parentrelative
-window.inactive.label.text.color: #888a85
-
-window.inactive.button.*.bg: parentrelative
-window.inactive.button.unpressed.image.color: #555555
-
-window.inactive.button.pressed.bg: flat border solid
-window.inactive.button.pressed.bg.color: #aaaaaa
-window.inactive.button.pressed.bg.border.color: #e5e5e5
-
-window.inactive.button.hover.bg: flat solid
-window.inactive.button.hover.bg.color: #e3e3e3
-
-window.inactive.button.disabled.bg:flat solid
-window.inactive.button.disabled.bg.color: #e3e3e3
-
-
-!! Global width settings
-border.Width: 1
-padding.width: 1
-window.handle.width: 3
-window.client.padding.width: 0
-menu.overlap: 2
-
-!! Miscellaneous settings
-border.color: #000000
-
-!! font me!
-window.active.label.text.font: sans:pixelsize=10:bold
-window.inactive.label.text.font: sans:pixelsize=10:bold
-
-menu.title.text.font: sans:pixelsize=10:bold
-menu.items.font: sans:pixelsize=9
-
diff --git a/themes/orang/openbox-3/themerc.xml b/themes/orang/openbox-3/themerc.xml
new file mode 100644
index 00000000..d5333675
--- /dev/null
+++ b/themes/orang/openbox-3/themerc.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+ left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/syscrash/openbox-3/themerc b/themes/syscrash/openbox-3/themerc
deleted file mode 100644
index b1faa671..00000000
--- a/themes/syscrash/openbox-3/themerc
+++ /dev/null
@@ -1,107 +0,0 @@
-!! syscrash's theme, based off nightm4re's flax or something
-
-!!---------------------------------------------------------------------------
-!! Dimensions
-
-border.width: 1
-border.color: #22221c
-
-padding.width: 2
-window.handle.width: 3
-window.client.padding.width: 0
-
-menu.overlap: 0
-
-!!---------------------------------------------------------------------------
-!! Fonts
-
-*.font: sans:pixelsize=11
-window.label.text.justify: left
-
-menu.title.text.justify: left
-
-
-!!---------------------------------------------------------------------------
-!! Menu Settings
-
-menu.title.bg: flat gradient vertical
-menu.title.bg.color: #4c4c4c
-menu.title.bg.colorTo: #707070
-menu.title.text.color: white
-
-menu.items.bg: flat solid
-menu.items.bg.color: #e6e6e0
-menu.items.text.color: #22221c
-
-menu.items.active.bg: flat solid
-menu.items.active.bg.color: #4c4c4c
-menu.items.active.text.color: #ffffff
-
-menu.items.disabled.text.color: #444438
-
-!!---------------------------------------------------------------------------
-!! Window Settings
-
-window.active.padding.width: 10
-window.active.title.bg: flat solid
-window.active.title.bg.color: #9b9b9b
-
-window.active.label.bg: flat gradient vertical border
-window.active.label.bg.color: #4c4c4c
-window.active.label.bg.colorTo: #707070
-window.active.label.text.color: white
-
-window.active.handle.bg: flat solid
-window.active.handle.bg.color: #9b9b9b
-
-window.active.grip.bg: flat solid
-window.active.grip.bg.color: #4c4c4c
-window.active.grip.bg.colorTo: #707070
-window.inactive.title.bg: flat solid
-window.inactive.title.bg.color: #9b9b9b
-
-window.inactive.label.bg: parentrelative
-window.inactive.label.text.color: #4c4c4c
-
-window.inactive.handle.bg: flat solid
-window.inactive.handle.bg.color: #e6e6e0
-
-window.inactive.grip.bg: flat solid
-window.inactive.grip.bg.color: #e6e6e0
-
-!!---------------------------------------------------------------------------
-!! Button Settings
-
-window.active.button.unpressed.bg: flat gradient vertical border
-window.active.button.unpressed.bg.color: #515151
-window.active.button.unpressed.bg.colorTo: #676767
-window.active.button.unpressed.image.color: white
-
-window.active.button.pressed.bg: flat gradient crossdiagonal border
-window.active.button.pressed.bg.color: #d3deda
-window.active.button.pressed.bg.colorTo: #9fbfc1
-
-window.active.button.hover.bg: flat solid border
-window.active.button.hover.bg.color: #e6e6e0
-
-window.active.button.disabled.bg: parentrelative
-window.active.button.disabled.image.color: #9fbfc1
-
-!! without this it looks right
-!!window.active.button.toggled.bg: flat solid
-!!window.active.button.toggled.bg.color: #9fbfc1
-
-window.inactive.button.unpressed.bg: parentrelative
-window.inactive.button.unpressed.image.color: #4c4c4c
-
-window.inactive.button.hover.bg: flat solid border
-window.inactive.button.hover.bg.color: #e6e6e0
-window.inactive.button.pressed.bg: flat gradient crossdiagonal border
-window.inactive.button.pressed.bg.color: #d3deda
-window.inactive.button.pressed.bg.colorTo: #9fbfc1
-
-window.inactive.button.disabled.bg: flat solid
-window.inactive.button.disabled.bg.image.color: #444438
-
-!! window.inactive.button.toggled.bg: flat solid
-!! window.inactive.button.toggled.bg.color: #444438
diff --git a/themes/syscrash/openbox-3/themerc.xml b/themes/syscrash/openbox-3/themerc.xml
new file mode 100644
index 00000000..5048cf06
--- /dev/null
+++ b/themes/syscrash/openbox-3/themerc.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+ left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/themetoxml/themetoxml.c b/tools/themetoxml/themetoxml.c
index fa98a158..56a5f9c7 100644
--- a/tools/themetoxml/themetoxml.c
+++ b/tools/themetoxml/themetoxml.c
@@ -99,8 +99,8 @@ static gboolean read_string(XrmDatabase db, gchar *rname, gchar **value)
static gchar hextodec(gchar h)
{
if (h >= '0' && h <= '9') return h - '0';
- else if (h >= 'a' && h <= 'f') return h - 'a' + 9;
- else if (h >= 'A' && h <= 'F') return h - 'A' + 9;
+ else if (h >= 'a' && h <= 'f') return h - 'a' + 10;
+ else if (h >= 'A' && h <= 'F') return h - 'A' + 10;
return -1;
}
@@ -109,9 +109,33 @@ static gboolean parse_color(gchar *c, gint *r, gint *g, gint *b)
int dig1, dig2, i, color[3];
int len = strlen(c);
- if (c[0] == '#' && (len != 4 && len != 7)) return FALSE;
+ if (len > 4 && c[0] == 'r' && c[1] == 'g' && c[2] == 'b' && c[3] == ':') {
+ c += 4;
+ for (i = 0; i < 3; ++i) {
+ dig1 = hextodec(c[0]);
+ if (c[1] == '/') { dig2 = dig1; c+=2; }
+ else { dig2 = hextodec(c[1]); c+=3; }
- if (c[0] != '#') {
+ if (dig1 < 0 || dig2 < 0) return FALSE;
+
+ color[i] = dig1*16 + dig2;
+ }
+ *r = color[0]; *g = color[1]; *b = color[2];
+ return TRUE;
+ } else if ((len == 4 || len == 7) && c[0] == '#') {
+ c++;
+ for (i = 0; i < 3; ++i) {
+ dig1 = hextodec(c[0]);
+ if (len == 4) { dig2 = dig1; c++; }
+ else { dig2 = hextodec(c[1]); c+=2; }
+
+ if (dig1 < 0 || dig2 < 0) return FALSE;
+
+ color[i] = dig1*16 + dig2;
+ }
+ *r = color[0]; *g = color[1]; *b = color[2];
+ return TRUE;
+ } else {
int i;
for (i = 0; colornames[i].name != NULL; ++i) {
@@ -122,21 +146,8 @@ static gboolean parse_color(gchar *c, gint *r, gint *g, gint *b)
return TRUE;
}
}
- return FALSE;
}
-
- c++;
- for (i = 0; i < 3; ++i, c += (len == 4 ? 1 : 2)) {
- dig2 = hextodec(c[1]);
- if (len == 4) dig1 = dig2;
- else dig1 = hextodec(c[0]);
-
- if (dig1 < 0 || dig2 < 0) return FALSE;
-
- color[i] = dig1*16 + dig2;
- }
- *r = color[0]; *g = color[1]; *b = color[2];
- return TRUE;
+ return FALSE;
}
static gboolean read_color(XrmDatabase db, gchar *rname,
@@ -197,48 +208,35 @@ static xmlNodePtr root;
#define ATTR6(a,b,c,d,e,f,name,cont) (xmlSetProp(GO6(a,b,c,d,e,f), (const xmlChar*)name, (const xmlChar*)cont))
#define ATTR7(a,b,c,d,e,f,g,name,cont) (xmlSetProp(GO7(a,b,c,d,e,f,g), (const xmlChar*)name, (const xmlChar*)cont))
-#define APPCONT1(a,cont) (CONT2("appearance",a,cont))
-#define APPCONT2(a,b,cont) (CONT3("appearance",a,b,cont))
-#define APPCONT3(a,b,c,cont) (CONT4("appearance",a,b,c,cont))
-#define APPCONT4(a,b,c,d,cont) (CONT5("appearance",a,b,c,d,cont))
-#define APPCONT5(a,b,c,d,e,cont) (CONT6("appearance",a,b,c,d,e,cont))
-
-#define APPATTR1(a,name,cont) (ATTR2("appearance",a,name,cont))
-#define APPATTR2(a,b,name,cont) (ATTR3("appearance",a,b,name,cont))
-#define APPATTR3(a,b,c,name,cont) (ATTR4("appearance",a,b,c,name,cont))
-#define APPATTR4(a,b,c,d,name,cont) (ATTR5("appearance",a,b,c,d,name,cont))
-#define APPATTR5(a,b,c,d,e,name,cont) (ATTR6("appearance",a,b,c,d,e,name,cont))
-#define APPATTR6(a,b,c,d,e,f,name,cont) (ATTR7("appearance",a,b,c,d,e,f,name,cont))
-
-#define COLOR1(a,R,G,B,A) (APPATTR1(a,"r",NUM(R)), \
- APPATTR1(a,"g",NUM(G)), \
- APPATTR1(a,"b",NUM(B)), \
- APPATTR1(a,"a",NUM(A)))
-#define COLOR2(a,b,R,G,B,A) (APPATTR2(a,b,"r",NUM(R)), \
- APPATTR2(a,b,"g",NUM(G)), \
- APPATTR2(a,b,"b",NUM(B)), \
- APPATTR2(a,b,"a",NUM(A)))
-#define COLOR3(a,b,c,R,G,B,A) (APPATTR3(a,b,c,"r",NUM(R)), \
- APPATTR3(a,b,c,"g",NUM(G)), \
- APPATTR3(a,b,c,"b",NUM(B)), \
- APPATTR3(a,b,c,"a",NUM(A)))
-#define COLOR4(a,b,c,d,R,G,B,A) (APPATTR4(a,b,c,d,"r",NUM(R)), \
- APPATTR4(a,b,c,d,"g",NUM(G)), \
- APPATTR4(a,b,c,d,"b",NUM(B)), \
- APPATTR4(a,b,c,d,"a",NUM(A)))
-#define COLOR5(a,b,c,d,e,R,G,B,A) (APPATTR5(a,b,c,d,e,"r",NUM(R)), \
- APPATTR5(a,b,c,d,e,"g",NUM(G)), \
- APPATTR5(a,b,c,d,e,"b",NUM(B)), \
- APPATTR5(a,b,c,d,e,"a",NUM(A)))
-#define COLOR6(a,b,c,d,e,f,R,G,B,A) (APPATTR6(a,b,c,d,e,f,"r",NUM(R)), \
- APPATTR6(a,b,c,d,e,f,"g",NUM(G)), \
- APPATTR6(a,b,c,d,e,f,"b",NUM(B)), \
- APPATTR6(a,b,c,d,e,f,"a",NUM(A)))
+#define COLOR1(a,R,G,B,A) (ATTR1(a,"r",NUM(R)), \
+ ATTR1(a,"g",NUM(G)), \
+ ATTR1(a,"b",NUM(B)), \
+ ATTR1(a,"a",NUM(A)))
+#define COLOR2(a,b,R,G,B,A) (ATTR2(a,b,"r",NUM(R)), \
+ ATTR2(a,b,"g",NUM(G)), \
+ ATTR2(a,b,"b",NUM(B)), \
+ ATTR2(a,b,"a",NUM(A)))
+#define COLOR3(a,b,c,R,G,B,A) (ATTR3(a,b,c,"r",NUM(R)), \
+ ATTR3(a,b,c,"g",NUM(G)), \
+ ATTR3(a,b,c,"b",NUM(B)), \
+ ATTR3(a,b,c,"a",NUM(A)))
+#define COLOR4(a,b,c,d,R,G,B,A) (ATTR4(a,b,c,d,"r",NUM(R)), \
+ ATTR4(a,b,c,d,"g",NUM(G)), \
+ ATTR4(a,b,c,d,"b",NUM(B)), \
+ ATTR4(a,b,c,d,"a",NUM(A)))
+#define COLOR5(a,b,c,d,e,R,G,B,A) (ATTR5(a,b,c,d,e,"r",NUM(R)), \
+ ATTR5(a,b,c,d,e,"g",NUM(G)), \
+ ATTR5(a,b,c,d,e,"b",NUM(B)), \
+ ATTR5(a,b,c,d,e,"a",NUM(A)))
+#define COLOR6(a,b,c,d,e,f,R,G,B,A) (ATTR6(a,b,c,d,e,f,"r",NUM(R)), \
+ ATTR6(a,b,c,d,e,f,"g",NUM(G)), \
+ ATTR6(a,b,c,d,e,f,"b",NUM(B)), \
+ ATTR6(a,b,c,d,e,f,"a",NUM(A)))
#define APPEARANCE2(res,a,b) \
{ \
if (read_string(db, res, &s)) \
- APPCONT3(a, b, "style", s); \
+ CONT3(a, b, "style", s); \
if (read_color(db, res".color", &i, &j, &k)) \
COLOR3(a, b, "primary", i, j, k, 255); \
if (read_color(db, res".colorTo", &i, &j, &k)) \
@@ -252,7 +250,7 @@ static xmlNodePtr root;
#define APPEARANCE3(res,a,b,c) \
{ \
if (read_string(db, res, &s)) \
- APPCONT4(a, b, c, "style", s); \
+ CONT4(a, b, c, "style", s); \
if (read_color(db, res".color", &i, &j, &k)) \
COLOR4(a, b, c, "primary", i, j, k, 255); \
if (read_color(db, res".colorTo", &i, &j, &k)) \
@@ -266,7 +264,7 @@ static xmlNodePtr root;
#define APPEARANCE4(res,a,b,c,d) \
{ \
if (read_string(db, res, &s)) \
- APPCONT5(a, b, c, d, "style", s); \
+ CONT5(a, b, c, d, "style", s); \
if (read_color(db, res".color", &i, &j, &k)) \
COLOR5(a, b, c, d, "primary", i, j, k, 255); \
if (read_color(db, res".colorTo", &i, &j, &k)) \
@@ -284,19 +282,40 @@ int main(int argc, char **argv)
gchar *s;
int ret = 0;
- if (argc < 2) {
- printf("Please specify an Openbox3 themerc file\n");
- return 1;
+ if (argc > 1) {
+ fprintf(stderr, "themetoxml (C) 2007 Dana Jansens\n"
+ "This tool takes an older Openbox3 themerc file on stdin,"
+ " and gives back the\n"
+ "theme in the newer themerc.xml XML style.\n");
+ return 0;
}
+ {
+ gchar *buf = g_new(gchar, 1000);
+ gint sz = 1000;
+ gint r = 0, rthis;
- if ((db = XrmGetFileDatabase(argv[1])) == NULL) {
- printf("Unable to open the database from stdin\n");
- return 1;
+ while ((rthis = read(0, buf + r, sz - r)) > 0) {
+ r+=rthis;
+ if (r==sz) {
+ sz+=1000;
+ buf = g_renew(gchar,buf,sz);
+ }
+ }
+
+
+ if ((db = XrmGetStringDatabase(buf)) == NULL) {
+ fprintf(stderr, "Unable to read the database from stdin\n");
+ return 1;
+ }
+ g_free(buf);
}
doc = xmlNewDoc((const xmlChar*) "1.0");
xmlDocSetRootElement
(doc,(root = xmlNewNode(NULL, (const xmlChar*)"openbox_theme")));
+ xmlSetProp(root, (const xmlChar*)"version", (const xmlChar*)"1");
+ xmlSetProp(root, (const xmlChar*)"xmlns",
+ (const xmlChar*)"http://openbox.org/themerc");
if (read_int(db, "window.handle.width", &i))
CONT2("dimensions", "handle", NUM(i));
@@ -306,9 +325,12 @@ int main(int argc, char **argv)
ATTR2("dimensions", "padding", "vertical", NUM(i));
}
- if (read_int(db, "border.width", &i)) {
- APPCONT3("window", "border", "width", NUM(i));
- APPCONT3("menu", "border", "width", NUM(i));
+ if (read_int(db, "borderWidth", &i)) {
+ CONT3("window", "border", "width", NUM(i));
+ CONT3("menu", "border", "width", NUM(i));
+ } else if (read_int(db, "border.width", &i)) {
+ CONT3("window", "border", "width", NUM(i));
+ CONT3("menu", "border", "width", NUM(i));
}
if (read_color(db, "border.color", &i, &j, &k)) {
@@ -316,31 +338,33 @@ int main(int argc, char **argv)
COLOR3("menu", "border", "primary", i, j, k, 255);
}
- if (read_int(db, "window.client.padding.width", &i))
- APPCONT3("window", "clientborder", "width", NUM(i));
+ if (read_int(db, "window.client.padding.width", &i)) {
+ ATTR2("window", "clientpadding", "horizontal", NUM(i));
+ ATTR2("window", "clientpadding", "vertical", NUM(i));
+ }
if (read_string(db, "window.label.text.justify", &s)) {
if (!g_ascii_strcasecmp(s, "right")) s = "right";
else if (!g_ascii_strcasecmp(s, "center")) s = "center";
else s = "left";
- APPCONT5("window", "inactive", "label", "text", "justify", s);
+ CONT2("window", "justify", s);
}
if (read_string(db, "menu.title.text.justify", &s)) {
if (!g_ascii_strcasecmp(s, "right")) s = "right";
else if (!g_ascii_strcasecmp(s, "center")) s = "center";
else s = "left";
- APPCONT4("menu", "title", "text", "justify", s);
+ CONT2("menu", "justify", s);
}
if (read_int(db, "menu.overlap", &i))
- APPCONT2("menu", "overlap", NUM(i));
+ CONT2("menu", "overlap", NUM(i));
if (read_color(db, "window.active.client.color", &i, &j, &k))
- COLOR4("window","active","clientborder","primary",i,j,k,255);
+ COLOR3("window","active","clientpadding",i,j,k,255);
if (read_color(db, "window.inactive.client.color", &i, &j, &k))
- COLOR4("window","inactive","clientborder","primary",i,j,k,255);
+ COLOR3("window","inactive","clientpadding",i,j,k,255);
if (read_color(db, "window.active.label.text.color", &i, &j, &k))
COLOR5("window","active","label","text","primary",i,j,k,255);
@@ -394,7 +418,7 @@ int main(int argc, char **argv)
if (read_color(db, "menu.items.text.color",
&i, &j, &k))
- COLOR4("menu","inactive","text","primary",i,j,k,255);
+ COLOR3("menu","inactive","primary",i,j,k,255);
if (read_color(db, "menu.items.disabled.text.color",
&i, &j, &k))
@@ -412,7 +436,7 @@ int main(int argc, char **argv)
APPEARANCE3("window.inactive.handle.bg", "window", "inactive", "handle");
APPEARANCE3("window.active.grip.bg", "window", "active", "grip");
APPEARANCE3("window.inactive.grip.bg", "window", "inactive", "grip");
- APPEARANCE2("menu.items.bg", "menu", "inactive");
+ APPEARANCE2("menu.items.bg", "menu", "entries");
APPEARANCE2("menu.items.active.bg", "menu", "active");
APPEARANCE2("menu.title.bg", "menu", "title");
@@ -444,9 +468,9 @@ int main(int argc, char **argv)
i = parse_inline_number(p + strlen("shadowoffset="));
else
i = 1;
- APPATTR6("window","active","label","text","shadow","offset",
+ ATTR6("window","active","label","text","shadow","offset",
"x",NUM(i));
- APPATTR6("window","active","label","text","shadow","offset",
+ ATTR6("window","active","label","text","shadow","offset",
"y",NUM(i));
}
if ((p = strstr(s, "shadowtint=")))
@@ -466,9 +490,9 @@ int main(int argc, char **argv)
i = parse_inline_number(p + strlen("shadowoffset="));
else
i = 1;
- APPATTR6("window","inactive","label","text","shadow","offset",
+ ATTR6("window","inactive","label","text","shadow","offset",
"x",NUM(i));
- APPATTR6("window","inactive","label","text","shadow","offset",
+ ATTR6("window","inactive","label","text","shadow","offset",
"y",NUM(i));
}
if ((p = strstr(s, "shadowtint=")))
@@ -488,8 +512,8 @@ int main(int argc, char **argv)
i = parse_inline_number(p + strlen("shadowoffset="));
else
i = 1;
- APPATTR5("menu","title","text","shadow","offset","x",NUM(i));
- APPATTR5("menu","title","text","shadow","offset","y",NUM(i));
+ ATTR5("menu","title","text","shadow","offset","x",NUM(i));
+ ATTR5("menu","title","text","shadow","offset","y",NUM(i));
}
if ((p = strstr(s, "shadowtint=")))
{
@@ -507,26 +531,26 @@ int main(int argc, char **argv)
i = parse_inline_number(p + strlen("shadowoffset="));
else
i = 1;
- APPATTR5("menu","inactive","text","shadow","offset","x",NUM(i));
- APPATTR5("menu","inactive","text","shadow","offset","y",NUM(i));
- APPATTR5("menu","active","text","shadow","offset","x",NUM(i));
- APPATTR5("menu","active","text","shadow","offset","y",NUM(i));
- APPATTR5("menu","disabled","text","shadow","offset","x",NUM(i));
- APPATTR5("menu","disabled","text","shadow","offset","y",NUM(i));
+ ATTR4("menu","inactive","shadow","offset","x",NUM(i));
+ ATTR4("menu","inactive","shadow","offset","y",NUM(i));
+ ATTR5("menu","active","text","shadow","offset","x",NUM(i));
+ ATTR5("menu","active","text","shadow","offset","y",NUM(i));
+ ATTR4("menu","disabled","shadow","offset","x",NUM(i));
+ ATTR4("menu","disabled","shadow","offset","y",NUM(i));
}
if ((p = strstr(s, "shadowtint=")))
{
i = parse_inline_number(p + strlen("shadowtint="));
j = (i > 0 ? 0 : 255);
i = ABS(i);
- COLOR5("menu","inactive","text","shadow","primary",j,j,j,i);
+ COLOR4("menu","inactive","shadow","primary",j,j,j,i);
COLOR5("menu","active","text","shadow","primary",j,j,j,i);
- COLOR5("menu","disabled","text","shadow","primary",j,j,j,i);
+ COLOR4("menu","disabled","shadow","primary",j,j,j,i);
}
}
if (xmlSaveFormatFile("-", doc, 1) < 0) {
- printf("Error writing the xml tree\n");
+ fprintf(stderr, "Error writing the xml tree\n");
ret = 1;
}