mirror of
https://github.com/0intro/wmii
synced 2024-11-22 05:42:05 +03:00
Fix printevent ButtonEvent output.
This commit is contained in:
parent
9470b23a9c
commit
612b959af5
@ -106,6 +106,7 @@ typedef struct Group Group;
|
|||||||
typedef struct Key Key;
|
typedef struct Key Key;
|
||||||
typedef struct Rule Rule;
|
typedef struct Rule Rule;
|
||||||
typedef struct Ruleset Ruleset;
|
typedef struct Ruleset Ruleset;
|
||||||
|
typedef struct Ruleval Ruleval;
|
||||||
typedef struct Strut Strut;
|
typedef struct Strut Strut;
|
||||||
typedef struct View View;
|
typedef struct View View;
|
||||||
typedef struct WMScreen WMScreen;
|
typedef struct WMScreen WMScreen;
|
||||||
@ -223,10 +224,10 @@ struct Key {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Rule {
|
struct Rule {
|
||||||
Rule* next;
|
Rule* next;
|
||||||
Reprog* regex;
|
Reprog* regex;
|
||||||
char value[256];
|
char* value;
|
||||||
|
Ruleval* values;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ruleset {
|
struct Ruleset {
|
||||||
@ -235,6 +236,12 @@ struct Ruleset {
|
|||||||
uint size;
|
uint size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Ruleval {
|
||||||
|
Ruleval* next;
|
||||||
|
char* key;
|
||||||
|
char* value;
|
||||||
|
}
|
||||||
|
|
||||||
struct Strut {
|
struct Strut {
|
||||||
Rectangle left;
|
Rectangle left;
|
||||||
Rectangle right;
|
Rectangle right;
|
||||||
@ -271,8 +278,9 @@ EXTERN struct {
|
|||||||
Font* font;
|
Font* font;
|
||||||
char* keys;
|
char* keys;
|
||||||
uint keyssz;
|
uint keyssz;
|
||||||
Ruleset tagrules;
|
|
||||||
Ruleset colrules;
|
Ruleset colrules;
|
||||||
|
Ruleset tagrules;
|
||||||
|
Ruleset rules;
|
||||||
char grabmod[5];
|
char grabmod[5];
|
||||||
ulong mod;
|
ulong mod;
|
||||||
uint border;
|
uint border;
|
||||||
|
@ -44,6 +44,7 @@ enum { /* Dirs */
|
|||||||
FsFEvent,
|
FsFEvent,
|
||||||
FsFKeys,
|
FsFKeys,
|
||||||
FsFRctl,
|
FsFRctl,
|
||||||
|
FsFRules,
|
||||||
FsFTagRules,
|
FsFTagRules,
|
||||||
FsFTctl,
|
FsFTctl,
|
||||||
FsFTindex,
|
FsFTindex,
|
||||||
@ -90,6 +91,7 @@ dirtab_root[]= {{".", QTDIR, FsRoot, 0500|DMDIR },
|
|||||||
{"colrules", QTFILE, FsFColRules, 0600 },
|
{"colrules", QTFILE, FsFColRules, 0600 },
|
||||||
{"event", QTFILE, FsFEvent, 0600 },
|
{"event", QTFILE, FsFEvent, 0600 },
|
||||||
{"keys", QTFILE, FsFKeys, 0600 },
|
{"keys", QTFILE, FsFKeys, 0600 },
|
||||||
|
{"rules", QTFILE, FsFRules, 0600 },
|
||||||
{"tagrules", QTFILE, FsFTagRules, 0600 },
|
{"tagrules", QTFILE, FsFTagRules, 0600 },
|
||||||
{nil}},
|
{nil}},
|
||||||
dirtab_clients[]={{".", QTDIR, FsDClients, 0500|DMDIR },
|
dirtab_clients[]={{".", QTDIR, FsDClients, 0500|DMDIR },
|
||||||
@ -336,6 +338,9 @@ lookup_file(IxpFileId *parent, char *name)
|
|||||||
case FsFColRules:
|
case FsFColRules:
|
||||||
file->p.rule = &def.colrules;
|
file->p.rule = &def.colrules;
|
||||||
break;
|
break;
|
||||||
|
case FsFRules:
|
||||||
|
file->p.rule = &def.tagrules;
|
||||||
|
break;
|
||||||
case FsFTagRules:
|
case FsFTagRules:
|
||||||
file->p.rule = &def.tagrules;
|
file->p.rule = &def.tagrules;
|
||||||
break;
|
break;
|
||||||
@ -379,6 +384,7 @@ fs_size(IxpFileId *f) {
|
|||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
case FsFColRules:
|
case FsFColRules:
|
||||||
|
case FsFRules:
|
||||||
case FsFTagRules:
|
case FsFTagRules:
|
||||||
return f->p.rule->size;
|
return f->p.rule->size;
|
||||||
case FsFKeys:
|
case FsFKeys:
|
||||||
@ -447,6 +453,7 @@ fs_read(Ixp9Req *r) {
|
|||||||
respond(r, nil);
|
respond(r, nil);
|
||||||
return;
|
return;
|
||||||
case FsFColRules:
|
case FsFColRules:
|
||||||
|
case FsFRules:
|
||||||
case FsFTagRules:
|
case FsFTagRules:
|
||||||
ixp_srv_readbuf(r, f->p.rule->string, f->p.rule->size);
|
ixp_srv_readbuf(r, f->p.rule->string, f->p.rule->size);
|
||||||
respond(r, nil);
|
respond(r, nil);
|
||||||
@ -515,6 +522,7 @@ fs_write(Ixp9Req *r) {
|
|||||||
|
|
||||||
switch(f->tab.type) {
|
switch(f->tab.type) {
|
||||||
case FsFColRules:
|
case FsFColRules:
|
||||||
|
case FsFRules:
|
||||||
case FsFTagRules:
|
case FsFTagRules:
|
||||||
ixp_srv_writebuf(r, &f->p.rule->string, &f->p.rule->size, 0);
|
ixp_srv_writebuf(r, &f->p.rule->string, &f->p.rule->size, 0);
|
||||||
respond(r, nil);
|
respond(r, nil);
|
||||||
@ -681,16 +689,18 @@ fs_clunk(Ixp9Req *r) {
|
|||||||
|
|
||||||
switch(f->tab.type) {
|
switch(f->tab.type) {
|
||||||
case FsFColRules:
|
case FsFColRules:
|
||||||
update_rules(&f->p.rule->rule, f->p.rule->string);
|
case FsFRules:
|
||||||
break;
|
|
||||||
case FsFTagRules:
|
case FsFTagRules:
|
||||||
update_rules(&f->p.rule->rule, f->p.rule->string);
|
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)
|
for(c=client; c; c=c->next)
|
||||||
apply_rules(c);
|
apply_rules(c);
|
||||||
view_update_all();
|
view_update_all();
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
|
*/
|
||||||
case FsFKeys:
|
case FsFKeys:
|
||||||
update_keys();
|
update_keys();
|
||||||
break;
|
break;
|
||||||
|
101
cmd/wmii/rule.c
101
cmd/wmii/rule.c
@ -22,33 +22,59 @@ trim(char *str, const char *chars) {
|
|||||||
*q = '\0';
|
*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 */
|
/* XXX: I hate this. --KM */
|
||||||
void
|
void
|
||||||
update_rules(Rule **rule, const char *data) {
|
update_rules(Rule **rule, const char *data) {
|
||||||
/* basic rule matching language /regex/ -> value
|
|
||||||
* regex might contain POSIX regex syntax defined in regex(3) */
|
|
||||||
enum {
|
enum {
|
||||||
|
COMMENT,
|
||||||
IGNORE,
|
IGNORE,
|
||||||
REGEX,
|
REGEX,
|
||||||
VALUE,
|
VALUE,
|
||||||
COMMENT,
|
WAIT,
|
||||||
};
|
};
|
||||||
int state;
|
int state, old_state;
|
||||||
|
IxpMsg m;
|
||||||
|
Ruleval **rvp;
|
||||||
|
Ruleval *rv;
|
||||||
Rule *rul;
|
Rule *rul;
|
||||||
char regex[256], value[256];
|
char regex[256];
|
||||||
char *regex_end = regex + sizeof(regex) - 1;
|
char *regex_end = regex + sizeof(regex) - 1;
|
||||||
char *value_end = value + sizeof(value) - 1;
|
char *value_end = buffer + sizeof(buffer) - 1;
|
||||||
char *r, *v;
|
char *r, *v;
|
||||||
const char *p;
|
const char *p;
|
||||||
char c;
|
char c;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
#define NEXT(next) BLOCK( \
|
||||||
|
old_state = state \
|
||||||
|
state = next; \
|
||||||
|
continue; \
|
||||||
|
)
|
||||||
|
|
||||||
SET(r);
|
SET(r);
|
||||||
SET(v);
|
SET(v);
|
||||||
|
SET(old_state);
|
||||||
|
|
||||||
if(!data || !strlen(data))
|
if(!data || !strlen(data))
|
||||||
return;
|
return;
|
||||||
while((rul = *rule)) {
|
while((rul = *rule)) {
|
||||||
*rule = rul->next;
|
*rule = rul->next;
|
||||||
|
while((rv = rul->values)) {
|
||||||
|
rul->values = rv->next;
|
||||||
|
free(rv);
|
||||||
|
}
|
||||||
free(rul->regex);
|
free(rul->regex);
|
||||||
free(rul);
|
free(rul);
|
||||||
}
|
}
|
||||||
@ -57,11 +83,11 @@ update_rules(Rule **rule, const char *data) {
|
|||||||
switch(state) {
|
switch(state) {
|
||||||
case COMMENT:
|
case COMMENT:
|
||||||
if(c == '\n')
|
if(c == '\n')
|
||||||
state = IGNORE;
|
state = old_state;
|
||||||
break;
|
break;
|
||||||
case IGNORE:
|
case IGNORE:
|
||||||
if(c == '#')
|
if(c == '#')
|
||||||
state = COMMENT;
|
goto comment;
|
||||||
else if(c == '/') {
|
else if(c == '/') {
|
||||||
r = regex;
|
r = regex;
|
||||||
state = REGEX;
|
state = REGEX;
|
||||||
@ -75,6 +101,10 @@ update_rules(Rule **rule, const char *data) {
|
|||||||
case REGEX:
|
case REGEX:
|
||||||
if(c == '\\' && p[1] == '/')
|
if(c == '\\' && p[1] == '/')
|
||||||
p++;
|
p++;
|
||||||
|
else if(c == '\\' && p[1] == '\\' && p[2] == '/')
|
||||||
|
p++;
|
||||||
|
else if(c == '\\' && r < regex_end)
|
||||||
|
*r++ = *p++;
|
||||||
else if(c == '/') {
|
else if(c == '/') {
|
||||||
*r = 0;
|
*r = 0;
|
||||||
state = IGNORE;
|
state = IGNORE;
|
||||||
@ -84,24 +114,49 @@ update_rules(Rule **rule, const char *data) {
|
|||||||
*r++ = c;
|
*r++ = c;
|
||||||
break;
|
break;
|
||||||
case VALUE:
|
case VALUE:
|
||||||
if(c == '\n' || c == '#' || c == 0) {
|
if(c == '#')
|
||||||
*v = 0;
|
NEXT(COMMENT);
|
||||||
trim(value, " \t");
|
if(c == '\n')
|
||||||
*rule = emallocz(sizeof **rule);
|
NEXT(WAIT);
|
||||||
(*rule)->regex = regcomp(regex);
|
if(v < value_end)
|
||||||
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)
|
|
||||||
*v++ = c;
|
*v++ = c;
|
||||||
break;
|
break;
|
||||||
|
case WAIT:
|
||||||
|
if(c == '#')
|
||||||
|
NEXT(COMMENT);
|
||||||
|
if(c == '/') {
|
||||||
|
state =
|
||||||
|
break;
|
||||||
default: /* can't happen */
|
default: /* can't happen */
|
||||||
die("invalid state");
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -558,7 +558,7 @@ VerbButton(Fmt *fmt, XEvent *e) {
|
|||||||
TInt, _(x), TInt, _(y),
|
TInt, _(x), TInt, _(y),
|
||||||
TInt, _(x_root), TInt, _(y_root),
|
TInt, _(x_root), TInt, _(y_root),
|
||||||
TModState, _(state),
|
TModState, _(state),
|
||||||
TModState, _(button),
|
TInt, _(button),
|
||||||
TBool, _(same_screen),
|
TBool, _(same_screen),
|
||||||
TEnd
|
TEnd
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user