keyboard/altgr/index: move ctrl rows to distinct inventory mode
[sheet.git] / tools / mkxkbsymbols
1 #!/usr/bin/env perl
2 use 5.014;
3 use warnings;
4 use utf8;
5
6 use JSON ();
7
8 our $VERSION = '1.01';
9
10 my $map = shift if @ARGV and $ARGV[0] =~ /^-+m/;
11
12 my $info = eval {
13         local $/;
14         return JSON->new->utf8->decode(readline);
15 } or die "Could not read keyboard layout data: $@\n";
16
17 my $geochar = do './keyspos.inc.pl'
18         or die "Could not read keyboard position names: $@\n";
19
20 if (($info->{moderows} // '') =~ /4/) {
21         push @{$_}, map {"+$_"} @{$_} for values %{$geochar};
22 }
23 if ($map) {
24         unshift @{$_}, '', '' for values %{$geochar};
25 }
26
27 my ($name) = $ARGV =~ m{.*/([^.]+)};
28 my $len = (grep { defined $_->[4] } values %{$geochar}) ?
29         'EIGHT' : 'FOUR';
30
31 printf <<".";
32 default partial alphanumeric_keys
33 xkb_symbols "$name" {
34         name[Group1] = "$info->{title}";
35         key.type[Group1] = "${len}_LEVEL_SEMIALPHABETIC";
36 .
37
38 for my $k (sort keys %{$geochar}) {
39         printf "\tkey <%s> {[%s]};\n", $k, join(', ',
40                 map { !$_ ? 'NoSymbol' : sprintf 'U%04X', ord }
41                 map { $info->{key}->{$_} } @{ $geochar->{$k} }
42         );
43 }
44
45 say '};';
46
47 =head1 NAME
48
49 mkxkbsymbols - Export keyboard layout metadata as Xorg symbols
50
51 =head1 SYNOPSIS
52
53     tools/mkxkbsymbols data/keyboard/altgr/$NAME.eng.json >$NAME
54     setxkbmap -print $NAME | xkbcomp -w0 -I.. - $DISPLAY
55
56 =head1 DESCRIPTION
57
58 Converts site includes (back) to I<xkb_symbols> configurations
59 compatible with C<xkbcomp> so it can be used in Xorg.
60
61 =head1 AUTHOR
62
63 Mischa POSLAWSKY <perl@shiar.org>
64
65 =head1 LICENSE
66
67 Licensed under the GNU Affero General Public License version 3.
68