t9term, mc: conspire to handle hidpi displays - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit d296c18e379547218c4c50445c56e725ec3be91d
parent 657f699ef7e5a91a529337cac76ed48c68a28583
Author: Russ Cox 
Date:   Fri,  6 Jan 2017 10:35:12 -0500

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 

Diffstat:
  M src/cmd/9term/bsdpty.c              |       8 ++++++++
  M src/cmd/draw/mc.c                   |      19 ++++++++++++++++++-

2 files changed, 26 insertions(+), 1 deletion(-)
---
diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
t@@ -11,6 +11,7 @@
 #endif
 #include 
 #include 
+#include 
 #include "term.h"
 
 #define debug 0
t@@ -75,7 +76,14 @@ updatewinsize(int row, int col, int dx, int dy)
         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
t@@ -268,9 +268,10 @@ void
 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", "");
t@@ -306,6 +307,22 @@ getwidth(void)
         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;