99 lines
2.6 KiB
Text
99 lines
2.6 KiB
Text
|
#!/usr/bin/perl
|
||
|
#
|
||
|
# svgakeymap - by Brion Vibber (brion@pobox.com), 6/30 - 7/3/1998
|
||
|
# Generates a keymap conversion file for svgalib from two keytable definitions.
|
||
|
#
|
||
|
# Usage:
|
||
|
# svgakeymap [physical_map [program_map]] > output.keymap
|
||
|
#
|
||
|
# The conversion map is output to stdout; you may wish to redirect it.
|
||
|
# Keymaps are searched for in /usr/lib/kbd/keytables and are automatically
|
||
|
# filtered through gzip if necessary.
|
||
|
#
|
||
|
# Read the file README.keymap from the svgalib distribution for more info.
|
||
|
|
||
|
$ktd = "/usr/lib/kbd/keytables/";
|
||
|
if(scalar(@ARGV) > 0) {
|
||
|
$inmap = $ARGV[0];
|
||
|
} else {
|
||
|
$inmap = "us";
|
||
|
}
|
||
|
if(scalar(@ARGV) > 1) {
|
||
|
$outmap = $ARGV[1];
|
||
|
} else {
|
||
|
$outmap = $inmap;
|
||
|
}
|
||
|
|
||
|
|
||
|
foreach $bob ($inmap, $outmap) {
|
||
|
#print "$bob\n";
|
||
|
unless(-e $bob) {
|
||
|
# Tack the keytable dir on it
|
||
|
$bob = $ktd . $bob;
|
||
|
#print "$bob\n";
|
||
|
|
||
|
unless(-e $bob) {
|
||
|
# Tack a .gz on it
|
||
|
$bob .= ".map";
|
||
|
#print "$bob\n";
|
||
|
|
||
|
unless(-e $bob) {
|
||
|
# Tack a .gz on it
|
||
|
$bob .= ".gz";
|
||
|
#print "$bob\n";
|
||
|
|
||
|
unless(-e $bob) {
|
||
|
die "Couldn't find $bob\n.";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if($inmap =~ m/\.gz$/) {
|
||
|
# Filter thru gzip
|
||
|
open INMAP, "gzip -dc $inmap |" or die "Could not open $inmap!\n";
|
||
|
} else {
|
||
|
open INMAP, "<$inmap" or die "Could not open $inmap!\n";
|
||
|
}
|
||
|
|
||
|
if($outmap =~ m/\.gz$/) {
|
||
|
# Filter thru gzip
|
||
|
open OUTMAP, "gzip -dc $outmap |" or die "Could not open $outmap!\n";
|
||
|
} else {
|
||
|
open OUTMAP, "<$outmap" or die "Could not open $outmap!\n";
|
||
|
}
|
||
|
|
||
|
print "# This is a svgalib scancode conversion map generated by svgakeymap.\n",
|
||
|
"# Read the file README.keymap from the svgalib distribution for more info.\n#\n",
|
||
|
"# Physical keyboard layout: $inmap\n",
|
||
|
"# Program's expected keyboard layout: $outmap\n#\n",
|
||
|
"# physical_scancode program_scancode key_name\n";
|
||
|
|
||
|
|
||
|
while($kc = <OUTMAP>) {
|
||
|
if($kc =~ m/^keycode\s+([0-9]+)\s*\=\s*(\S+)/) {
|
||
|
# Store scancodes and names for future reference
|
||
|
#print stderr "- $1 - $2 -\n";
|
||
|
$keys{$1} = $2;
|
||
|
$keys{$2} = $1;
|
||
|
} else {
|
||
|
# We ignore anything else - including modifiers
|
||
|
}
|
||
|
}
|
||
|
|
||
|
while($kc = <INMAP>) {
|
||
|
if($kc =~ m/^keycode\s+([0-9]+)\s*\=\s*(\S+)/) {
|
||
|
if($keys{$2}) {
|
||
|
# Matching scancodes!
|
||
|
#unless($keys{$1} eq $2) {
|
||
|
# Find the other code with the same key...
|
||
|
#print "$1 $keys{$2}\t# $keys{$1} <-> $2\n";
|
||
|
#print "$1 $keys{$2}\t# $2\n";
|
||
|
print "$1 $keys{$2} $2\n";
|
||
|
#}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|