#!/usr/bin/env perl use 5.014; use warnings; use utf8; use JSON (); our $VERSION = '1.01'; my $map = shift if @ARGV and $ARGV[0] =~ /^-+m/; my $info = eval { local $/; return JSON->new->utf8->decode(readline); } or die "Could not read keyboard layout data: $@\n"; my $geochar = do './keyspos.inc.pl' or die "Could not read keyboard position names: $@\n"; if (($info->{moderows} // '') =~ /4/) { push @{$_}, map {"+$_"} @{$_} for values %{$geochar}; } if ($map) { unshift @{$_}, '', '' for values %{$geochar}; } my ($name) = $ARGV =~ m{.*/([^.]+)}; my $len = (grep { defined $_->[4] } values %{$geochar}) ? 'EIGHT' : 'FOUR'; printf <<"."; default partial alphanumeric_keys xkb_symbols "$name" { name[Group1] = "$info->{title}"; key.type[Group1] = "${len}_LEVEL_SEMIALPHABETIC"; . for my $k (sort keys %{$geochar}) { printf "\tkey <%s> {[%s]};\n", $k, join(', ', map { !$_ ? 'NoSymbol' : sprintf 'U%04X', ord } map { $info->{key}->{$_} } @{ $geochar->{$k} } ); } say '};'; =head1 NAME mkxkbsymbols - Export keyboard layout metadata as Xorg symbols =head1 SYNOPSIS tools/mkxkbsymbols data/keyboard/altgr/$NAME.eng.json >$NAME setxkbmap -print $NAME | xkbcomp -w0 -I.. - $DISPLAY =head1 DESCRIPTION Converts site includes (back) to I configurations compatible with C so it can be used in Xorg. =head1 AUTHOR Mischa POSLAWSKY =head1 LICENSE Licensed under the GNU Affero General Public License version 3.