summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorftrvxmtrx <ftrvxmtrx@gmail.com>2013-04-28 00:23:20 +0200
committerftrvxmtrx <ftrvxmtrx@gmail.com>2013-04-28 00:23:20 +0200
commitd5155e6bc8de47549af8396cc434df4b74c85bc1 (patch)
tree813c6c505a7b9202b5be5cd4b41b7b8cca317b10
parentd173927c4f381947126b18f029709d3b8abafb87 (diff)
parent90036b9991198e709330c884b7497fff29e7a58d (diff)
downloadplan9front-d5155e6bc8de47549af8396cc434df4b74c85bc1.tar.xz
merge
-rw-r--r--sys/src/libdraw/mouse.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/sys/src/libdraw/mouse.c b/sys/src/libdraw/mouse.c
index 74147bf53..ceb93819d 100644
--- a/sys/src/libdraw/mouse.c
+++ b/sys/src/libdraw/mouse.c
@@ -39,24 +39,32 @@ static
void
_ioproc(void *arg)
{
- int n, one;
+ int n, nerr, one;
char buf[1+5*12];
Mouse m;
Mousectl *mc;
mc = arg;
threadsetname("mouseproc");
- one = 1;
memset(&m, 0, sizeof m);
-loop:
+ nerr = 0;
while(mc->mfd >= 0){
n = read(mc->mfd, buf, sizeof buf);
- if(n != 1+4*12)
- goto loop;
+ if(n != 1+4*12){
+ yield(); /* if error is due to exiting, we'll exit here */
+ if(mc->mfd < 0)
+ break;
+ 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':
+ one = 1;
if(send(mc->resizec, &one) < 0)
- goto loop;
+ continue;
/* fall through */
case 'm':
m.xy.x = atoi(buf+1+0*12);
@@ -64,7 +72,7 @@ loop:
m.buttons = atoi(buf+1+2*12);
m.msec = atoi(buf+1+3*12);
if(send(mc->c, &m) < 0)
- goto loop;
+ continue;
/*
* 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