ref: 001e60ea4b45fec9cb40ab8fbbebc334b4d3e9f4
parent: 4ffcb7af644c7dcef8a845bf94dcfd159ec01aa6
author: Philip Silva <philip.silva@protonmail.com>
date: Sat Jul 30 05:27:45 EDT 2022
add hidpi-2fs.patch - first sketch for /dev/draw/geom
--- a/README
+++ b/README
@@ -6,5 +6,7 @@
- hidpi-3.patch: scale borders of rio and acme
(p9p commit c96d832)
- hidpi-drawterm-metal-cocoa.patch: hardcodes displaydpi to 200 (https://github.com/Plan9-Archive/drawterm-metal-cocoa)
+(- hidpi-2fs.patch: optional patch with /dev/draw/geom - at this point not super useful and very wip)
+
- acme-at.patch: can be applied to open paths containing @s (e.g. the internal Go module paths)
- wikidiff: diff 2 words using wikidiff.com
--- /dev/null
+++ b/hidpi-2fs.patch
@@ -1,0 +1,142 @@
+diff 8076b346fc51790964070d39e65c0afaaad49a0f uncommitted
+r--- a/sys/src/9/port/devdraw.c
++++ b/sys/src/9/port/devdraw.c
+@@ -15,6 +15,7 @@
+ enum
+ {
+ Qtopdir = 0,
++ Qgeom,
+ Qnew,
+ Qwinname,
+ Q3rd,
+@@ -262,14 +263,22 @@
+ */
+ switch(t){
+ case Q2nd:
+- if(s == 0){
++ if(s == 0 || s == 1){
+ case Qnew:
+- mkqid(&q, Qnew, 0, QTFILE);
+- devdir(c, q, "new", 0, eve, 0666, dp);
+- return 1;
++ if (s == 0) {
++ mkqid(&q, Qnew, 0, QTFILE);
++ devdir(c, q, "new", 0, eve, 0666, dp);
++ return 1;
++ }
++ case Qgeom:
++ if (s == 1) {
++ mkqid(&q, Qgeom, 0, QTFILE);
++ devdir(c, q, "geom", 0, eve, 0666, dp);
++ return 1;
++ }
+ }
+- if(s <= sdraw.nclient){
+- cl = sdraw.client[s-1];
++ if(s <= sdraw.nclient+1){
++ cl = sdraw.client[s-2];
+ if(cl == nil)
+ return 0;
+ sprint(up->genbuf, "%d", cl->clientid);
+@@ -812,9 +821,9 @@
+ int slot;
+
+ slot = CLIENTPATH(path);
+- if(slot == 0)
++ if(slot < 2)
+ return nil;
+- cl = sdraw.client[slot-1];
++ cl = sdraw.client[slot-2];
+ if(cl==0 || cl->clientid==0)
+ return nil;
+ return cl;
+@@ -1024,7 +1033,7 @@
+ cl = drawnewclient();
+ if(cl == 0)
+ error(Enodev);
+- c->qid.path = Qctl|((cl->slot+1)<<QSHIFT);
++ c->qid.path = Qctl|((cl->slot+2)<<QSHIFT);
+ }
+
+ switch(QID(c->qid)){
+@@ -1031,6 +1040,9 @@
+ case Qwinname:
+ break;
+
++ case Qgeom:
++ break;
++
+ case Qnew:
+ break;
+
+@@ -1124,7 +1136,7 @@
+ long
+ drawread(Chan *c, void *a, long n, vlong off)
+ {
+- int index, m;
++ int dpi, index, m;
+ ulong red, green, blue;
+ Client *cl;
+ uchar *p;
+@@ -1139,7 +1151,8 @@
+ if(QID(c->qid) == Qwinname)
+ return readstr(off, a, n, screenname);
+
+- cl = drawclient(c);
++ if(QID(c->qid) != Qgeom)
++ cl = drawclient(c);
+ dlock();
+ if(waserror()){
+ dunlock();
+@@ -1146,6 +1159,21 @@
+ nexterror();
+ }
+ switch(QID(c->qid)){
++ case Qgeom:
++ i = screenimage;
++ if(i == nil)
++ error(Enodrawimage);
++ if((p = (uchar*)getconf("dpi")) == nil || (dpi = atoi((char*)p)) == 0){
++ dpi=100;
++ }
++ p = malloc(6*12+1);
++ if(p == 0)
++ error(Enomem);
++ sprint((char*)p, "%11d %11d %11d %11d %11d %11d\n", i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y, dpi, dpi);
++ n = readstr(offset, a, n, (char*)p);
++ free(p);
++ break;
++
+ case Qctl:
+ if(n < 12*12)
+ error(Eshortread);
+@@ -1253,13 +1281,14 @@
+ static long
+ drawwrite(Chan *c, void *a, long n, vlong)
+ {
+- char buf[128], *fields[4], *q;
++ char buf[128], *fields[6], *q;
+ Client *cl;
+ int i, m, red, green, blue, x;
+
+ if(c->qid.type & QTDIR)
+ error(Eisdir);
+- cl = drawclient(c);
++ if(QID(c->qid) != Qgeom)
++ cl = drawclient(c);
+ dlock();
+ if(waserror()){
+ drawwakeall();
+@@ -1267,6 +1296,12 @@
+ nexterror();
+ }
+ switch(QID(c->qid)){
++ case Qgeom:
++ if(tokenize(a, fields, nelem(fields)) != 6)
++ error(Ebadarg);
++ n = strlen(a);
++ break;
++
+ case Qctl:
+ if(n != 4)
+ error("unknown draw control request");