devdraw, libdraw: add display->dpi

Fixed at 100 right now, but the plan is to make it accurate
and then use it.

R=rsc
http://codereview.appspot.com/6856091
diff --git a/include/draw.h b/include/draw.h
index 07992c2..3e21ff1 100644
--- a/include/draw.h
+++ b/include/draw.h
@@ -204,6 +204,7 @@
 	int		_isnewdisplay;
 	struct Mux	*mux;
 	int		srvfd;
+	int		dpi;
 };
 
 struct Image
diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c
index 0e2226c..3fabd34 100644
--- a/src/cmd/devdraw/devdraw.c
+++ b/src/cmd/devdraw/devdraw.c
@@ -11,6 +11,7 @@
 #include "devdraw.h"
 
 extern void _flushmemscreen(Rectangle);
+int displaydpi = 100;
 
 #define NHASH (1<<5)
 #define HASHMASK (NHASH-1)
@@ -776,6 +777,7 @@
 	DName *dn;
 	DScreen *dscrn;
 	FChar *fc;
+	Fmt fmt;
 	Memimage *dst, *i, *l, **lp, *mask, *src;
 	Memscreen *scrn;
 	Point p, *pp, q, sp;
@@ -1083,7 +1085,31 @@
 			memmove(client->readdata, ibuf, ni);
 			client->nreaddata = ni;
 			client->infoid = -1;
-			continue;	
+			continue;
+		
+		/* query: 'Q' n[1] queryspec[n] */
+		case 'q':
+			if(n < 2)
+				goto Eshortdraw;
+			m = 1+1+a[1];
+			if(n < m)
+				goto Eshortdraw;
+			fmtstrinit(&fmt);
+			for(c=0; c<a[1]; c++) {
+				switch(a[2+c]) {
+				default:
+					err = "unknown query";
+					goto error;
+				case 'd':	/* dpi */
+					fmtprint(&fmt, "%11d ", displaydpi);
+					break;
+				}
+			}
+			client->readdata = (uchar*)fmtstrflush(&fmt);
+			if(client->readdata == nil)
+				goto Enomem;
+			client->nreaddata = strlen((char*)client->readdata);
+			continue;
 
 		/* load character: 'l' fontid[4] srcid[4] index[2] R[4*4] P[2*4] left[1] width[1] */
 		case 'l':
diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h
index 7abf212..454cfe0 100644
--- a/src/cmd/devdraw/devdraw.h
+++ b/src/cmd/devdraw/devdraw.h
@@ -6,4 +6,4 @@
 int mouseswap(int);
 void abortcompose(void);
 
-
+extern int displaydpi;
diff --git a/src/libdraw/init.c b/src/libdraw/init.c
index 0ddb3ad..c698ec6 100644
--- a/src/libdraw/init.c
+++ b/src/libdraw/init.c
@@ -179,6 +179,15 @@
 	image->clipr.min.y = atoi(info+9*12);
 	image->clipr.max.x = atoi(info+10*12);
 	image->clipr.max.y = atoi(info+11*12);
+	
+	a = bufimage(d, 3);
+	a[0] = 'q';
+	a[1] = 1;
+	a[2] = 'd';
+	d->dpi = 100;
+	if(flushimage(d, 0) >= 0 && _displayrddraw(d, info, 12) == 12)
+		d->dpi = atoi(info);
+
 	return image;
 }