commit d25d0ca1a3682d97df67f62789767562aa5bf1b3 from: Russ Cox date: Tue May 19 03:45:03 2020 UTC devdraw, libdraw: handle keyboard runes > U+FFFF Runes in Plan 9 were limited to the 16-bit BMP when I drew up the RPC protocol between graphical programs and devdraw a long time ago. Now that they can be 32-bit, use a 32-bit wire encoding too. A new message number to avoid problems with other clients (like 9fans.net/go). Add keyboard shortcut alt : , for U+1F602, face with tears of joy, to test that it all works. commit - b4cc38f94321c71e8d19fbbd4691e72f7c0d817b commit + d25d0ca1a3682d97df67f62789767562aa5bf1b3 blob - 8b9656d55db5b68c589522f75517bea2fdf1463c blob + b8535fb655719305bec3c1bbec8d669cddee1fee --- include/drawfcall.h +++ include/drawfcall.h @@ -22,8 +22,11 @@ tag[1] Rbouncemouse tag[1] Trdkbd tag[1] Rrdkbd rune[2] +tag[1] Trdkbd4 +tag[1] Rrdkbd4 rune[4] + tag[1] Tlabel label[s] -tag[1] Rlabel +tag[1] Rlabel tag[1] Tctxt wsysid[s] tag[1] Rctxt @@ -31,7 +34,7 @@ tag[1] Rctxt tag[1] Tinit winsize[s] label[s] font[s] tag[1] Rinit -tag[1] Trdsnarf +tag[1] Trdsnarf tag[1] Rrdsnarf snarf[s] tag[1] Twrsnarf snarf[s] @@ -47,7 +50,7 @@ tag[1] Ttop tag[1] Rtop tag[1] Tresize rect[4*4] -tag[1] Rresize +tag[1] Rresize */ @@ -99,6 +102,8 @@ enum { Rcursor2, Tctxt = 30, Rctxt, + Trdkbd4 = 32, + Rrdkbd4, Tmax, }; blob - a1574a365f1a7e8c2b52882cb38ca0095e08647e blob + 1a0e85a50485f9914b3c55a14277032a067f8790 --- lib/keyboard +++ lib/keyboard @@ -584,3 +584,4 @@ F015 ZA  raw alt (plan 9 specific) F016 ZS  raw shift (plan 9 specific) F017 ZC  raw ctl (plan 9 specific) +1F602 :, 😂 face with tears of joy blob - db34b6ecebc5c8fe646ae3c6cff752f3fda79474 blob + 50dd26b05d70602b347b054e5144aa2d3977ece2 --- src/cmd/devdraw/mklatinkbd.c +++ src/cmd/devdraw/mklatinkbd.c @@ -191,7 +191,7 @@ readfile(char *fname) r = strtol(line, nil, 16); p = strchr(line, ' '); - if(r == 0 || p != line+4 || p[0] != ' ' || p[1] != ' ') { + if(r == 0 || (p != line+4 && p != line+5) || p[0] != ' ' || (p == line+4 && p[1] != ' ')) { fprint(2, "%s:%d: cannot parse line\n", fname, lineno); continue; } blob - bdfc16547e755ed27311bbdffa0b347352447dcc blob + 05a08fda4ea7306aba7ee492fa74c4697ecd7a94 --- src/cmd/devdraw/srv.c +++ src/cmd/devdraw/srv.c @@ -229,6 +229,7 @@ runmsg(Client *c, Wsysmsg *m) break; case Trdkbd: + case Trdkbd4: qlock(&c->eventlk); if((c->kbdtags.wi+1)%nelem(c->kbdtags.t) == c->kbdtags.ri) { qunlock(&c->eventlk); @@ -236,7 +237,7 @@ runmsg(Client *c, Wsysmsg *m) replyerror(c, m); break; } - c->kbdtags.t[c->kbdtags.wi++] = m->tag; + c->kbdtags.t[c->kbdtags.wi++] = (m->tag<<1) | (m->type==Trdkbd4); if(c->kbdtags.wi == nelem(c->kbdtags.t)) c->kbdtags.wi = 0; c->kbd.stall = 0; @@ -357,13 +358,17 @@ replymsg(Client *c, Wsysmsg *m) static void matchkbd(Client *c) { + int tag; Wsysmsg m; if(c->kbd.stall) return; while(c->kbd.ri != c->kbd.wi && c->kbdtags.ri != c->kbdtags.wi){ + tag = c->kbdtags.t[c->kbdtags.ri++]; m.type = Rrdkbd; - m.tag = c->kbdtags.t[c->kbdtags.ri++]; + if(tag&1) + m.type = Rrdkbd4; + m.tag = tag>>1; if(c->kbdtags.ri == nelem(c->kbdtags.t)) c->kbdtags.ri = 0; m.rune = c->kbd.r[c->kbd.ri++]; blob - 9376f9c00958cf19f755850320077dfe11a96a09 blob + c38f4801b5adb7f2da660751f59582d04066d853 --- src/libdraw/drawclient.c +++ src/libdraw/drawclient.c @@ -333,7 +333,7 @@ _displayrdkbd(Display *d, Rune *r) { Wsysmsg tx, rx; - tx.type = Trdkbd; + tx.type = Trdkbd4; if(displayrpc(d, &tx, &rx, nil) < 0) return -1; *r = rx.rune; blob - eea140956f54bba15c9d5a34954527879b72752a blob + 941153844eaed56b801f447e1b4847cdfd38f96c --- src/libdraw/drawfcall.c +++ src/libdraw/drawfcall.c @@ -50,6 +50,7 @@ sizeW2M(Wsysmsg *m) case Rcursor: case Rcursor2: case Trdkbd: + case Trdkbd4: case Rlabel: case Rctxt: case Rinit: @@ -73,6 +74,8 @@ sizeW2M(Wsysmsg *m) return 4+1+1+_stringsize(m->error); case Rrdkbd: return 4+1+1+2; + case Rrdkbd4: + return 4+1+1+4; case Tlabel: return 4+1+1+_stringsize(m->label); case Tctxt: @@ -117,6 +120,7 @@ convW2M(Wsysmsg *m, uchar *p, uint n) case Rcursor: case Rcursor2: case Trdkbd: + case Trdkbd4: case Rlabel: case Rctxt: case Rinit: @@ -166,6 +170,9 @@ convW2M(Wsysmsg *m, uchar *p, uint n) case Rrdkbd: PUT2(p+6, m->rune); break; + case Rrdkbd4: + PUT(p+6, m->rune); + break; case Tlabel: PUTSTRING(p+6, m->label); break; @@ -221,6 +228,7 @@ convM2W(uchar *p, uint n, Wsysmsg *m) case Rcursor: case Rcursor2: case Trdkbd: + case Trdkbd4: case Rlabel: case Rctxt: case Rinit: @@ -270,6 +278,9 @@ convM2W(uchar *p, uint n, Wsysmsg *m) case Rrdkbd: GET2(p+6, m->rune); break; + case Rrdkbd4: + GET(p+6, m->rune); + break; case Tlabel: GETSTRING(p+6, &m->label); break; @@ -360,6 +371,10 @@ drawfcallfmt(Fmt *fmt) return fmtprint(fmt, "Trdkbd"); case Rrdkbd: return fmtprint(fmt, "Rrdkbd rune=%C", m->rune); + case Trdkbd4: + return fmtprint(fmt, "Trdkbd4"); + case Rrdkbd4: + return fmtprint(fmt, "Rrdkbd4 rune=%C", m->rune); case Tlabel: return fmtprint(fmt, "Tlabel label='%s'", m->label); case Rlabel: blob - 9d7e10c23607cf5f624ed3368150ce72bf128064 blob + e2d5f70724177b3b87937676e77125e6c0a0aa60 --- src/libdraw/event.c +++ src/libdraw/event.c @@ -284,7 +284,7 @@ extract(int canblock) } }else if(i == Skeyboard){ if(eslave[i].rpc == nil) - eslave[i].rpc = startrpc(Trdkbd); + eslave[i].rpc = startrpc(Trdkbd4); if(eslave[i].rpc){ /* if ready, don't block in select */ if(eslave[i].rpc->p)