From c21bbc9628398e1b207960d219a98a0d6dd14862 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 12 Oct 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-10-12 --- port/devdraw.c | 32 +++++++++++++++++++------------- port/devmouse.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/port/devdraw.c b/port/devdraw.c index cf20cd806a215a49ba2efde3e364a61f6cc3ebbb..fe9ded205bb08710271e79216f5ded0ac5934f30 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -1928,23 +1928,29 @@ Dev drawdevtab = { * On 8 bit displays, load the default color map */ void -drawcmap(int invert){ +drawcmap(int invert) +{ int r, g, b, cr, cg, cb, v; int num, den; int i, j; + drawactive(1); /* to restore map from backup */ - for(r=0,i=0;r!=4;r++) for(v=0;v!=4;v++,i+=16){ - for(g=0,j=v-r;g!=4;g++) for(b=0;b!=4;b++,j++){ - den=r; - if(g>den) den=g; - if(b>den) den=b; - if(den==0) /* divide check -- pick grey shades */ - cr=cg=cb=v*17; + for(r=0,i=0; r!=4; r++) + for(v=0; v!=4; v++,i+=16){ + for(g=0,j=v-r; g!=4; g++) + for(b=0;b!=4;b++,j++){ + den = r; + if(g > den) + den = g; + if(b > den) + den = b; + if(den == 0) /* divide check -- pick grey shades */ + cr = cg = cb = v*17; else{ - num=17*(4*den+v); - cr=r*num/den; - cg=g*num/den; - cb=b*num/den; + num = 17*(4*den+v); + cr = r*num/den; + cg = g*num/den; + cb = b*num/den; } if(invert) setcolor(255-i-(j&15), @@ -1952,7 +1958,7 @@ drawcmap(int invert){ else setcolor(i+(j&15), cr*0x01010101, cg*0x01010101, cb*0x01010101); - } + } } } diff --git a/port/devmouse.c b/port/devmouse.c index 26f37a997d0128e94b74d9ff55b54c7abac3adc5..edb859fb7c7f2664cc672c14163091b4bb46d765 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -27,6 +27,7 @@ struct Mouseinfo Ref; QLock; int open; + int inopen; int acceleration; int maxacc; }; @@ -44,12 +45,14 @@ enum{ Qdir, Qcursor, Qmouse, + Qmousein, Qmousectl, }; static Dirtab mousedir[]={ "cursor", {Qcursor}, 0, 0666, "mouse", {Qmouse}, 0, 0666, + "mousein", {Qmousein}, 0, 0220, "mousectl", {Qmousectl}, 0, 0220, }; @@ -127,6 +130,15 @@ mouseopen(Chan *c, int omode) mouse.ref++; unlock(&mouse); break; + case Qmousein: + lock(&mouse); + if(mouse.inopen){ + unlock(&mouse); + error(Einuse); + } + mouse.inopen = 1; + unlock(&mouse); + break; default: incref(&mouse); } @@ -151,6 +163,11 @@ mouseclose(Chan *c) lock(&mouse); if(c->qid.path == Qmouse) mouse.open = 0; + else if(c->qid.path == Qmousein){ + mouse.inopen = 0; + unlock(&mouse); + return; + } if(--mouse.ref == 0){ cursoroff(1); curs = arrow; @@ -259,7 +276,7 @@ mousewrite(Chan *c, void *va, long n, vlong) char *p; Point pt; char buf[64], *field[3]; - int nf; + int nf, b; p = va; switch(c->qid.path){ @@ -312,6 +329,22 @@ mousewrite(Chan *c, void *va, long n, vlong) mousectl(field, nf); return n; + case Qmousein: + if(n > sizeof buf-1) + n = sizeof buf -1; + memmove(buf, va, n); + buf[n] = 0; + p = 0; + pt.x = strtol(buf+1, &p, 0); + if(p == 0) + error(Eshort); + pt.y = strtol(p, &p, 0); + if(p == 0) + error(Eshort); + b = strtol(p, &p, 0); + mousetrack(b, pt.x, pt.y); + return n; + case Qmouse: if(n > sizeof buf-1) n = sizeof buf -1;