96 lines
2.1 KiB
Perl
Executable File
96 lines
2.1 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
eval { use bytes; };
|
|
eval { binmode STDOUT; };
|
|
|
|
$DEFAULT_MAP = "us";
|
|
$DEFAULT_EXT = ".kmap";
|
|
|
|
sub usage
|
|
{
|
|
print STDERR
|
|
"usage: $0 [ -p old_code=new_code ] ...\n".
|
|
(" "x(8+length $0))."[path]default_layout[.kmap] ] ".
|
|
"[path]kbd_layout[.kmap]\n";
|
|
exit 1;
|
|
}
|
|
|
|
|
|
while ($ARGV[0] eq "-p") {
|
|
shift(@ARGV);
|
|
&usage unless $ARGV[0] =~ /=/;
|
|
$table[eval($`)] = eval($');
|
|
shift(@ARGV);
|
|
}
|
|
&usage unless defined $ARGV[0];
|
|
load_map("def",defined $ARGV[1] ? $ARGV[0] : undef);
|
|
load_map("kbd",defined $ARGV[1] ? $ARGV[1] : $ARGV[0]);
|
|
&build_table("plain","shift","ctrl","altgr","shift_ctrl",
|
|
"altgr_ctrl","alt","shift_alt","ctrl_alt");
|
|
for ($i = 0; $i < 256; $i++) {
|
|
printf("%c",$table[$i] ? $table[$i] : $i) || die "print: $!";
|
|
}
|
|
close STDOUT || die "close: $!";
|
|
|
|
|
|
sub load_map
|
|
{
|
|
local ($pfx,$map) = @_;
|
|
local ($empty,$current);
|
|
|
|
$map = $DEFAULT_MAP unless defined $map;
|
|
$map .= $DEFAULT_EXT unless $map =~ m|/[^/]+\.[^/]+$|;
|
|
if (!open(FILE,"loadkeys -m $map |")) {
|
|
print STDERR "loadkeys -m $map: $!\n";
|
|
exit 1;
|
|
}
|
|
undef $current;
|
|
$empty = 1;
|
|
while (<FILE>) {
|
|
chop;
|
|
if (/^(static\s+)?u_short\s+(\S+)_map\[\S*\]\s+=\s+{\s*$/) {
|
|
die "active at beginning of map" if defined $current;
|
|
$current = $pfx.":".$2;
|
|
next;
|
|
}
|
|
undef $current if /^};\s*$/;
|
|
next unless defined $current;
|
|
s/\s//g;
|
|
$map{$current} .= $_;
|
|
$empty = 0;
|
|
}
|
|
close FILE;
|
|
return unless $empty;
|
|
print STDERR "Keymap is empty\n";
|
|
exit 1;
|
|
}
|
|
|
|
|
|
sub build_table
|
|
{
|
|
local (@maps) = @_;
|
|
local (@tmp);
|
|
|
|
$set = 0;
|
|
for $map (@maps) {
|
|
$code = $set;
|
|
for (split(",",$map{"def:".$map})) {
|
|
die "bad map entry $_ (def, map $map)" unless /^0x\S\S(\S\S)$/;
|
|
$tmp[$code] = hex $1 unless $tmp[$code];
|
|
$code++;
|
|
}
|
|
$set += 256;
|
|
}
|
|
$set = 0;
|
|
for $map (@maps) {
|
|
$code = $set;
|
|
for (split(",",$map{"kbd:".$map})) {
|
|
die "bad map entry $_ (kbd, map $map)" unless /^0x\S\S(\S\S)$/;
|
|
$table[$tmp[$code]] = hex $1 unless $table[$tmp[$code]];
|
|
$code++;
|
|
}
|
|
$set += 256;
|
|
}
|
|
$table[0] = 0;
|
|
}
|