Lots of X fixes.
diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c
index b003638..f474986 100644
--- a/src/libdraw/devdraw.c
+++ b/src/libdraw/devdraw.c
@@ -138,6 +138,7 @@
_initdisplaymemimage(Display *d, Memimage *m)
{
screenimage = m;
+ m->screenref = 1;
client0 = mallocz(sizeof(Client), 1);
if(client0 == nil){
fprint(2, "initdraw: allocating client0: out of memory");
@@ -165,7 +166,16 @@
* about the resize through external means, so all we
* need to do is this assignment.
*/
+ Memimage *om;
+
+ qlock(&sdraw.lk);
+ om = screenimage;
screenimage = m;
+ m->screenref = 1;
+ if(om && --om->screenref == 0){
+ _freememimage(om);
+ }
+ qunlock(&sdraw.lk);
}
static
@@ -399,6 +409,8 @@
d->name = 0;
d->vers = 0;
d->image = i;
+ if(i->screenref)
+ ++i->screenref;
d->nfchar = 0;
d->fchar = 0;
d->fromname = 0;
@@ -534,11 +546,9 @@
drawfreedimage(dimage->fromname);
goto Return;
}
- //if(dimage->image == screenimage) /* don't free the display */
- // goto Return;
ds = dimage->dscreen;
+ l = dimage->image;
if(ds){
- l = dimage->image;
if(l->data == screenimage->data)
addflush(l->layer->screenr);
if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */
@@ -549,8 +559,12 @@
else
memlfree(l);
drawfreedscreen(ds);
- }else
- freememimage(dimage->image);
+ }else{
+ if(l->screenref==0)
+ freememimage(l);
+ else if(--l->screenref==0)
+ _freememimage(l);
+ }
Return:
free(dimage->fchar);
free(dimage);
@@ -732,6 +746,7 @@
{
int inbuf;
+ qlock(&sdraw.lk);
inbuf = d->obufp - d->obuf;
if(n > inbuf)
n = inbuf;
@@ -740,6 +755,7 @@
if(inbuf)
memmove(d->obuf, d->obufp-inbuf, inbuf);
d->obufp = d->obuf+inbuf;
+ qunlock(&sdraw.lk);
return n;
}
@@ -776,6 +792,7 @@
Refreshfn reffn;
Refx *refx;
+ qlock(&sdraw.lk);
d->obufp = d->obuf;
a = v;
m = 0;
@@ -1516,6 +1533,7 @@
continue;
}
}
+ qunlock(&sdraw.lk);
return oldn - n;
Enodrawimage:
@@ -1527,9 +1545,11 @@
Eshortdraw:
err = "short draw message";
goto error;
+/*
Eshortread:
err = "draw read too short";
goto error;
+*/
Eimageexists:
err = "image id in use";
goto error;
@@ -1551,6 +1571,7 @@
Eindex:
err = "character index out of range";
goto error;
+/*
Enoclient:
err = "no such draw client";
goto error;
@@ -1560,6 +1581,7 @@
Enameused:
err = "image name in use";
goto error;
+*/
Enoname:
err = "no image with that name";
goto error;
@@ -1580,7 +1602,8 @@
goto error;
error:
- drawerror(display, err);
+ werrstr("%s", err);
+ qunlock(&sdraw.lk);
return -1;
}