#!/usr/bin/perl use lib ".."; use c; my $KMAP_MAGIC = 0x8B39C07F; BEGIN { @ARGV == 1 or die "usage: kmap2bkmap <keymap>\n" } system("sudo loadkeys $ARGV[0]") == 0 or die; open F, "dumpkeys -n -f |"; <F> =~ /^keymaps\s+(.*)/ or die; foreach (split ',', $1) { my @l = /(\d+)-(\d+)/; my ($i, $j) = @l ? @l : ($_,$_); $keymaps[$_] = 1 foreach $i .. $j; } print pack("I", $KMAP_MAGIC); print map { pack "i", $keymaps[$_] || 0 } 0 .. c::MAX_NR_KEYMAPS()-1; foreach (<F>) { s/\+0x/0x/g; my ($keycode, $key, undef, @l) = split; $keycode eq 'keycode' or next; my $i = 0; $L[$i++][$key] = hex $_ foreach @l; } close F or die "dumpkeys failed"; foreach (@L) { foreach my $i (0 .. c::NR_KEYS()-1) { print pack "s", defined $_->[$i] ? $_->[$i] : 0x200; } } exit 0;