[console] Try to avoid problems caused by keycode 86

The "us" keyboard layout contains a mapping for keycode 86 (which
seems not to correspond to any physical key on many US keyboards) to
the ASCII character '<'.  This mapping causes conflicts with the
mapping for keycode 51, which also maps (with shift) to '<'.

Change the keyboard mapping generator to choose the lowest keycode for
each ASCII character as indicating the relevant mapping to use, on the
basis that a lower keycode roughly indicates a "more normal" key.  On
a German keyboard, which has keys for both keycode 51 and keycode 86
present, this causes '<' to be remapped to ';', which is a closer
match to typical user expectations.

Reported-by: Sven Dreyer <sven@dreyer-net.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2011-03-16 21:31:16 +00:00
parent dbb27c9c3b
commit 48624cf94a
19 changed files with 29 additions and 11 deletions

View File

@@ -172,15 +172,26 @@ sub translate_keymaps {
or next;
my $to_ascii = keysym_to_ascii ( $to->[$keymap]->[$keycode] )
or next;
if ( ( $from_ascii != $to_ascii ) && $verbosity > 1 ) {
my $new_map = ( ! exists $map->{$from_ascii} );
my $update_map =
( $new_map || ( $keycode < $map->{$from_ascii}->{keycode} ) );
if ( ( $verbosity > 1 ) &&
( ( $from_ascii != $to_ascii ) ||
( $update_map && ! $new_map ) ) ) {
printf STDERR "In keymap %d: %s => %s%s\n", $keymap,
ascii_to_name ( $from_ascii ), ascii_to_name ( $to_ascii ),
( $map->{$from_ascii} ? " (ignored)" : "" );
( $update_map ? ( $new_map ? "" : " (override)" )
: " (ignored)" );
}
if ( $update_map ) {
$map->{$from_ascii} = {
to_ascii => $to_ascii,
keycode => $keycode,
};
}
$map->{$from_ascii} ||= $to_ascii;
}
}
return $map;
return { map { $_ => $map->{$_}->{to_ascii} } keys %$map };
}
# Parse command-line options