event
This commit is contained in:
parent
e0ef95dce1
commit
150f88023b
6 changed files with 273 additions and 1905 deletions
|
|
@ -1,6 +1,7 @@
|
|||
/* Copyright (c) 2006 Russ Cox */
|
||||
|
||||
#include <u.h>
|
||||
#include <sys/select.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <mouse.h>
|
||||
|
|
@ -12,8 +13,10 @@ int chattydrawclient;
|
|||
|
||||
static int drawgettag(Mux *mux, void *vmsg);
|
||||
static void* drawrecv(Mux *mux);
|
||||
static void* drawnbrecv(Mux *mux);
|
||||
static int drawsend(Mux *mux, void *vmsg);
|
||||
static int drawsettag(Mux *mux, void *vmsg, uint tag);
|
||||
static int canreadfd(int);
|
||||
|
||||
int
|
||||
_displayconnect(Display *d)
|
||||
|
|
@ -35,8 +38,8 @@ _displayconnect(Display *d)
|
|||
dup(p[1], 0);
|
||||
dup(p[1], 1);
|
||||
/* execl("strace", "strace", "-o", "drawsrv.out", "drawsrv", nil); */
|
||||
execl("drawsrv", "drawsrv", nil);
|
||||
sysfatal("exec drawsrv: %r");
|
||||
execl("devdraw", "devdraw", nil);
|
||||
sysfatal("exec devdraw: %r");
|
||||
}
|
||||
close(p[1]);
|
||||
d->srvfd = p[0];
|
||||
|
|
@ -53,6 +56,7 @@ _displaymux(Display *d)
|
|||
d->mux->maxtag = 255;
|
||||
d->mux->send = drawsend;
|
||||
d->mux->recv = drawrecv;
|
||||
d->mux->nbrecv = drawnbrecv;
|
||||
d->mux->gettag = drawgettag;
|
||||
d->mux->settag = drawsettag;
|
||||
d->mux->aux = d;
|
||||
|
|
@ -61,9 +65,6 @@ _displaymux(Display *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define GET(p, x) \
|
||||
((x) = (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3])))
|
||||
|
||||
static int
|
||||
drawsend(Mux *mux, void *vmsg)
|
||||
{
|
||||
|
|
@ -78,17 +79,17 @@ drawsend(Mux *mux, void *vmsg)
|
|||
}
|
||||
|
||||
static void*
|
||||
drawrecv(Mux *mux)
|
||||
_drawrecv(Mux *mux, int nb)
|
||||
{
|
||||
int n;
|
||||
uchar buf[4], *p;
|
||||
Display *d;
|
||||
|
||||
|
||||
d = mux->aux;
|
||||
if((n=readn(d->srvfd, buf, 4)) != 4){
|
||||
fprint(2, "readn 4 got %d: %r\n", n);
|
||||
if(nb && !canreadfd(d->srvfd))
|
||||
return nil;
|
||||
if((n=readn(d->srvfd, buf, 4)) != 4)
|
||||
return nil;
|
||||
}
|
||||
GET(buf, n);
|
||||
p = malloc(n);
|
||||
if(p == nil){
|
||||
|
|
@ -96,13 +97,23 @@ fprint(2, "readn 4 got %d: %r\n", n);
|
|||
return nil;
|
||||
}
|
||||
memmove(p, buf, 4);
|
||||
if(readn(d->srvfd, p+4, n-4) != n-4){
|
||||
fprint(2, "short readn\n");
|
||||
if(readn(d->srvfd, p+4, n-4) != n-4)
|
||||
return nil;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
static void*
|
||||
drawrecv(Mux *mux)
|
||||
{
|
||||
return _drawrecv(mux, 0);
|
||||
}
|
||||
|
||||
static void*
|
||||
drawnbrecv(Mux *mux)
|
||||
{
|
||||
return _drawrecv(mux, 1);
|
||||
}
|
||||
|
||||
static int
|
||||
drawgettag(Mux *mux, void *vmsg)
|
||||
{
|
||||
|
|
@ -186,8 +197,8 @@ _displayinit(Display *d, char *label, char *winsize)
|
|||
Wsysmsg tx, rx;
|
||||
|
||||
tx.type = Tinit;
|
||||
tx.label = "";
|
||||
tx.winsize = "";
|
||||
tx.label = label;
|
||||
tx.winsize = winsize;
|
||||
return displayrpc(d, &tx, &rx, nil);
|
||||
}
|
||||
|
||||
|
|
@ -334,3 +345,23 @@ _displayresize(Display *d, Rectangle r)
|
|||
return displayrpc(d, &tx, &rx, nil);
|
||||
}
|
||||
|
||||
static int
|
||||
canreadfd(int fd)
|
||||
{
|
||||
fd_set rs, ws, xs;
|
||||
struct timeval tv;
|
||||
|
||||
FD_ZERO(&rs);
|
||||
FD_ZERO(&ws);
|
||||
FD_ZERO(&xs);
|
||||
FD_SET(fd, &rs);
|
||||
FD_SET(fd, &xs);
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 0;
|
||||
if(select(fd+1, &rs, &ws, &xs, &tv) < 0)
|
||||
return 0;
|
||||
if(FD_ISSET(fd, &rs) || FD_ISSET(fd, &xs))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue