itdevdraw, libdraw: handle keyboard runes > U+FFFF - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit d25d0ca1a3682d97df67f62789767562aa5bf1b3 /src/plan9port/commit/d25d0ca1a3682d97df67f62789767562aa5bf1b3.gph mx1.adamsgaard.dk 70 1parent b4cc38f94321c71e8d19fbbd4691e72f7c0d817b /src/plan9port/commit/b4cc38f94321c71e8d19fbbd4691e72f7c0d817b.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Mon, 18 May 2020 23:45:03 -0400 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 idevdraw, libdraw: handle keyboard runes > U+FFFF Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iRunes in Plan 9 were limited to the 16-bit BMP when I drew up Err mx1.adamsgaard.dk 70 itthe RPC protocol between graphical programs and devdraw Err mx1.adamsgaard.dk 70 ia long time ago. Now that they can be 32-bit, use a 32-bit wire Err mx1.adamsgaard.dk 70 iencoding too. A new message number to avoid problems with Err mx1.adamsgaard.dk 70 iother clients (like 9fans.net/go). Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iAdd keyboard shortcut alt : , for U+1F602, face with tears of joy, Err mx1.adamsgaard.dk 70 itto test that it all works. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M include/drawfcall.h | 11 ++++++++--- Err mx1.adamsgaard.dk 70 i M lib/keyboard | 1 + Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/mklatinkbd.c | 2 +- Err mx1.adamsgaard.dk 70 i M src/cmd/devdraw/srv.c | 9 +++++++-- Err mx1.adamsgaard.dk 70 i M src/libdraw/drawclient.c | 2 +- Err mx1.adamsgaard.dk 70 i M src/libdraw/drawfcall.c | 15 +++++++++++++++ Err mx1.adamsgaard.dk 70 i M src/libdraw/event.c | 2 +- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i7 files changed, 34 insertions(+), 8 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/include/drawfcall.h b/include/drawfcall.h /src/plan9port/file/include/drawfcall.h.gph mx1.adamsgaard.dk 70 it@@ -22,8 +22,11 @@ tag[1] Rbouncemouse Err mx1.adamsgaard.dk 70 i tag[1] Trdkbd Err mx1.adamsgaard.dk 70 i tag[1] Rrdkbd rune[2] Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+tag[1] Trdkbd4 Err mx1.adamsgaard.dk 70 i+tag[1] Rrdkbd4 rune[4] Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i tag[1] Tlabel label[s] Err mx1.adamsgaard.dk 70 i-tag[1] Rlabel Err mx1.adamsgaard.dk 70 i+tag[1] Rlabel Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i tag[1] Tctxt wsysid[s] Err mx1.adamsgaard.dk 70 i tag[1] Rctxt Err mx1.adamsgaard.dk 70 it@@ -31,7 +34,7 @@ tag[1] Rctxt Err mx1.adamsgaard.dk 70 i tag[1] Tinit winsize[s] label[s] font[s] Err mx1.adamsgaard.dk 70 i tag[1] Rinit Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i-tag[1] Trdsnarf Err mx1.adamsgaard.dk 70 i+tag[1] Trdsnarf Err mx1.adamsgaard.dk 70 i tag[1] Rrdsnarf snarf[s] Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i tag[1] Twrsnarf snarf[s] Err mx1.adamsgaard.dk 70 it@@ -47,7 +50,7 @@ tag[1] Ttop Err mx1.adamsgaard.dk 70 i tag[1] Rtop Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i tag[1] Tresize rect[4*4] Err mx1.adamsgaard.dk 70 i-tag[1] Rresize Err mx1.adamsgaard.dk 70 i+tag[1] Rresize Err mx1.adamsgaard.dk 70 i */ Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -99,6 +102,8 @@ enum { Err mx1.adamsgaard.dk 70 i Rcursor2, Err mx1.adamsgaard.dk 70 i Tctxt = 30, Err mx1.adamsgaard.dk 70 i Rctxt, Err mx1.adamsgaard.dk 70 i+ Trdkbd4 = 32, Err mx1.adamsgaard.dk 70 i+ Rrdkbd4, Err mx1.adamsgaard.dk 70 i Tmax, Err mx1.adamsgaard.dk 70 i }; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 1diff --git a/lib/keyboard b/lib/keyboard /src/plan9port/file/lib/keyboard.gph mx1.adamsgaard.dk 70 it@@ -584,3 +584,4 @@ Err mx1.adamsgaard.dk 70 i F015 ZA  raw alt (plan 9 specific) Err mx1.adamsgaard.dk 70 i F016 ZS  raw shift (plan 9 specific) Err mx1.adamsgaard.dk 70 i F017 ZC  raw ctl (plan 9 specific) Err mx1.adamsgaard.dk 70 i+1F602 :, 😂 face with tears of joy Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/mklatinkbd.c b/src/cmd/devdraw/mklatinkbd.c /src/plan9port/file/src/cmd/devdraw/mklatinkbd.c.gph mx1.adamsgaard.dk 70 it@@ -191,7 +191,7 @@ readfile(char *fname) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i r = strtol(line, nil, 16); Err mx1.adamsgaard.dk 70 i p = strchr(line, ' '); Err mx1.adamsgaard.dk 70 i- if(r == 0 || p != line+4 || p[0] != ' ' || p[1] != ' ') { Err mx1.adamsgaard.dk 70 i+ if(r == 0 || (p != line+4 && p != line+5) || p[0] != ' ' || (p == line+4 && p[1] != ' ')) { Err mx1.adamsgaard.dk 70 i fprint(2, "%s:%d: cannot parse line\n", fname, lineno); Err mx1.adamsgaard.dk 70 i continue; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c /src/plan9port/file/src/cmd/devdraw/srv.c.gph mx1.adamsgaard.dk 70 it@@ -229,6 +229,7 @@ runmsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i case Trdkbd: Err mx1.adamsgaard.dk 70 i+ case Trdkbd4: Err mx1.adamsgaard.dk 70 i qlock(&c->eventlk); Err mx1.adamsgaard.dk 70 i if((c->kbdtags.wi+1)%nelem(c->kbdtags.t) == c->kbdtags.ri) { Err mx1.adamsgaard.dk 70 i qunlock(&c->eventlk); Err mx1.adamsgaard.dk 70 it@@ -236,7 +237,7 @@ runmsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i replyerror(c, m); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- c->kbdtags.t[c->kbdtags.wi++] = m->tag; Err mx1.adamsgaard.dk 70 i+ c->kbdtags.t[c->kbdtags.wi++] = (m->tag<<1) | (m->type==Trdkbd4); Err mx1.adamsgaard.dk 70 i if(c->kbdtags.wi == nelem(c->kbdtags.t)) Err mx1.adamsgaard.dk 70 i c->kbdtags.wi = 0; Err mx1.adamsgaard.dk 70 i c->kbd.stall = 0; Err mx1.adamsgaard.dk 70 it@@ -357,13 +358,17 @@ replymsg(Client *c, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i static void Err mx1.adamsgaard.dk 70 i matchkbd(Client *c) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i+ int tag; Err mx1.adamsgaard.dk 70 i Wsysmsg m; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i if(c->kbd.stall) Err mx1.adamsgaard.dk 70 i return; Err mx1.adamsgaard.dk 70 i while(c->kbd.ri != c->kbd.wi && c->kbdtags.ri != c->kbdtags.wi){ Err mx1.adamsgaard.dk 70 i+ tag = c->kbdtags.t[c->kbdtags.ri++]; Err mx1.adamsgaard.dk 70 i m.type = Rrdkbd; Err mx1.adamsgaard.dk 70 i- m.tag = c->kbdtags.t[c->kbdtags.ri++]; Err mx1.adamsgaard.dk 70 i+ if(tag&1) Err mx1.adamsgaard.dk 70 i+ m.type = Rrdkbd4; Err mx1.adamsgaard.dk 70 i+ m.tag = tag>>1; Err mx1.adamsgaard.dk 70 i if(c->kbdtags.ri == nelem(c->kbdtags.t)) Err mx1.adamsgaard.dk 70 i c->kbdtags.ri = 0; Err mx1.adamsgaard.dk 70 i m.rune = c->kbd.r[c->kbd.ri++]; Err mx1.adamsgaard.dk 70 1diff --git a/src/libdraw/drawclient.c b/src/libdraw/drawclient.c /src/plan9port/file/src/libdraw/drawclient.c.gph mx1.adamsgaard.dk 70 it@@ -333,7 +333,7 @@ _displayrdkbd(Display *d, Rune *r) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i Wsysmsg tx, rx; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- tx.type = Trdkbd; Err mx1.adamsgaard.dk 70 i+ tx.type = Trdkbd4; Err mx1.adamsgaard.dk 70 i if(displayrpc(d, &tx, &rx, nil) < 0) Err mx1.adamsgaard.dk 70 i return -1; Err mx1.adamsgaard.dk 70 i *r = rx.rune; Err mx1.adamsgaard.dk 70 1diff --git a/src/libdraw/drawfcall.c b/src/libdraw/drawfcall.c /src/plan9port/file/src/libdraw/drawfcall.c.gph mx1.adamsgaard.dk 70 it@@ -50,6 +50,7 @@ sizeW2M(Wsysmsg *m) Err mx1.adamsgaard.dk 70 i case Rcursor: Err mx1.adamsgaard.dk 70 i case Rcursor2: Err mx1.adamsgaard.dk 70 i case Trdkbd: Err mx1.adamsgaard.dk 70 i+ case Trdkbd4: Err mx1.adamsgaard.dk 70 i case Rlabel: Err mx1.adamsgaard.dk 70 i case Rctxt: Err mx1.adamsgaard.dk 70 i case Rinit: Err mx1.adamsgaard.dk 70 it@@ -73,6 +74,8 @@ sizeW2M(Wsysmsg *m) Err mx1.adamsgaard.dk 70 i return 4+1+1+_stringsize(m->error); Err mx1.adamsgaard.dk 70 i case Rrdkbd: Err mx1.adamsgaard.dk 70 i return 4+1+1+2; Err mx1.adamsgaard.dk 70 i+ case Rrdkbd4: Err mx1.adamsgaard.dk 70 i+ return 4+1+1+4; Err mx1.adamsgaard.dk 70 i case Tlabel: Err mx1.adamsgaard.dk 70 i return 4+1+1+_stringsize(m->label); Err mx1.adamsgaard.dk 70 i case Tctxt: Err mx1.adamsgaard.dk 70 it@@ -117,6 +120,7 @@ convW2M(Wsysmsg *m, uchar *p, uint n) Err mx1.adamsgaard.dk 70 i case Rcursor: Err mx1.adamsgaard.dk 70 i case Rcursor2: Err mx1.adamsgaard.dk 70 i case Trdkbd: Err mx1.adamsgaard.dk 70 i+ case Trdkbd4: Err mx1.adamsgaard.dk 70 i case Rlabel: Err mx1.adamsgaard.dk 70 i case Rctxt: Err mx1.adamsgaard.dk 70 i case Rinit: Err mx1.adamsgaard.dk 70 it@@ -166,6 +170,9 @@ convW2M(Wsysmsg *m, uchar *p, uint n) Err mx1.adamsgaard.dk 70 i case Rrdkbd: Err mx1.adamsgaard.dk 70 i PUT2(p+6, m->rune); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i+ case Rrdkbd4: Err mx1.adamsgaard.dk 70 i+ PUT(p+6, m->rune); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i case Tlabel: Err mx1.adamsgaard.dk 70 i PUTSTRING(p+6, m->label); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 it@@ -221,6 +228,7 @@ convM2W(uchar *p, uint n, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i case Rcursor: Err mx1.adamsgaard.dk 70 i case Rcursor2: Err mx1.adamsgaard.dk 70 i case Trdkbd: Err mx1.adamsgaard.dk 70 i+ case Trdkbd4: Err mx1.adamsgaard.dk 70 i case Rlabel: Err mx1.adamsgaard.dk 70 i case Rctxt: Err mx1.adamsgaard.dk 70 i case Rinit: Err mx1.adamsgaard.dk 70 it@@ -270,6 +278,9 @@ convM2W(uchar *p, uint n, Wsysmsg *m) Err mx1.adamsgaard.dk 70 i case Rrdkbd: Err mx1.adamsgaard.dk 70 i GET2(p+6, m->rune); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i+ case Rrdkbd4: Err mx1.adamsgaard.dk 70 i+ GET(p+6, m->rune); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i case Tlabel: Err mx1.adamsgaard.dk 70 i GETSTRING(p+6, &m->label); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 it@@ -360,6 +371,10 @@ drawfcallfmt(Fmt *fmt) Err mx1.adamsgaard.dk 70 i return fmtprint(fmt, "Trdkbd"); Err mx1.adamsgaard.dk 70 i case Rrdkbd: Err mx1.adamsgaard.dk 70 i return fmtprint(fmt, "Rrdkbd rune=%C", m->rune); Err mx1.adamsgaard.dk 70 i+ case Trdkbd4: Err mx1.adamsgaard.dk 70 i+ return fmtprint(fmt, "Trdkbd4"); Err mx1.adamsgaard.dk 70 i+ case Rrdkbd4: Err mx1.adamsgaard.dk 70 i+ return fmtprint(fmt, "Rrdkbd4 rune=%C", m->rune); Err mx1.adamsgaard.dk 70 i case Tlabel: Err mx1.adamsgaard.dk 70 i return fmtprint(fmt, "Tlabel label='%s'", m->label); Err mx1.adamsgaard.dk 70 i case Rlabel: Err mx1.adamsgaard.dk 70 1diff --git a/src/libdraw/event.c b/src/libdraw/event.c /src/plan9port/file/src/libdraw/event.c.gph mx1.adamsgaard.dk 70 it@@ -284,7 +284,7 @@ extract(int canblock) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i }else if(i == Skeyboard){ Err mx1.adamsgaard.dk 70 i if(eslave[i].rpc == nil) Err mx1.adamsgaard.dk 70 i- eslave[i].rpc = startrpc(Trdkbd); Err mx1.adamsgaard.dk 70 i+ eslave[i].rpc = startrpc(Trdkbd4); Err mx1.adamsgaard.dk 70 i if(eslave[i].rpc){ Err mx1.adamsgaard.dk 70 i /* if ready, don't block in select */ Err mx1.adamsgaard.dk 70 i if(eslave[i].rpc->p) Err mx1.adamsgaard.dk 70 .