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;
 }