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.
This commit is contained in:
parent
b4cc38f943
commit
d25d0ca1a3
7 changed files with 34 additions and 8 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue