URI: 
       tdevdraw, libdraw: handle keyboard runes > U+FFFF - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit d25d0ca1a3682d97df67f62789767562aa5bf1b3
   DIR parent b4cc38f94321c71e8d19fbbd4691e72f7c0d817b
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Mon, 18 May 2020 23:45:03 -0400
       
       devdraw, libdraw: handle keyboard runes > U+FFFF
       
       Runes in Plan 9 were limited to the 16-bit BMP when I drew up
       tthe 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,
       tto test that it all works.
       
       Diffstat:
         M include/drawfcall.h                 |      11 ++++++++---
         M lib/keyboard                        |       1 +
         M src/cmd/devdraw/mklatinkbd.c        |       2 +-
         M src/cmd/devdraw/srv.c               |       9 +++++++--
         M src/libdraw/drawclient.c            |       2 +-
         M src/libdraw/drawfcall.c             |      15 +++++++++++++++
         M src/libdraw/event.c                 |       2 +-
       
       7 files changed, 34 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/include/drawfcall.h b/include/drawfcall.h
       t@@ -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
       t@@ -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]
       t@@ -47,7 +50,7 @@ tag[1] Ttop
        tag[1] Rtop
        
        tag[1] Tresize rect[4*4]
       -tag[1] Rresize 
       +tag[1] Rresize
        */
        
        
       t@@ -99,6 +102,8 @@ enum {
                Rcursor2,
                Tctxt = 30,
                Rctxt,
       +        Trdkbd4 = 32,
       +        Rrdkbd4,
                Tmax,
        };
        
   DIR diff --git a/lib/keyboard b/lib/keyboard
       t@@ -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
   DIR diff --git a/src/cmd/devdraw/mklatinkbd.c b/src/cmd/devdraw/mklatinkbd.c
       t@@ -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;
                        }
   DIR diff --git a/src/cmd/devdraw/srv.c b/src/cmd/devdraw/srv.c
       t@@ -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);
       t@@ -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;
       t@@ -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++];
   DIR diff --git a/src/libdraw/drawclient.c b/src/libdraw/drawclient.c
       t@@ -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;
   DIR diff --git a/src/libdraw/drawfcall.c b/src/libdraw/drawfcall.c
       t@@ -50,6 +50,7 @@ sizeW2M(Wsysmsg *m)
                case Rcursor:
                case Rcursor2:
                case Trdkbd:
       +        case Trdkbd4:
                case Rlabel:
                case Rctxt:
                case Rinit:
       t@@ -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:
       t@@ -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:
       t@@ -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;
       t@@ -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:
       t@@ -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;
       t@@ -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:
   DIR diff --git a/src/libdraw/event.c b/src/libdraw/event.c
       t@@ -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)