diff options
author | rsc <devnull@localhost> | 2006-06-25 18:59:29 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2006-06-25 18:59:29 +0000 |
commit | 74dc60da74c62e07f0d63179da9724d705794a6d (patch) | |
tree | bfb0bcf94115ebc5b142c3ad4d80157288ee8368 /src/libdraw/mouse.c | |
parent | 324891a5579d6f504201a6107369c64dab245a98 (diff) | |
download | plan9port-74dc60da74c62e07f0d63179da9724d705794a6d.tar.gz plan9port-74dc60da74c62e07f0d63179da9724d705794a6d.tar.bz2 plan9port-74dc60da74c62e07f0d63179da9724d705794a6d.zip |
bye
Diffstat (limited to 'src/libdraw/mouse.c')
-rw-r--r-- | src/libdraw/mouse.c | 107 |
1 files changed, 28 insertions, 79 deletions
diff --git a/src/libdraw/mouse.c b/src/libdraw/mouse.c index 3b3cbb6b..5c6d0970 100644 --- a/src/libdraw/mouse.c +++ b/src/libdraw/mouse.c @@ -6,10 +6,10 @@ #include <mouse.h> void -moveto(Mousectl *m, Point pt) +moveto(Mousectl *mc, Point pt) { - fprint(m->mfd, "m%d %d", pt.x, pt.y); - m->xy = pt; + _displaymoveto(mc->display, pt); + mc->m.xy = pt; } void @@ -18,24 +18,20 @@ closemouse(Mousectl *mc) if(mc == nil) return; - postnote(PNPROC, mc->pid, "kill"); +/* postnote(PNPROC, mc->pid, "kill"); */ - do; while(nbrecv(mc->c, &mc->Mouse) > 0); - - close(mc->mfd); - close(mc->cfd); - free(mc->file); - free(mc->c); - free(mc->resizec); + do; while(nbrecv(mc->c, &mc->m) > 0); + chanfree(mc->c); + chanfree(mc->resizec); free(mc); } int readmouse(Mousectl *mc) { - if(mc->image) - flushimage(mc->image->display, 1); - if(recv(mc->c, &mc->Mouse) < 0){ + if(mc->display) + flushimage(mc->display, 1); + if(recv(mc->c, &mc->m) < 0){ fprint(2, "readmouse: %r\n"); return -1; } @@ -46,45 +42,27 @@ static void _ioproc(void *arg) { - int n, nerr, one; - char buf[1+5*12]; + int one, resized; Mouse m; Mousectl *mc; mc = arg; threadsetname("mouseproc"); - one = 1; memset(&m, 0, sizeof m); - mc->pid = getpid(); - nerr = 0; + one = 1; + resized = 0; for(;;){ - n = read(mc->mfd, buf, sizeof buf); - if(n != 1+4*12){ - yield(); /* if error is due to exiting, we'll exit here */ - fprint(2, "mouse: bad count %d not 49: %r\n", n); - if(n<0 || ++nerr>10) - threadexits("read error"); - continue; - } - nerr = 0; - switch(buf[0]){ - case 'r': + if(_displayrdmouse(mc->display, &m, &resized) < 0) + threadexits("read error"); + if(resized) send(mc->resizec, &one); - /* fall through */ - case 'm': - m.xy.x = atoi(buf+1+0*12); - m.xy.y = atoi(buf+1+1*12); - m.buttons = atoi(buf+1+2*12); - m.msec = atoi(buf+1+3*12); - send(mc->c, &m); - /* - * mc->Mouse is updated after send so it doesn't have wrong value if we block during send. - * This means that programs should receive into mc->Mouse (see readmouse() above) if - * they want full synchrony. - */ - mc->Mouse = m; - break; - } + send(mc->c, &m); + /* + * mc->m is updated after send so it doesn't have wrong value if we block during send. + * This means that programs should receive into mc->Mouse (see readmouse() above) if + * they want full synchrony. + */ + mc->m = m; } } @@ -92,50 +70,21 @@ Mousectl* initmouse(char *file, Image *i) { Mousectl *mc; - char *t, *sl; mc = mallocz(sizeof(Mousectl), 1); - if(file == nil) - file = "/dev/mouse"; - mc->file = strdup(file); - mc->mfd = open(file, ORDWR|OCEXEC); - if(mc->mfd<0 && strcmp(file, "/dev/mouse")==0){ - bind("#m", "/dev", MAFTER); - mc->mfd = open(file, ORDWR|OCEXEC); - } - if(mc->mfd < 0){ - free(mc); - return nil; - } - t = malloc(strlen(file)+16); - strcpy(t, file); - sl = utfrrune(t, '/'); - if(sl) - strcpy(sl, "/cursor"); - else - strcpy(t, "/dev/cursor"); - mc->cfd = open(t, ORDWR|OCEXEC); - free(t); - mc->image = i; + if(i) + mc->display = i->display; mc->c = chancreate(sizeof(Mouse), 0); chansetname(mc->c, "mousec"); mc->resizec = chancreate(sizeof(int), 2); chansetname(mc->resizec, "resizec"); - proccreate(_ioproc, mc, 4096); + proccreate(_ioproc, mc, 32*1024); return mc; } void setcursor(Mousectl *mc, Cursor *c) { - char curs[2*4+2*2*16]; - - if(c == nil) - write(mc->cfd, curs, 0); - else{ - BPLONG(curs+0*4, c->offset.x); - BPLONG(curs+1*4, c->offset.y); - memmove(curs+2*4, c->clr, 2*2*16); - write(mc->cfd, curs, sizeof curs); - } + _displaycursor(mc->display, c); } + |