keyboard/altgr/unigraph: mkxkbsymbols --map to export a partial mode
authorMischa POSLAWSKY <perl@shiar.org>
Thu, 21 Mar 2024 15:22:59 +0000 (16:22 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 8 Apr 2024 15:39:26 +0000 (17:39 +0200)
Proper altgr group only by skipping the first two levels.

tools/mkxkbsymbols

index 0a24a7fa0f561fc21fd9f806607d6a476d138a71..52aa8a9f47cb56de4c2738f25b0410bf335da21b 100755 (executable)
@@ -5,7 +5,9 @@ use utf8;
 
 use JSON ();
 
-our $VERSION = '1.00';
+our $VERSION = '1.01';
+
+my $map = shift if @ARGV and $ARGV[0] =~ /^-+m/;
 
 my $info = eval {
        local $/;
@@ -18,18 +20,28 @@ my $geochar = do './keyspos.inc.pl'
 if (($info->{moderows} // '') =~ /4/) {
        push @{$_}, map {"+$_"} @{$_} for values %{$geochar};
 }
+if ($map) {
+       unshift @{$_}, '', '' for values %{$geochar};
+}
 
 my ($name) = $ARGV =~ m{.*/([^.]+)};
-say "// setxkbmap -print $name | xkbcomp -w0 -I.. - \$DISPLAY";
-say '';
+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";
+.
 
-say sprintf 'xkb_symbols "%s" {', $info->{title};
 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