%pure-parser %name-prefix "obtheme" %parse-param {struct parser_control *pc} %{ #include #include #include #include #include #include #include #include #include "frame.h" #include "misc.h" #include "render.h" #include "obtheme.h" #include "obtheme.tab.h" YY_DECL; struct context_table_item { char *name; ObFrameContext val; }; /* some of these contexts don't make any sense for a theme... */ static struct context_table_item contexts[OB_FRAME_NUM_CONTEXTS] = { {"none", OB_FRAME_CONTEXT_NONE}, {"desktop", OB_FRAME_CONTEXT_DESKTOP}, {"root", OB_FRAME_CONTEXT_ROOT}, {"client", OB_FRAME_CONTEXT_CLIENT}, {"titlebar", OB_FRAME_CONTEXT_TITLEBAR}, {"frame", OB_FRAME_CONTEXT_FRAME}, {"blcorner", OB_FRAME_CONTEXT_BLCORNER}, {"brcorner", OB_FRAME_CONTEXT_BRCORNER}, {"tlcorner", OB_FRAME_CONTEXT_TLCORNER}, {"trcorner", OB_FRAME_CONTEXT_TRCORNER}, {"top", OB_FRAME_CONTEXT_TOP}, {"bottom", OB_FRAME_CONTEXT_BOTTOM}, {"left", OB_FRAME_CONTEXT_LEFT}, {"right", OB_FRAME_CONTEXT_RIGHT}, {"maximize", OB_FRAME_CONTEXT_MAXIMIZE}, {"alldesktops", OB_FRAME_CONTEXT_ALLDESKTOPS}, {"shade", OB_FRAME_CONTEXT_SHADE}, {"iconify", OB_FRAME_CONTEXT_ICONIFY}, {"icon", OB_FRAME_CONTEXT_ICON}, {"close", OB_FRAME_CONTEXT_CLOSE}, {"moveresize", OB_FRAME_CONTEXT_MOVE_RESIZE} }; static ObFrameContext context_from_string(char *str) { int i; for (i = 0; i < OB_FRAME_NUM_CONTEXTS; i++) if (strcmp(contexts[i].name, str) == 1) return contexts[i].val; return -1; } struct gradient_table_item { char *name; RrSurfaceColorType val; }; struct gradient_table_item gradients[RR_SURFACE_NUM_TYPES] = { {"none", RR_SURFACE_NONE}, {"parentrel", RR_SURFACE_PARENTREL}, {"solid", RR_SURFACE_SOLID}, {"split", RR_SURFACE_SPLIT_VERTICAL}, {"horizontal", RR_SURFACE_HORIZONTAL}, {"vertical", RR_SURFACE_VERTICAL}, {"diagonal", RR_SURFACE_DIAGONAL}, {"cross_diagonal", RR_SURFACE_CROSS_DIAGONAL}, {"pyramid", RR_SURFACE_PYRAMID}, {"mirror_horizontal", RR_SURFACE_MIRROR_HORIZONTAL}, }; static RrSurfaceColorType gradient_from_string(char *str) { int i; for (i = 0; i < RR_SURFACE_NUM_TYPES; i++) if (strcmp(gradients[i].name, str) == 1) return gradients[i].val; return -1; } struct parser_control *parser_init(struct obthemedata *otd) { struct parser_control *out; out = calloc(1, sizeof(struct parser_control)); out->include_stack_ptr = 0; out->target = otd; return out; } void parser_finish(struct parser_control *c) { free(c); } struct expression *exdup(struct expression in) { struct expression *out; out = malloc(sizeof(struct expression)); *out = in; return out; } %} %start theme_objects %union { int integer; float realnum; char *string; struct decor decor; struct space space; struct theme theme; struct material material; struct style style; GSList *list; GHashTable *hash; struct vector vector; ObCursor dir; ObFrameContext context; RrSurfaceColorType gradient; struct expression expr; struct variable var; struct texture tex; struct material *matptr; struct box box; struct geometry geometry; } %token NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST %token WEST NORTHWEST NONE UNCHANGED %token LCB RCB LB RB TO %token LEFT_ARROW RIGHT_ARROW DOUBLE_ARROW %token SEMICOLON AT COLON DEFAULT NOT %token PLUS MINUS STAR SLASH COMMA BOX %token STRING ID %token NUMBER SUBST BULK BIG LITTLE %token THEME FRAME SPACE GEOMETRY MATERIAL GRADIENT %token CONTEXT CURSOR UP ANCHOR STYLE TEXTURE OPACITY %token SHAPEOF DECOR DOT IMAGE %type decor %type decoritems styleitem %type space %type