3 %parse-param {struct parser_control *pc}
16 #include "obtheme.tab.h"
20 struct context_table_item {
25 /* some of these contexts don't make any sense for a theme... */
26 static struct context_table_item contexts[OB_FRAME_NUM_CONTEXTS] = {
27 {"none", OB_FRAME_CONTEXT_NONE},
28 {"desktop", OB_FRAME_CONTEXT_DESKTOP},
29 {"root", OB_FRAME_CONTEXT_ROOT},
30 {"client", OB_FRAME_CONTEXT_CLIENT},
31 {"titlebar", OB_FRAME_CONTEXT_TITLEBAR},
32 {"frame", OB_FRAME_CONTEXT_FRAME},
33 {"blcorner", OB_FRAME_CONTEXT_BLCORNER},
34 {"brcorner", OB_FRAME_CONTEXT_BRCORNER},
35 {"tlcorner", OB_FRAME_CONTEXT_TLCORNER},
36 {"trcorner", OB_FRAME_CONTEXT_TRCORNER},
37 {"top", OB_FRAME_CONTEXT_TOP},
38 {"bottom", OB_FRAME_CONTEXT_BOTTOM},
39 {"left", OB_FRAME_CONTEXT_LEFT},
40 {"right", OB_FRAME_CONTEXT_RIGHT},
41 {"maximize", OB_FRAME_CONTEXT_MAXIMIZE},
42 {"alldesktops", OB_FRAME_CONTEXT_ALLDESKTOPS},
43 {"shade", OB_FRAME_CONTEXT_SHADE},
44 {"iconify", OB_FRAME_CONTEXT_ICONIFY},
45 {"icon", OB_FRAME_CONTEXT_ICON},
46 {"close", OB_FRAME_CONTEXT_CLOSE},
47 {"moveresize", OB_FRAME_CONTEXT_MOVE_RESIZE}
50 static ObFrameContext context_from_string(char *str)
53 for (i = 0; i < OB_FRAME_NUM_CONTEXTS; i++)
54 if (strcmp(contexts[i].name, str) == 1)
55 return contexts[i].val;
59 struct parser_control *parser_init(struct obthemedata *otd)
61 struct parser_control *out;
62 out = calloc(1, sizeof(struct parser_control));
63 out->include_stack_ptr = 0;
68 void parser_finish(struct parser_control *c)
83 struct material material;
89 ObFrameContext context;
92 %token NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST
93 %token WEST NORTHWEST NONE UNCHANGED
95 %token LEFT_ARROW RIGHT_ARROW DOUBLE_ARROW
96 %token SEMICOLON AT COLON DEFAULT NOT
98 %token <string> STRING ID
99 %token <integer> NUMBER SUBST BULK BIG LITTLE
100 %token THEME FRAME SPACE GEOMETRY MATERIAL GRADIENT
101 %token CONTEXT CURSOR UP ANCHOR STYLE TEXTURE OPACITY
104 %type <decor> decoritems styleitem
106 %type <style> style styleitems
108 %type <material> material_props
109 %type <realnum> opacity
110 %type <space> spaceconstraints
111 %type <vector> up anchor
113 %type <context> context
116 theme_object : material_decl
120 theme_objects : /* empty */
121 | theme_objects theme_object
124 theme : THEME ID LCB styles RCB {
126 out = malloc(sizeof(struct theme));
129 g_hash_table_insert(pc->target->themes, $2, out);
133 opacity : OPACITY LB NUMBER RB { $$ = $3; }
136 material_props : /* empty */ { memset(&$$, 0, sizeof($$)); }
137 | material_props opacity {
143 material_decl : MATERIAL ID LCB material_props RCB {
144 struct material *out;
145 out = malloc(sizeof(struct material));
147 g_hash_table_insert(pc->target->materials, $2, out);
151 anchor : ANCHOR LB NUMBER NUMBER NUMBER RB {
158 up : UP LB NUMBER NUMBER NUMBER RB {
165 spaceconstraints: /* empty */ { memset(&$$, 0, sizeof($$)); }
166 | spaceconstraints anchor { $1.anchor = $2; $$ = $1; }
167 | spaceconstraints up { $1.up = $2; $$ = $1; }
170 space : SPACE LCB spaceconstraints RCB {
175 shape : SHAPEOF LB ID RB
178 geometry_item : /* empty */
182 geometry : GEOMETRY LCB geometry_item RCB
185 material_use : MATERIAL LB ID RB {
186 if (g_hash_table_lookup(pc->target->materials, $3) == NULL) {
187 snprintf(pc->error_buf, 4000, "No definition for material '%s'\n", $3);
188 obthemeerror(pc, pc->error_buf);
197 styleitems : /* empty */ { $$.tree = NULL; $$.name = NULL; }
198 | styleitems styleitem {
199 struct decor *out = malloc(sizeof(struct decor));
201 $1.tree = g_slist_prepend($1.tree, out);
206 styles : /* empty */ { $$ = g_hash_table_new(g_str_hash, g_str_equal); }
208 struct style *out = malloc(sizeof(struct style));
211 g_hash_table_insert($1, out->name, out);
215 style : STYLE ID LCB styleitems RCB {
221 decoritems : /* empty */ {
222 memset(&$$, 0, sizeof($$));
224 $$.cursor = OB_CURSOR_NONE;
227 struct decor *out = malloc(sizeof(struct decor));
230 $$.children = g_slist_append($1.children, out);
232 | decoritems space { $1.space = $2; $$ = $1; }
233 | decoritems material_use
234 | decoritems geometry
236 | decoritems context { $1.context = $2; }
237 | decoritems gradient
238 | decoritems cursor { $1.cursor = $2; }
243 decor : DECOR ID LCB decoritems RCB {
249 texture : TEXTURE LCB RCB
252 context : CONTEXT LB ID RB {
254 frc = context_from_string($3);
256 snprintf(pc->error_buf, 4000, "Illegal context '%s'\n", $3);
257 obthemeerror(pc, pc->error_buf);
263 cursor : CURSOR LB NORTH RB { $$ = OB_CURSOR_NORTH; }
264 | CURSOR LB NORTHEAST RB { $$ = OB_CURSOR_NORTHEAST; }
265 | CURSOR LB EAST RB { $$ = OB_CURSOR_EAST; }
266 | CURSOR LB SOUTHEAST RB { $$ = OB_CURSOR_SOUTHEAST; }
267 | CURSOR LB SOUTH RB { $$ = OB_CURSOR_SOUTH; }
268 | CURSOR LB SOUTHWEST RB { $$ = OB_CURSOR_SOUTHWEST; }
269 | CURSOR LB WEST RB { $$ = OB_CURSOR_WEST; }
270 | CURSOR LB NORTHWEST RB { $$ = OB_CURSOR_NORTHWEST; }
271 // | CURSOR LB NONE RB { $$ = OB_CURSOR_NORTHEAST; }
272 | CURSOR LB UNCHANGED RB { $$ = OB_CURSOR_NONE; }
274 gradient : GRADIENT LB ID RB