8 static double variable_lookup(struct variable *in)
10 if (strcmp("client", in->base) == 0) {
11 if (strcmp("width", in->member) == 0) {
16 if (strcmp("font", in->base) == 0) {
22 static double expression_eval(struct expression *in)
26 return - expression_eval(in->a);
29 return expression_eval(in->a) * expression_eval(in->b);
32 return expression_eval(in->a) / expression_eval(in->b);
35 return expression_eval(in->a) + expression_eval(in->b);
38 return expression_eval(in->a) - expression_eval(in->b);
41 if (in->v.base == NULL) {
43 } else return variable_lookup(&in->v);
46 assert(!!!"OH NOES!!!");
51 static void decor_print(gpointer data, gpointer user_data)
53 struct decor *decor = data;
54 printf(" decor id %s\n", decor->name);
55 printf(" anchor.x = %f\n", expression_eval(&decor->space.anchor.x));
56 if (decor->texture.present) {
57 if (decor->texture.internal)
58 printf(" texture internal: %s\n", decor->texture.name);
60 printf(" texture file: %s\n", decor->texture.name);
62 // printf(" anchor (%d %d %d)\n", decor->space.anchor.x, decor->space.anchor.y, decor->space.anchor.z);
63 // printf(" up (%d %d %d)\n", decor->space.up.x, decor->space.up.y, decor->space.up.z);
65 g_slist_foreach(decor->children, decor_print, NULL);
68 static void style_print(gpointer key, gpointer value, gpointer user_data)
70 char *stylename = key;
71 struct style *style = value;
73 printf(" style %s\n", stylename);
74 g_slist_foreach(style->tree, decor_print, NULL);
77 static void theme_print(gpointer key, gpointer value, gpointer user_data)
80 struct theme *thm = value;
81 printf("name = %s\n", name);
82 g_hash_table_foreach(thm->styles, style_print, NULL);
85 static void material_print(gpointer key, gpointer value, gpointer user_data)
88 struct material *mat = value;
89 printf("name = %s\n", name);
90 printf(" opacity = %f\n", mat->opacity);
93 static void decor_render(gpointer data, gpointer user_data)
95 struct decor *decor = data;
96 struct box *box = &decor->geometry.box;
97 struct vector *a = &decor->space.anchor;
100 printf("%s:", decor->name);
101 x = expression_eval(&a->x);
102 y = expression_eval(&a->y);
103 printf("rectangle(%f %f) - (%f %f)\n", x + expression_eval(&box->start.x), y + expression_eval(&box->start.y),
104 x + expression_eval(&box->end.x), y + expression_eval(&box->end.y));
106 g_slist_foreach(decor->children, decor_render, NULL);
114 static void decor_bound(gpointer data, gpointer user_data)
116 struct boundstuff *bs = user_data;
117 struct decor *decor = data;
118 struct box *box = &decor->geometry.box;
119 struct vector *a = &decor->space.anchor;
120 Rect newrect, temprect;
121 double x1, y1, x2, y2;
123 x1 = expression_eval(&a->x);
124 y1 = expression_eval(&a->y);
127 x1 += expression_eval(&box->start.x);
128 y1 += expression_eval(&box->start.y);
129 x2 += expression_eval(&box->end.x);
130 y2 += expression_eval(&box->end.y);
131 RECT_SET(temprect, x1, y1, x2-x1, y2-y2);
132 RECT_ADD(newrect, temprect, bs->r);
136 g_slist_foreach(decor->children, decor_bound, bs);
139 void obtheme_calc_bound(struct theme *thm, char *name, Rect *r, Strut *s)
142 struct boundstuff bs;
144 RECT_SET(bs.r, 0, 0 ,0 ,0);
145 sty = g_hash_table_lookup(thm->styles, name);
147 g_slist_foreach(sty->tree, decor_bound, &bs);
151 void obtheme_decorate_window(struct theme *thm, char *name)
154 sty = g_hash_table_lookup(thm->styles, name);
155 g_slist_foreach(sty->tree, decor_render, NULL);