t9term, mc: conspire to handle hidpi displays - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d296c18e379547218c4c50445c56e725ec3be91d
 (DIR) parent 657f699ef7e5a91a529337cac76ed48c68a28583
 (HTM) Author: Russ Cox <rsc@swtch.com>
       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 <rsc@swtch.com>
       
       Diffstat:
         M src/cmd/9term/bsdpty.c              |       8 ++++++++
         M src/cmd/draw/mc.c                   |      19 ++++++++++++++++++-
       
       2 files changed, 26 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/cmd/9term/bsdpty.c b/src/cmd/9term/bsdpty.c
       t@@ -11,6 +11,7 @@
        #endif
        #include <fcntl.h>
        #include <libc.h>
       +#include <draw.h>
        #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");
 (DIR) 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;