#include <glib.h>
#include "obtheme.h"
+struct obthemedata themedata;
+struct boundrect {
+ double x1, y1;
+ double x2, y2;
+};
+
double variable_lookup(struct variable *in)
{
+ if (strcmp("client", in->base) == 0) {
+ if (strcmp("width", in->member) == 0) {
+ return 640;
+ } else
+ return 480;
+ }
+ if (strcmp("font", in->base) == 0) {
+ return 15.0;
+ }
return 0.0;
}
double expression_eval(struct expression *in)
{
switch (in->op) {
+ case OB_THEME_INV:
+ return - expression_eval(in->a);
+ break;
case OB_THEME_MUL:
return expression_eval(in->a) * expression_eval(in->b);
break;
printf(" opacity = %f\n", mat->opacity);
}
+static void decor_render(gpointer data, gpointer user_data)
+{
+ struct decor *decor = data;
+ struct box *box = &decor->geometry.box;
+ struct vector *a = &decor->space.anchor;
+ double x, y;
+
+ printf("%s:", decor->name);
+ x = expression_eval(&a->x);
+ y = expression_eval(&a->y);
+ printf("rectangle(%f %f) - (%f %f)\n", x + expression_eval(&box->start.x), y + expression_eval(&box->start.y),
+ x + expression_eval(&box->end.x), y + expression_eval(&box->end.y));
+ if (decor->children)
+ g_slist_foreach(decor->children, decor_render, NULL);
+}
+
+static void decor_bound(gpointer data, gpointer user_data)
+{
+ struct boundrect *br = user_data;
+ struct decor *decor = data;
+ struct box *box = &decor->geometry.box;
+ struct vector *a = &decor->space.anchor;
+ double x1, y1, x2, y2;
+ x1 = expression_eval(&a->x);
+ y1 = expression_eval(&a->y);
+ x2 = x1;
+ y2 = y1;
+ x1 += expression_eval(&box->start.x);
+ y1 += expression_eval(&box->start.y);
+ x2 += expression_eval(&box->end.x);
+ y2 += expression_eval(&box->end.y);
+ if (x1 < br->x1)
+ br->x1 = x1;
+ if (x2 < br->x1)
+ br->x1 = x2;
+ if (x1 > br->x2)
+ br->x2 = x1;
+ if (x2 > br->x2)
+ br->x2 = x2;
+
+ if (y1 < br->y1)
+ br->y1 = y1;
+ if (y2 < br->y1)
+ br->y1 = y2;
+ if (y1 > br->y2)
+ br->y2 = y1;
+ if (y2 > br->y2)
+ br->y2 = y2;
+printf("%f %f %f %f\n", br->x1, br->y1, br->x2, br->y2);
+ if (decor->children)
+ g_slist_foreach(decor->children, decor_bound, br);
+}
+
+void bound(struct theme *thm, char *name, struct boundrect *br)
+{
+ struct style *sty;
+
+ br->x1 = 0.0;
+ br->y1 = 0.0;
+ br->x2 = 0.0;
+ br->y2 = 0.0;
+ sty = g_hash_table_lookup(thm->styles, name);
+ assert(sty);
+ g_slist_foreach(sty->tree, decor_bound, br);
+}
+
+void draw(struct theme *thm, char *name)
+{
+ struct style *sty;
+ sty = g_hash_table_lookup(thm->styles, name);
+ g_slist_foreach(sty->tree, decor_render, NULL);
+}
+
int main(int argc, char **argv)
{
int err;
- struct obthemedata themedata;
-
+ struct theme *thm;
+ struct boundrect br;
themedata.themes = g_hash_table_new(g_str_hash, g_str_equal);
themedata.materials = g_hash_table_new(g_str_hash, g_str_equal);
err = obtheme_parse(&themedata, argv[1]);
+ if (err) {
+ printf("Fix the script\n");
+ exit(1);
+ }
printf("err = %d\n", err);
- g_hash_table_foreach(themedata.materials, material_print, NULL);
+// g_hash_table_foreach(themedata.materials, material_print, NULL);
+
+// g_hash_table_foreach(themedata.themes, theme_print, NULL);
- g_hash_table_foreach(themedata.themes, theme_print, NULL);
+ thm = g_hash_table_lookup(themedata.themes, "awesome");
+ draw(thm, "regular_window");
+ bound(thm, "regular_window", &br);
+ printf("bounding rectangle: (%f %f) - (%f %f)\n", br.x1, br.y1, br.x2, br.y2);
return 0;
}