mirror of
https://github.com/0intro/wmii
synced 2025-03-20 05:33:18 +03:00
implemented event queueing and fixed a bug in rule.c reported by usa
This commit is contained in:
parent
38cb6fdc0d
commit
cc572f14f1
@ -64,7 +64,7 @@ handle_buttonpress(XEvent *e)
|
||||
for(i = 0; i < nlabel; i++)
|
||||
if(blitz_ispointinrect(ev->x, ev->y, &label[i]->rect)) {
|
||||
snprintf(buf, sizeof(buf), "LabelClick %s %d\n", label[i]->name, ev->button);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -77,7 +77,7 @@ handle_buttonpress(XEvent *e)
|
||||
}
|
||||
if(c->nframe) {
|
||||
snprintf(buf, sizeof(buf), "ClientClick %d %d\n", frame2index(c->frame[c->sel]) + 1, ev->button);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
}
|
||||
}
|
||||
else if((c = win2client(ev->window))) {
|
||||
@ -104,7 +104,7 @@ handle_buttonpress(XEvent *e)
|
||||
|
||||
if(c->nframe) {
|
||||
snprintf(buf, sizeof(buf), "ClientClick %d %d\n", frame2index(c->frame[c->sel]) + 1, ev->button);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
}
|
||||
}
|
||||
|
||||
|
28
cmd/wm/fs.c
28
cmd/wm/fs.c
@ -27,6 +27,8 @@ static char Enofunc[] = "function not supported";
|
||||
static char Enocommand[] = "command not supported";
|
||||
static char Ebadvalue[] = "bad value";
|
||||
|
||||
static char **queue = nil;
|
||||
static unsigned int nqueue = 0, queuesz = 0;
|
||||
#define WMII_IOUNIT 2048
|
||||
|
||||
/*
|
||||
@ -839,6 +841,12 @@ xread(IXPConn *c, Fcall *fcall)
|
||||
case FsFevent:
|
||||
memcpy(&c->pending, fcall, sizeof(Fcall));
|
||||
c->is_pending = 1;
|
||||
if(nqueue) {
|
||||
char *event = queue[0];
|
||||
cext_array_detach((void **)queue, event, &queuesz);
|
||||
nqueue--;
|
||||
write_event(event, False);
|
||||
}
|
||||
return nil;
|
||||
break;
|
||||
case FsFkeys:
|
||||
@ -1396,7 +1404,7 @@ xwrite(IXPConn *c, Fcall *fcall)
|
||||
if(fcall->count) {
|
||||
memcpy(buf, fcall->data, fcall->count);
|
||||
buf[fcall->count] = 0;
|
||||
write_event(buf);
|
||||
write_event(buf, False);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -1453,28 +1461,34 @@ do_fcall(IXPConn *c)
|
||||
}
|
||||
|
||||
void
|
||||
write_event(char *event)
|
||||
write_event(char *event, Bool enqueue)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int i, written = 0;
|
||||
|
||||
for(i = 0; (i < srv.connsz) && srv.conn[i]; i++) {
|
||||
IXPConn *c = srv.conn[i];
|
||||
if(c->is_pending) {
|
||||
/* pending reads on /event only, no qid checking */
|
||||
IXPMap *m = ixp_server_fid2map(c, c->pending.fid);
|
||||
unsigned char *p = c->pending.data;
|
||||
if(!m) {
|
||||
if(ixp_server_respond_error(c, &c->pending, Enofile))
|
||||
break;
|
||||
return;
|
||||
}
|
||||
else if(qpath_type(m->qid.path) == FsFevent) {
|
||||
/* pending reads on /event only, no qid checking */
|
||||
c->pending.count = strlen(event);
|
||||
memcpy(p, event, c->pending.count);
|
||||
memcpy(c->pending.data, event, c->pending.count);
|
||||
c->pending.id = RREAD;
|
||||
if(ixp_server_respond_fcall(c, &c->pending))
|
||||
break;
|
||||
return;
|
||||
}
|
||||
written++;
|
||||
}
|
||||
}
|
||||
if(!written) {
|
||||
queue = (char **)cext_array_attach((void **)queue, event, sizeof(char *), &queuesz);
|
||||
nqueue++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -220,7 +220,7 @@ handle_key_seq(Window w, Key **done, unsigned int ndone)
|
||||
case 1:
|
||||
if(!found[0]->next) {
|
||||
snprintf(buf, sizeof(buf), "Key %s\n", found[0]->name);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -244,7 +244,7 @@ handle_key(Window w, unsigned long mod, KeyCode keycode)
|
||||
case 1:
|
||||
if(!found[0]->next) {
|
||||
snprintf(buf, sizeof(buf), "Key %s\n", found[0]->name);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -63,6 +63,7 @@ parse(char *data, unsigned int *n)
|
||||
}
|
||||
else if(*p == '>') {
|
||||
mode = TAGS;
|
||||
tags[0] = 0;
|
||||
t = tags;
|
||||
}
|
||||
break;
|
||||
|
@ -102,7 +102,7 @@ focus_tag(Tag *t)
|
||||
}
|
||||
tags2str(name, sizeof(name), t->tag, t->ntag);
|
||||
snprintf(buf, sizeof(buf), "FocusTag %s\n", name);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
XSync(dpy, False);
|
||||
XUngrabServer(dpy);
|
||||
}
|
||||
@ -205,7 +205,7 @@ select_tag(char *arg)
|
||||
sizeof(char *), &ctagsz);
|
||||
nctag++;
|
||||
snprintf(buf, sizeof(buf), "NewTag %s\n", arg);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
}
|
||||
focus_tag(t);
|
||||
|
||||
@ -290,12 +290,12 @@ update_tags()
|
||||
for(i = 0; i < nnewctag; i++)
|
||||
if(!istag(ctag, nctag, newctag[i])) {
|
||||
snprintf(buf, sizeof(buf), "NewTag %s\n", newctag[i]);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
}
|
||||
for(i = 0; i < nctag; i++) {
|
||||
if(!istag(newctag, nnewctag, ctag[i])) {
|
||||
snprintf(buf, sizeof(buf), "RemoveTag %s\n", ctag[i]);
|
||||
write_event(buf);
|
||||
write_event(buf, True);
|
||||
}
|
||||
free(ctag[i]);
|
||||
}
|
||||
|
@ -264,7 +264,7 @@ Client *win2clientframe(Window w);
|
||||
/* fs.c */
|
||||
unsigned long long mkqpath(unsigned char type, unsigned short pg,
|
||||
unsigned short area, unsigned short cl);
|
||||
void write_event(char *event);
|
||||
void write_event(char *event, Bool enqueue);
|
||||
void new_ixp_conn(IXPConn *c);
|
||||
|
||||
/* kb.c */
|
||||
|
Loading…
x
Reference in New Issue
Block a user