9term, mc: conspire to handle hidpi displays

9term now uses the low bit of ws.ws_ypixel to signal
whether this is a hidpi display, and mc adjusts the font
it uses for columnation accordingly.

Makes 'lc' work right on hidpi displays.

Change-Id: I52928871ffb7f4c6fd6722f3d59f1836379148c6
Reviewed-on: https://plan9port-review.googlesource.com/2760
Reviewed-by: Russ Cox <rsc@swtch.com>
diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
index 4836d24..fe0367f 100644
--- a/src/cmd/9term/bsdpty.c
+++ b/src/cmd/9term/bsdpty.c
@@ -11,6 +11,7 @@
 #endif
 #include <fcntl.h>
 #include <libc.h>
+#include <draw.h>
 #include "term.h"
 
 #define debug 0
@@ -75,7 +76,14 @@
 	ws.ws_row = row;
 	ws.ws_col = col;
 	ws.ws_xpixel = dx;
+
+
+	// Leave "is this a hidpi display" in the low bit of the ypixel height for mc.
+	dy &= ~1;
+	if(display->dpi >= DefaultDPI*3/2)
+		dy |= 1;
 	ws.ws_ypixel = dy;
+
 	if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col){
 		if(ioctl(rcfd, TIOCSWINSZ, &ws) < 0)
 			fprint(2, "ioctl: %r\n");
diff --git a/src/cmd/draw/mc.c b/src/cmd/draw/mc.c
index 3f9c21f..c24d67b 100644
--- a/src/cmd/draw/mc.c
+++ b/src/cmd/draw/mc.c
@@ -268,9 +268,10 @@
 getwidth(void)
 {
 	CFsys *fs;
-	char buf[500], *p, *f[10];
+	char buf[500], *p, *q, *f[10];
 	int fd, n, nf;
 	struct winsize ws;
+	Font *f1;
 
 	if((p = getenv("winid")) != nil){
 		fs = nsmount("acme", "");
@@ -306,6 +307,22 @@
 	if(ws.ws_xpixel == 0)
 		font = nil;
 	if(font){
+		// 9term leaves "is this a hidpi display" in the low bit of the ypixel height.
+		if(ws.ws_ypixel&1) {
+			// need hidpi font.
+			// loadhifpi creates a font that crashes in stringwidth,
+			// for reasons i don't understand.
+			// do it ourselves
+			p = getenv("font");
+			q = strchr(p, ',');
+			f1 = nil;
+			if(q != nil)
+				f1 = openfont(nil, q+1);
+			if(f1 != nil)
+				font = f1;
+			else
+				ws.ws_xpixel /= 2;
+		}
 		mintab = stringwidth(font, "0");
 		if((p = getenv("tabstop")) != nil)
 			tabwid = atoi(p)*mintab;