Fix printevent ButtonEvent output.

This commit is contained in:
Kris Maglione 2010-05-30 19:27:56 -04:00
parent 9470b23a9c
commit 612b959af5
4 changed files with 105 additions and 32 deletions

View File

@ -106,6 +106,7 @@ typedef struct Group Group;
typedef struct Key Key;
typedef struct Rule Rule;
typedef struct Ruleset Ruleset;
typedef struct Ruleval Ruleval;
typedef struct Strut Strut;
typedef struct View View;
typedef struct WMScreen WMScreen;
@ -223,10 +224,10 @@ struct Key {
};
struct Rule {
Rule* next;
Reprog* regex;
char value[256];
Rule* next;
Reprog* regex;
char* value;
Ruleval* values;
};
struct Ruleset {
@ -235,6 +236,12 @@ struct Ruleset {
uint size;
};
struct Ruleval {
Ruleval* next;
char* key;
char* value;
}
struct Strut {
Rectangle left;
Rectangle right;
@ -271,8 +278,9 @@ EXTERN struct {
Font* font;
char* keys;
uint keyssz;
Ruleset tagrules;
Ruleset colrules;
Ruleset tagrules;
Ruleset rules;
char grabmod[5];
ulong mod;
uint border;

View File

@ -44,6 +44,7 @@ enum { /* Dirs */
FsFEvent,
FsFKeys,
FsFRctl,
FsFRules,
FsFTagRules,
FsFTctl,
FsFTindex,
@ -90,6 +91,7 @@ dirtab_root[]= {{".", QTDIR, FsRoot, 0500|DMDIR },
{"colrules", QTFILE, FsFColRules, 0600 },
{"event", QTFILE, FsFEvent, 0600 },
{"keys", QTFILE, FsFKeys, 0600 },
{"rules", QTFILE, FsFRules, 0600 },
{"tagrules", QTFILE, FsFTagRules, 0600 },
{nil}},
dirtab_clients[]={{".", QTDIR, FsDClients, 0500|DMDIR },
@ -336,6 +338,9 @@ lookup_file(IxpFileId *parent, char *name)
case FsFColRules:
file->p.rule = &def.colrules;
break;
case FsFRules:
file->p.rule = &def.tagrules;
break;
case FsFTagRules:
file->p.rule = &def.tagrules;
break;
@ -379,6 +384,7 @@ fs_size(IxpFileId *f) {
default:
return 0;
case FsFColRules:
case FsFRules:
case FsFTagRules:
return f->p.rule->size;
case FsFKeys:
@ -447,6 +453,7 @@ fs_read(Ixp9Req *r) {
respond(r, nil);
return;
case FsFColRules:
case FsFRules:
case FsFTagRules:
ixp_srv_readbuf(r, f->p.rule->string, f->p.rule->size);
respond(r, nil);
@ -515,6 +522,7 @@ fs_write(Ixp9Req *r) {
switch(f->tab.type) {
case FsFColRules:
case FsFRules:
case FsFTagRules:
ixp_srv_writebuf(r, &f->p.rule->string, &f->p.rule->size, 0);
respond(r, nil);
@ -681,16 +689,18 @@ fs_clunk(Ixp9Req *r) {
switch(f->tab.type) {
case FsFColRules:
update_rules(&f->p.rule->rule, f->p.rule->string);
break;
case FsFRules:
case FsFTagRules:
update_rules(&f->p.rule->rule, f->p.rule->string);
break;
/*
case FsFTagRules:
update_rules(&f->p.rule->rule, f->p.rule->string);
for(c=client; c; c=c->next)
apply_rules(c);
view_update_all();
*/
break;
*/
case FsFKeys:
update_keys();
break;

View File

@ -22,33 +22,59 @@ trim(char *str, const char *chars) {
*q = '\0';
}
void
update_rules(Rule **rule, const char *data) {
#define putc(m, c) BLOCK(if(m.pos < m.end) *m.pos++ = c)
#define getc(m) (m.pos < m.end ? *m.pos++ : 0)
#define ungetc(m) BLOCK(if(m.pos > m.data) --m.pos)
IxpMsg buf, outbuf, rebuf;
char regex[256];
char c;
buf = ixp_message(data, strlen(data), MsgUnpack);
}
/* XXX: I hate this. --KM */
void
update_rules(Rule **rule, const char *data) {
/* basic rule matching language /regex/ -> value
* regex might contain POSIX regex syntax defined in regex(3) */
enum {
COMMENT,
IGNORE,
REGEX,
VALUE,
COMMENT,
WAIT,
};
int state;
int state, old_state;
IxpMsg m;
Ruleval **rvp;
Ruleval *rv;
Rule *rul;
char regex[256], value[256];
char regex[256];
char *regex_end = regex + sizeof(regex) - 1;
char *value_end = value + sizeof(value) - 1;
char *value_end = buffer + sizeof(buffer) - 1;
char *r, *v;
const char *p;
char c;
int len;
#define NEXT(next) BLOCK( \
old_state = state \
state = next; \
continue; \
)
SET(r);
SET(v);
SET(old_state);
if(!data || !strlen(data))
return;
while((rul = *rule)) {
*rule = rul->next;
while((rv = rul->values)) {
rul->values = rv->next;
free(rv);
}
free(rul->regex);
free(rul);
}
@ -57,11 +83,11 @@ update_rules(Rule **rule, const char *data) {
switch(state) {
case COMMENT:
if(c == '\n')
state = IGNORE;
state = old_state;
break;
case IGNORE:
if(c == '#')
state = COMMENT;
goto comment;
else if(c == '/') {
r = regex;
state = REGEX;
@ -75,6 +101,10 @@ update_rules(Rule **rule, const char *data) {
case REGEX:
if(c == '\\' && p[1] == '/')
p++;
else if(c == '\\' && p[1] == '\\' && p[2] == '/')
p++;
else if(c == '\\' && r < regex_end)
*r++ = *p++;
else if(c == '/') {
*r = 0;
state = IGNORE;
@ -84,24 +114,49 @@ update_rules(Rule **rule, const char *data) {
*r++ = c;
break;
case VALUE:
if(c == '\n' || c == '#' || c == 0) {
*v = 0;
trim(value, " \t");
*rule = emallocz(sizeof **rule);
(*rule)->regex = regcomp(regex);
if((*rule)->regex) {
utflcpy((*rule)->value, value, sizeof rul->value);
rule = &(*rule)->next;
}else
free(*rule);
state = IGNORE;
if(c == '#')
state = COMMENT;
}
else if(v < value_end)
if(c == '#')
NEXT(COMMENT);
if(c == '\n')
NEXT(WAIT);
if(v < value_end)
*v++ = c;
break;
case WAIT:
if(c == '#')
NEXT(COMMENT);
if(c == '/') {
state =
break;
default: /* can't happen */
die("invalid state");
accept:
*v = 0;
*rule = emallocz(sizeof **rule);
(*rule)->regex = regcomp(regex);
if((*rule)->regex) {
(*rule)->value = strdup(buffer);
trim((*rule)->value, " \t");
rvp = &(*rule)->values;
m = ixp_message(buffer, v - buffer, MsgUnpack);
while((r = msg_getword(&m)))
if((v = strchr(r, '='))) {
len = strlen(r) + 1;
*rvp = rv = emalloc(sizeof *rv + len);
rvp = &rv->next;
memcpy(&rv[1], r, len);
tokenize(&rv->key, 2, (char*)&rv[1], '=');
}
rule = &(*rule)->next;
}else
free(*rule);
r = regex;
break;
}
}

View File

@ -558,7 +558,7 @@ VerbButton(Fmt *fmt, XEvent *e) {
TInt, _(x), TInt, _(y),
TInt, _(x_root), TInt, _(y_root),
TModState, _(state),
TModState, _(button),
TInt, _(button),
TBool, _(same_screen),
TEnd
);