diff options
| author | Russ Cox <rsc@swtch.com> | 2011-01-02 15:39:09 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@swtch.com> | 2011-01-02 15:39:09 -0500 |
| commit | b567422f98b815a45fa8e7144057a8834e98616b (patch) | |
| tree | 6cd8b764908b4b30054d82e38257034f4f3db0c8 /src/cmd/devdraw/mklatinkbd.c | |
| parent | 4f52e8afe9e41647cd1742c6fff47ed928ff6c1c (diff) | |
| download | plan9port-b567422f98b815a45fa8e7144057a8834e98616b.tar.gz plan9port-b567422f98b815a45fa8e7144057a8834e98616b.zip | |
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
Diffstat (limited to 'src/cmd/devdraw/mklatinkbd.c')
| -rw-r--r-- | src/cmd/devdraw/mklatinkbd.c | 130 |
1 files changed, 108 insertions, 22 deletions
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 <ctype.h> 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, "<Multi_key>"); + 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, "<Multi_key> <X> <%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); +} + + |
