From f2999e685d1f5a8c7ab0b5d5c2e5682709a62737 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Thu, 20 May 2010 16:02:19 -0400 Subject: [PATCH] calculate bounding box dimensions skeleton of render function test theme tweaks --- main.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++-- obtheme.h | 1 + obtheme.y | 23 +++++++---- theme.obtheme | 11 ++++- 4 files changed, 131 insertions(+), 12 deletions(-) diff --git a/main.c b/main.c index 8e7cbb9..3846dd8 100644 --- a/main.c +++ b/main.c @@ -4,14 +4,32 @@ #include #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; @@ -78,19 +96,101 @@ static void material_print(gpointer key, gpointer value, gpointer user_data) 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; } diff --git a/obtheme.h b/obtheme.h index 1c15dd1..c9aaa51 100644 --- a/obtheme.h +++ b/obtheme.h @@ -17,6 +17,7 @@ extern int themedebug; typedef enum { + OB_THEME_INV, OB_THEME_ADD, OB_THEME_SUB, OB_THEME_MUL, diff --git a/obtheme.y b/obtheme.y index 80331e7..e4e07dc 100644 --- a/obtheme.y +++ b/obtheme.y @@ -217,17 +217,17 @@ up : UP LB expression COMMA expression COMMA expression RB { spaceconstraints: /* empty */ { memset(&$$, 0, sizeof($$)); $$.anchor.x.op = OB_THEME_EQL; - $$.anchor.x.v.number = 1; + $$.anchor.x.v.number = 0; $$.anchor.y.op = OB_THEME_EQL; - $$.anchor.y.v.number = 1; + $$.anchor.y.v.number = 0; $$.anchor.z.op = OB_THEME_EQL; - $$.anchor.z.v.number = 1; + $$.anchor.z.v.number = 0; $$.up.x.op = OB_THEME_EQL; - $$.up.x.v.number = 1; + $$.up.x.v.number = 0; $$.up.y.op = OB_THEME_EQL; $$.up.y.v.number = 1; $$.up.z.op = OB_THEME_EQL; - $$.up.z.v.number = 1; + $$.up.z.v.number = 0; } | spaceconstraints anchor { $1.anchor = $2; $$ = $1; } | spaceconstraints up { $1.up = $2; $$ = $1; } @@ -243,7 +243,12 @@ shape : SHAPEOF LB ID RB box : BOX LB expression COMMA expression COMMA expression RB TO LB expression COMMA expression COMMA expression RB { - + $$.start.x = $3; + $$.start.y = $5; + $$.start.z = $7; + $$.end.x = $11; + $$.end.y = $13; + $$.end.z = $15; } ; @@ -390,7 +395,11 @@ variable : ID DOT ID { $$.base = $1; $$.member = $3; } | NUMBER { $$.base = NULL; $$.number = $1; } ; -expression : expression STAR expression { +expression : MINUS expression { + $$.op = OB_THEME_INV; + $$.a = exdup($2); + } + | expression STAR expression { $$.op = OB_THEME_MUL; $$.a = exdup($1); $$.b = exdup($3); diff --git a/theme.obtheme b/theme.obtheme index e4a3af1..6946cec 100644 --- a/theme.obtheme +++ b/theme.obtheme @@ -19,7 +19,7 @@ theme awesome { decor clientwindow { space { anchor(0, 0, 0) - up(0, 0, 0) + up(0, 1, 0) } geometry { // shapeof(client) @@ -32,6 +32,9 @@ theme awesome { decor titlebar { context(titlebar) + space { + anchor(0, -font.height + 5, 0) + } geometry { box (0, 0, 0) to (client.width, font.height + 5, 0) } @@ -45,6 +48,9 @@ theme awesome { } } decor minbutton { + space { + anchor(client.width - 20, -10, 0) + } geometry { box (0, 0, 0) to (10, 10, 0) } @@ -52,6 +58,9 @@ theme awesome { context(minimize) } decor maxbutton { + space { + anchor(client.width - 40, -10, 0) + } geometry { box (0, 0, 0) to (10, 10, 0) } -- 2.34.1