ref: 788f634a3cedef5d5ebc82860976320ad3584cbf
dir: /hidpi-1.patch/
diff c7dcc82b0be805717efbe77c98eaadf3ee1e31af uncommitted --- a/sys/include/ape/draw.h +++ b/sys/include/ape/draw.h @@ -208,6 +208,7 @@ Image *windows; Image *screenimage; int _isnewdisplay; + int dpi; }; struct Image --- a/sys/include/draw.h +++ b/sys/include/draw.h @@ -200,6 +200,7 @@ Image *windows; Image *screenimage; int _isnewdisplay; + int dpi; }; struct Image --- a/sys/src/9/port/devdraw.c +++ b/sys/src/9/port/devdraw.c @@ -77,6 +77,8 @@ int refreshme; int infoid; int op; + int displaydpi; + int forcedpi; }; struct Refresh @@ -785,6 +789,7 @@ cl->slot = i; cl->clientid = ++sdraw.clientid; cl->op = SoverD; + cl->displaydpi=100; sdraw.client[i] = cl; return cl; } @@ -1396,6 +1401,7 @@ int c, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, op, ox, oy, oesize, esize, doflush; uchar *u, *a, refresh; char *fmt; + Fmt f; ulong value, chan; Rectangle r, clipr; Point p, q, *pp, sp; @@ -1643,6 +1649,35 @@ font->nfchar = ni; font->ascent = a[9]; continue; + + /* query: 'Q' n[1] queryspec[n] */ + case 'q': + if(n < 2) { + error(Eshortdraw); + } + m = 1+1+a[1]; + if(n < m) { + error(Eshortdraw); + } + fmtstrinit(&f); + for(c=0; c<a[1]; c++) { + switch(a[2+c]) { + default: + error("unknown query"); + case 'd': /* dpi */ + if(client->forcedpi) + fmtprint(&f, "%11d ", client->forcedpi); + else + fmtprint(&f, "%11d ", client->displaydpi); + break; + } + } + client->readdata = (uchar*)fmtstrflush(&f); + if(client->readdata == nil) + error(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': --- a/sys/src/libdraw/init.c +++ b/sys/src/libdraw/init.c @@ -197,6 +197,7 @@ Display* initdisplay(char *dev, char *win, void(*error)(Display*, char*)) { + uchar *a; char buf[128], info[NINFO+1], *t, isnew; int n, datafd, ctlfd, reffd; Display *disp; @@ -319,6 +320,18 @@ if(dir!=nil && dir->qid.vers==1) /* other way to tell */ disp->_isnewdisplay = 1; free(dir); + + a = bufimage(disp, 3); + if(a == nil) + goto Error5; + a[0] = 'q'; + a[1] = 1; + a[2] = 'd'; + disp->dpi = 100; + if(flushimage(disp, 0) >= 0) { + if((read(datafd, info, sizeof info)) == 12) + disp->dpi = atoi(info); + } return disp; }