]>
Commit | Line | Data |
---|---|---|
7f3ff8c0 DM |
1 | #!/usr/bin/perl |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | ||
6 | ||
7 | my $header = "/usr/include/X11/keysymdef.h"; | |
8 | ||
9 | print <<__EOD; | |
10 | typedef struct { | |
11 | const char* name; | |
12 | int keysym; | |
13 | int unicode; | |
14 | } name2keysym_t; | |
15 | ||
16 | static const name2keysym_t name2keysym[] = { | |
17 | __EOD | |
18 | ||
19 | open(TMP, "<$header"); | |
20 | while (defined(my $line = <TMP>)) { | |
21 | next if $line !~ m/\#define /; | |
22 | my @ea = split(/\s+/, $line, 4); | |
23 | ||
24 | next if $ea[1] !~ m/^XK_(\S+)$/; | |
25 | my $name = $1; | |
26 | ||
27 | next if $ea[2] !~ m/^0x([A-Za-z0-9]+)$/; | |
28 | my $keysym = hex($ea[2]); | |
29 | ||
30 | my $unicode = 0; | |
31 | if ($ea[3] && $ea[3] =~ m/\/\* U\+([0-9A-Fa-f]{4,6}) /) { | |
32 | $unicode = hex($1); | |
33 | } | |
34 | ||
35 | if (!$unicode) { | |
36 | # Latin-1 characters (1:1 mapping) | |
37 | if (($keysym >= 0x0020 && $keysym <= 0x007e) || | |
38 | ($keysym >= 0x00a0 && $keysym <= 0x00ff)) { | |
39 | $unicode = $keysym; | |
40 | } elsif (($keysym & 0xff000000) == 0x01000000) { | |
41 | # directly encoded 24-bit UCS characters */ | |
42 | $unicode = $keysym & 0x00ffffff; | |
43 | } elsif ($keysym >= 0x0ff08 && $keysym <= 0x0ff1b) { | |
44 | # tty BS, LF, RETURN, Delete | |
45 | $unicode = $keysym - 0x0ff00; | |
46 | } elsif ($keysym >= 0x0ffaa && $keysym <= 0x0ffaf) { | |
47 | # keypad +*-/ | |
48 | $unicode = $keysym - 0x0ff80; | |
49 | } elsif ($keysym >= 0x0ffb0 && $keysym <= 0x0ffb9) { | |
50 | # keypad 01234... | |
51 | $unicode = $keysym - 0x0ff80; | |
52 | } | |
53 | } | |
54 | ||
55 | printf(" { \"%s\", 0x%03x, 0x%04x },\n", $name, $keysym, $unicode); | |
56 | } | |
57 | ||
58 | printf(" { NULL, 0x%03x, 0x%04x },\n", 0, 0); | |
59 | ||
60 | print <<__EOD; | |
61 | }; | |
62 | __EOD |