Lots of X fixes.

This commit is contained in:
rsc 2003-10-11 02:47:43 +00:00
parent 4af386f434
commit 161060a463
14 changed files with 237 additions and 31 deletions

View file

@ -138,6 +138,7 @@ void
_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 @@ _drawreplacescreenimage(Memimage *m)
* 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 @@ drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen)
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 *dimage)
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 @@ drawfreedimage(DImage *dimage)
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 @@ _drawmsgread(Display *d, void *a, int n)
{
int inbuf;
qlock(&sdraw.lk);
inbuf = d->obufp - d->obuf;
if(n > inbuf)
n = inbuf;
@ -740,6 +755,7 @@ _drawmsgread(Display *d, void *a, int n)
if(inbuf)
memmove(d->obuf, d->obufp-inbuf, inbuf);
d->obufp = d->obuf+inbuf;
qunlock(&sdraw.lk);
return n;
}
@ -776,6 +792,7 @@ _drawmsgwrite(Display *d, void *v, int n)
Refreshfn reffn;
Refx *refx;
qlock(&sdraw.lk);
d->obufp = d->obuf;
a = v;
m = 0;
@ -1516,6 +1533,7 @@ _drawmsgwrite(Display *d, void *v, int n)
continue;
}
}
qunlock(&sdraw.lk);
return oldn - n;
Enodrawimage:
@ -1527,9 +1545,11 @@ Enodrawscreen:
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 @@ Enotfont:
Eindex:
err = "character index out of range";
goto error;
/*
Enoclient:
err = "no such draw client";
goto error;
@ -1560,6 +1581,7 @@ Edepth:
Enameused:
err = "image name in use";
goto error;
*/
Enoname:
err = "no image with that name";
goto error;
@ -1580,7 +1602,8 @@ Ebadarg:
goto error;
error:
drawerror(display, err);
werrstr("%s", err);
qunlock(&sdraw.lk);
return -1;
}