commit 6da9bfce1e0eae009c145def74f706ba26a3d072
parent 34720c3c0ef235e312a886f0dfd323e6ba789131
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Fri, 10 Mar 2006 11:50:52 +0100
added rule.c, a starting point for a rule engine
Diffstat:
3 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/cmd/wm/Makefile b/cmd/wm/Makefile
@@ -9,7 +9,7 @@ LDFLAGS += -L../../liblitz -llitz -L../../libixp -lixp -L../../libcext -lcext
# Solaris
# LDFLAGS += -lsocket
-SRC = area.c bar.c fs.c frame.c wm.c kb.c client.c event.c mouse.c tag.c
+SRC = area.c bar.c fs.c frame.c wm.c kb.c client.c event.c mouse.c rule.c tag.c
OBJ = ${SRC:.c=.o}
all: wmiiwm
diff --git a/cmd/wm/rule.c b/cmd/wm/rule.c
@@ -0,0 +1,99 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include "wm.h"
+
+/*
+ * basic rule matching language
+ *
+ * /pattern/ -> tag [tag ...]
+ */
+
+typedef struct {
+ char pattern[256];
+ char tags[256];
+} Rule;
+
+enum {
+ IGNORE,
+ PATTERN,
+ TAGS
+};
+
+/* free the result */
+static Rule *
+parse(char *data, unsigned int *n)
+{
+ Rule *rules;
+ unsigned int i;
+ int mode = IGNORE;
+ char *last = nil, *p, *pattern, *tags;
+
+ if(!data || !strlen(data))
+ return nil;
+
+ *n = 0;
+ for(last = p = data; *p; p++)
+ if(*p == '\n')
+ *n++;
+
+ rules = cext_emallocz(sizeof(Rule) * (*n));
+
+ i = 0;
+ for(p = data; *p; p++) {
+ switch(mode) {
+ case IGNORE:
+ if(*p == '/') {
+ mode = PATTERN;
+ pattern = rules[i].pattern;
+ }
+ else if(*p == '>' && last && *last == '-') {
+ mode = TAGS;
+ tags = rules[i].tags;
+ }
+ break;
+ case PATTERN:
+ if(*p == '/') {
+ mode = IGNORE;
+ *pattern = 0;
+ }
+ else {
+ *pattern = *p;
+ pattern++;
+ }
+ break;
+ case TAGS:
+ if(*p == ' ' && !strlen(tags))
+ break;
+ else if(*p == '\n') {
+ *tags = 0;
+ mode = IGNORE;
+ i++;
+ }
+ else {
+ *tags = *p;
+ tags++;
+ }
+ break;
+ }
+ last = p;
+ }
+
+ return rules;
+}
+
+char *
+match_tags(char *ruledef, Client *c)
+{
+ unsigned int n;
+ Rule *rules = parse(ruledef, &n);
+
+
+
+ free(rules);
+ return nil;
+}
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -285,6 +285,9 @@ void grab_mouse(Window w, unsigned long mod, unsigned int button);
void ungrab_mouse(Window w, unsigned long mod, unsigned int button);
char *warp_mouse(char *arg);
+/* rule.c */
+char *match_tags(char *ruledef, Client *c);
+
/* tag.c */
Tag *alloc_tag(char *name);
char *destroy_tag(Tag *t);