From b567422f98b815a45fa8e7144057a8834e98616b Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sun, 2 Jan 2011 15:39:09 -0500 Subject: keyboard(7): document X compose sequences Add -x flag to mklatinkbd to generate file for $HOME/.XCompose. Thanks to Anthony Martin, Tony Lainson, and Kris Maglione for legwork. R=rsc http://codereview.appspot.com/3811043 --- src/cmd/devdraw/mkfile | 1 + src/cmd/devdraw/mklatinkbd.c | 130 +++++++++++++++++++++++++++++++++++-------- src/cmd/devdraw/x11-itrans.c | 3 +- 3 files changed, 111 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/cmd/devdraw/mkfile b/src/cmd/devdraw/mkfile index d3505bcf..83f55242 100644 --- a/src/cmd/devdraw/mkfile +++ b/src/cmd/devdraw/mkfile @@ -48,3 +48,4 @@ $O.macargv: macargv.$O $LD -o $target $prereq install: $MACARGV +install: mklatinkbd.install diff --git a/src/cmd/devdraw/mklatinkbd.c b/src/cmd/devdraw/mklatinkbd.c index 64787f00..2e48332e 100644 --- a/src/cmd/devdraw/mklatinkbd.c +++ b/src/cmd/devdraw/mklatinkbd.c @@ -9,6 +9,7 @@ #include int rflag; +int xflag; enum { MAXLD = 2, /* latin1.c assumes this is 2 */ @@ -115,39 +116,56 @@ cprints(Biobuf *b, char *p) cprintchar(b, *p++); } +void +xprint(Biobuf *b, int c) +{ +} void printtrie(Biobuf *b, Trie *t) { int i; + char *p; for(i=0; i<256; i++) if(t->link[i]) printtrie(b, t->link[i]); + if(t->n == 0) + return; + + if(xflag) { + for(i=0; i<256; i++) { + if(t->r[i] == 0) + continue; + Bprint(b, ""); + for(p=t->seq; *p; p++) + Bprint(b, " %k", *p); + Bprint(b, " %k : \"%C\" U%04X\n", i, t->r[i], t->r[i]); + } + return; + } - if(t->n > 0) { - Bprint(b, "\t\""); - cprints(b, t->seq); - Bprint(b, "\", \""); + Bprint(b, "\t\""); + cprints(b, t->seq); + Bprint(b, "\", \""); + for(i=0; i<256; i++) + if(t->r[i]) + cprintchar(b, i); + Bprint(b, "\",\t"); + if(rflag) { + Bprint(b, "{"); for(i=0; i<256; i++) if(t->r[i]) - cprintchar(b, i); - Bprint(b, "\",\t"); - if(rflag) { - Bprint(b, "{"); - for(i=0; i<256; i++) - if(t->r[i]) - Bprint(b, " 0x%.4ux,", t->r[i]); - Bprint(b, " }"); - } else { - Bprint(b, "L\""); - for(i=0; i<256; i++) - if(t->r[i]) - Bprint(b, "%C", t->r[i]); - Bprint(b, "\""); - } - Bprint(b, ",\n"); - } + Bprint(b, " 0x%.4ux,", t->r[i]); + Bprint(b, " }"); + } else { + Bprint(b, "L\""); + for(i=0; i<256; i++) + if(t->r[i]) + Bprint(b, "%C", t->r[i]); + Bprint(b, "\""); + } + Bprint(b, ",\n"); } void @@ -207,15 +225,21 @@ usage(void) exits("usage"); } +int kfmt(Fmt*); + void main(int argc, char **argv) { + int i; Biobuf bout; ARGBEGIN{ case 'r': /* print rune values */ rflag = 1; break; + case 'x': + xflag = 1; + break; default: usage(); }ARGEND @@ -223,10 +247,72 @@ main(int argc, char **argv) if(argc > 1) usage(); - readfile(argc == 1 ? argv[0] : "/fd/0"); + fmtinstall('k', kfmt); + readfile(argc == 1 ? argv[0] : "/dev/stdin"); Binit(&bout, 1, OWRITE); + if(xflag) { + Bprint(&bout, "# Generated by mklatinkbd -x; do not edit.\n"); + for(i=0x20; i<0x10000; i++) + Bprint(&bout, " <%x> <%x> <%x> <%x> : \"%C\" U%04X\n", + (i>>12)&0xf, (i>>8)&0xf, (i>>4)&0xf, i&0xf, i, i); + } if(root) printtrie(&bout, root); exits(0); } + +// X11 key names + +struct { + int c; + char *s; +} xkey[] = { + ' ', "space", + '!', "exclam", + '"', "quotedbl", + '#', "numbersign", + '$', "dollar", + '%', "percent", + '&', "ampersand", + '\'', "apostrophe", + '(', "parenleft", + ')', "parenright", + '*', "asterisk", + '+', "plus", + ',', "comma", + '-', "minus", + '.', "period", + '/', "slash", + ':', "colon", + ';', "semicolon", + '<', "less", + '=', "equal", + '>', "greater", + '?', "question", + '@', "at", + '[', "bracketleft", + '\\', "backslash", + ',', "bracketright", + '^', "asciicircum", + '_', "underscore", + '`', "grave", + '{', "braceleft", + '|', "bar", + '}', "braceright", + '~', "asciitilde", +}; + +int +kfmt(Fmt *f) +{ + int i, c; + + c = va_arg(f->args, int); + for(i=0; xkey[i].s; i++) + if(xkey[i].c == c) + return fmtprint(f, "<%s>", xkey[i].s); + return fmtprint(f, "<%c>", c); +} + + diff --git a/src/cmd/devdraw/x11-itrans.c b/src/cmd/devdraw/x11-itrans.c index a753fb6f..ff127c04 100644 --- a/src/cmd/devdraw/x11-itrans.c +++ b/src/cmd/devdraw/x11-itrans.c @@ -37,7 +37,7 @@ __xtoplan9kbd(XEvent *e) needstack(64*1024); /* X has some *huge* buffers in openobject */ /* and they're even bigger on SuSE */ XLookupString((XKeyEvent*)e,NULL,0,&k,NULL); - if(k == XK_Multi_key || k == NoSymbol) + if(k == k == NoSymbol) return -1; if(k&0xFF00){ @@ -113,6 +113,7 @@ __xtoplan9kbd(XEvent *e) case XK_Meta_L: /* Shift Alt on PCs */ case XK_Alt_R: case XK_Meta_R: /* Shift Alt on PCs */ + case XK_Multi_key: k = Kalt; break; default: /* not ISO-1 or tty control */ -- cgit v1.2.3