@@ 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);
- }
+ }
}
}
@@ 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;