calculate bounding box dimensions
authorDerek Foreman <foremande@gmail.com>
Thu, 20 May 2010 20:02:19 +0000 (16:02 -0400)
committerDerek Foreman <foremande@gmail.com>
Thu, 20 May 2010 20:02:19 +0000 (16:02 -0400)
skeleton of render function
test theme tweaks

main.c
obtheme.h
obtheme.y
theme.obtheme

diff --git a/main.c b/main.c
index 8e7cbb9..3846dd8 100644 (file)
--- a/main.c
+++ b/main.c
@@ -4,14 +4,32 @@
 #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;
@@ -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;
 }
index 1c15dd1..c9aaa51 100644 (file)
--- 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,
index 80331e7..e4e07dc 100644 (file)
--- 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);
index e4a3af1..6946cec 100644 (file)
@@ -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)
                                        }