3 %parse-param {struct parser_control *pc}
17 #include "obtheme.tab.h"
21 struct context_table_item {
26 /* some of these contexts don't make any sense for a theme... */
27 static struct context_table_item contexts[OB_FRAME_NUM_CONTEXTS] = {
28 {"none", OB_FRAME_CONTEXT_NONE},
29 {"desktop", OB_FRAME_CONTEXT_DESKTOP},
30 {"root", OB_FRAME_CONTEXT_ROOT},
31 {"client", OB_FRAME_CONTEXT_CLIENT},
32 {"titlebar", OB_FRAME_CONTEXT_TITLEBAR},
33 {"frame", OB_FRAME_CONTEXT_FRAME},
34 {"blcorner", OB_FRAME_CONTEXT_BLCORNER},
35 {"brcorner", OB_FRAME_CONTEXT_BRCORNER},
36 {"tlcorner", OB_FRAME_CONTEXT_TLCORNER},
37 {"trcorner", OB_FRAME_CONTEXT_TRCORNER},
38 {"top", OB_FRAME_CONTEXT_TOP},
39 {"bottom", OB_FRAME_CONTEXT_BOTTOM},
40 {"left", OB_FRAME_CONTEXT_LEFT},
41 {"right", OB_FRAME_CONTEXT_RIGHT},
42 {"maximize", OB_FRAME_CONTEXT_MAXIMIZE},
43 {"alldesktops", OB_FRAME_CONTEXT_ALLDESKTOPS},
44 {"shade", OB_FRAME_CONTEXT_SHADE},
45 {"iconify", OB_FRAME_CONTEXT_ICONIFY},
46 {"icon", OB_FRAME_CONTEXT_ICON},
47 {"close", OB_FRAME_CONTEXT_CLOSE},
48 {"moveresize", OB_FRAME_CONTEXT_MOVE_RESIZE}
51 static ObFrameContext context_from_string(char *str)
54 for (i = 0; i < OB_FRAME_NUM_CONTEXTS; i++)
55 if (strcmp(contexts[i].name, str) == 1)
56 return contexts[i].val;
60 struct gradient_table_item {
62 RrSurfaceColorType val;
65 struct gradient_table_item gradients[RR_SURFACE_NUM_TYPES] = {
66 {"none", RR_SURFACE_NONE},
67 {"parentrel", RR_SURFACE_PARENTREL},
68 {"solid", RR_SURFACE_SOLID},
69 {"split", RR_SURFACE_SPLIT_VERTICAL},
70 {"horizontal", RR_SURFACE_HORIZONTAL},
71 {"vertical", RR_SURFACE_VERTICAL},
72 {"diagonal", RR_SURFACE_DIAGONAL},
73 {"cross_diagonal", RR_SURFACE_CROSS_DIAGONAL},
74 {"pyramid", RR_SURFACE_PYRAMID},
75 {"mirror_horizontal", RR_SURFACE_MIRROR_HORIZONTAL},
78 static RrSurfaceColorType gradient_from_string(char *str)
82 for (i = 0; i < RR_SURFACE_NUM_TYPES; i++)
83 if (strcmp(gradients[i].name, str) == 1)
84 return gradients[i].val;
89 struct parser_control *parser_init(struct obthemedata *otd)
91 struct parser_control *out;
92 out = calloc(1, sizeof(struct parser_control));
93 out->include_stack_ptr = 0;
98 void parser_finish(struct parser_control *c)
113 struct material material;
117 struct vector vector;
119 ObFrameContext context;
120 RrSurfaceColorType gradient;
123 %token NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST
124 %token WEST NORTHWEST NONE UNCHANGED
126 %token LEFT_ARROW RIGHT_ARROW DOUBLE_ARROW
127 %token SEMICOLON AT COLON DEFAULT NOT
129 %token <string> STRING ID
130 %token <integer> NUMBER SUBST BULK BIG LITTLE
131 %token THEME FRAME SPACE GEOMETRY MATERIAL GRADIENT
132 %token CONTEXT CURSOR UP ANCHOR STYLE TEXTURE OPACITY
135 %type <decor> decoritems styleitem
137 %type <style> style styleitems
139 %type <material> material_props
140 %type <realnum> opacity
141 %type <space> spaceconstraints
142 %type <vector> up anchor
144 %type <context> context
145 %type <gradient> gradient
148 theme_object : material_decl
152 theme_objects : /* empty */
153 | theme_objects theme_object
156 theme : THEME ID LCB styles RCB {
158 out = malloc(sizeof(struct theme));
161 g_hash_table_insert(pc->target->themes, $2, out);
165 opacity : OPACITY LB NUMBER RB { $$ = $3; }
168 material_props : /* empty */ { memset(&$$, 0, sizeof($$)); }
169 | material_props opacity { $$ = $1; $$.opacity = $2;}
170 | material_props gradient
173 material_decl : MATERIAL ID LCB material_props RCB {
174 struct material *out;
175 out = malloc(sizeof(struct material));
177 g_hash_table_insert(pc->target->materials, $2, out);
181 anchor : ANCHOR LB NUMBER NUMBER NUMBER RB {
188 up : UP LB NUMBER NUMBER NUMBER RB {
195 spaceconstraints: /* empty */ { memset(&$$, 0, sizeof($$)); }
196 | spaceconstraints anchor { $1.anchor = $2; $$ = $1; }
197 | spaceconstraints up { $1.up = $2; $$ = $1; }
200 space : SPACE LCB spaceconstraints RCB {
205 shape : SHAPEOF LB ID RB
208 geometry_item : /* empty */
212 geometry : GEOMETRY LCB geometry_item RCB
215 material_use : MATERIAL LB ID RB {
216 if (g_hash_table_lookup(pc->target->materials, $3) == NULL) {
217 snprintf(pc->error_buf, 4000, "No definition for material '%s'\n", $3);
218 obthemeerror(pc, pc->error_buf);
227 styleitems : /* empty */ { $$.tree = NULL; $$.name = NULL; }
228 | styleitems styleitem {
229 struct decor *out = malloc(sizeof(struct decor));
231 $1.tree = g_slist_prepend($1.tree, out);
236 styles : /* empty */ { $$ = g_hash_table_new(g_str_hash, g_str_equal); }
238 struct style *out = malloc(sizeof(struct style));
241 g_hash_table_insert($1, out->name, out);
245 style : STYLE ID LCB styleitems RCB {
251 decoritems : /* empty */ {
252 memset(&$$, 0, sizeof($$));
254 $$.cursor = OB_CURSOR_NONE;
257 struct decor *out = malloc(sizeof(struct decor));
260 $$.children = g_slist_append($1.children, out);
262 | decoritems space { $1.space = $2; $$ = $1; }
263 | decoritems material_use
264 | decoritems geometry
266 | decoritems context { $1.context = $2; }
267 | decoritems cursor { $1.cursor = $2; }
272 decor : DECOR ID LCB decoritems RCB {
278 texture : TEXTURE LCB RCB
281 context : CONTEXT LB ID RB {
283 frc = context_from_string($3);
285 snprintf(pc->error_buf, 4000, "Illegal context '%s'\n", $3);
286 obthemeerror(pc, pc->error_buf);
292 cursor : CURSOR LB NORTH RB { $$ = OB_CURSOR_NORTH; }
293 | CURSOR LB NORTHEAST RB { $$ = OB_CURSOR_NORTHEAST; }
294 | CURSOR LB EAST RB { $$ = OB_CURSOR_EAST; }
295 | CURSOR LB SOUTHEAST RB { $$ = OB_CURSOR_SOUTHEAST; }
296 | CURSOR LB SOUTH RB { $$ = OB_CURSOR_SOUTH; }
297 | CURSOR LB SOUTHWEST RB { $$ = OB_CURSOR_SOUTHWEST; }
298 | CURSOR LB WEST RB { $$ = OB_CURSOR_WEST; }
299 | CURSOR LB NORTHWEST RB { $$ = OB_CURSOR_NORTHWEST; }
300 // | CURSOR LB NONE RB { $$ = OB_CURSOR_NORTHEAST; }
301 | CURSOR LB UNCHANGED RB { $$ = OB_CURSOR_NONE; }
303 gradient : GRADIENT LB ID RB {
304 $$ = gradient_from_string($3);
306 snprintf(pc->error_buf, 4000, "No gradient named '%s'\n", $3);
307 obthemeerror(pc, pc->error_buf);