]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[console] Try to avoid problems caused by keycode 86
authorMichael Brown <mcb30@ipxe.org>
Wed, 16 Mar 2011 21:31:16 +0000 (21:31 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 16 Mar 2011 21:43:56 +0000 (21:43 +0000)
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>
19 files changed:
src/hci/keymap/keymap_al.c
src/hci/keymap/keymap_cz.c
src/hci/keymap/keymap_de.c
src/hci/keymap/keymap_dk.c
src/hci/keymap/keymap_es.c
src/hci/keymap/keymap_et.c
src/hci/keymap/keymap_fi.c
src/hci/keymap/keymap_fr.c
src/hci/keymap/keymap_it.c
src/hci/keymap/keymap_lt.c
src/hci/keymap/keymap_mt.c
src/hci/keymap/keymap_nl.c
src/hci/keymap/keymap_sg.c
src/hci/keymap/keymap_sr.c
src/hci/keymap/keymap_th.c
src/hci/keymap/keymap_ua.c
src/hci/keymap/keymap_uk.c
src/hci/keymap/keymap_wo.c
src/util/genkeymap.pl

index bb4885935cb180f72f17b1403b7e829f9c56b3fd..caf295e8eb6e214438e90fc8f37a9cbc94c76e1a 100644 (file)
@@ -16,6 +16,7 @@ struct key_mapping al_mapping[] __keymap = {
        { 0x1a, 0x19 }, /* Ctrl-Z => Ctrl-Y */
        { 0x22, 0x7b }, /* '"' => '{' */
        { 0x27, 0x5b }, /* '\'' => '[' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x40, 0x22 }, /* '@' => '"' */
        { 0x59, 0x5a }, /* 'Y' => 'Z' */
index c201978087be518e49e9cdd2d66e28518622dbc0..9280f84fd85587b3c9426b7cf128d608e789f302 100644 (file)
@@ -16,7 +16,7 @@ struct key_mapping cz_mapping[] __keymap = {
        { 0x2d, 0x3d }, /* '-' => '=' */
        { 0x2f, 0x2d }, /* '/' => '-' */
        { 0x31, 0x2b }, /* '1' => '+' */
-       { 0x3c, 0x5c }, /* '<' => '\\' */
+       { 0x3c, 0x2c }, /* '<' => ',' */
        { 0x3e, 0x2e }, /* '>' => '.' */
        { 0x3f, 0x2d }, /* '?' => '-' */
        { 0x5d, 0x29 }, /* ']' => ')' */
index 766adf84d740fc2f34e7b4ad9bdd69d093ef57b1..ffcf912f11a953044010430f537c4e2ead1ec485 100644 (file)
@@ -25,6 +25,7 @@ struct key_mapping de_mapping[] __keymap = {
        { 0x2f, 0x2d }, /* '/' => '-' */
        { 0x3a, 0x7b }, /* ':' => '{' */
        { 0x3b, 0x5b }, /* ';' => '[' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3d, 0x27 }, /* '=' => '\'' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
index 4f79115604d80a12cc1389d24876ee9e112d636f..e409018c81b82742be4ae5ea8955ab3de7bac169 100644 (file)
@@ -19,6 +19,7 @@ struct key_mapping dk_mapping[] __keymap = {
        { 0x2b, 0x60 }, /* '+' => '`' */
        { 0x2d, 0x2b }, /* '-' => '+' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
        { 0x40, 0x22 }, /* '@' => '"' */
index 0873312f33e024c128430a6f85ce3e4e42633ed5..c1fe013a98489bb3eb86dd1bd31df9745e1b653a 100644 (file)
@@ -18,6 +18,7 @@ struct key_mapping es_mapping[] __keymap = {
        { 0x2a, 0x28 }, /* '*' => '(' */
        { 0x2d, 0x27 }, /* '-' => '\'' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
        { 0x40, 0x22 }, /* '@' => '"' */
index 29558cfa03991cd05da49516fd1e59a8b6f58f40..ad88cecc18fcdbf27b3845c15ff2acc83dedb719 100644 (file)
@@ -18,6 +18,7 @@ struct key_mapping et_mapping[] __keymap = {
        { 0x2a, 0x28 }, /* '*' => '(' */
        { 0x2d, 0x2b }, /* '-' => '+' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
        { 0x40, 0x22 }, /* '@' => '"' */
@@ -25,4 +26,5 @@ struct key_mapping et_mapping[] __keymap = {
        { 0x5e, 0x26 }, /* '^' => '&' */
        { 0x5f, 0x3f }, /* '_' => '?' */
        { 0x7c, 0x2a }, /* '|' => '*' */
+       { 0x7f, 0x1b }, /* 0x7f => 0x1b */
 };
index 479437f5478509cf74dffe5627538bb325fecfce..c8f6c3a06edee9fda4634a477c40d761fea8490e 100644 (file)
@@ -23,6 +23,7 @@ struct key_mapping fi_mapping[] __keymap = {
        { 0x2f, 0x2d }, /* '/' => '-' */
        { 0x3a, 0x5c }, /* ':' => '\\' */
        { 0x3b, 0x7c }, /* ';' => '|' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3d, 0x27 }, /* '=' => '\'' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
index 7f007b69d90c2ed1da24b5078a4950eb00924df5..fd615a4562a1edfe548d06398a78eec33474960c 100644 (file)
@@ -42,6 +42,7 @@ struct key_mapping fr_mapping[] __keymap = {
        { 0x39, 0x2f }, /* '9' => '/' */
        { 0x3a, 0x4d }, /* ':' => 'M' */
        { 0x3b, 0x6d }, /* ';' => 'm' */
+       { 0x3c, 0x2e }, /* '<' => '.' */
        { 0x3e, 0x2f }, /* '>' => '/' */
        { 0x3f, 0x5c }, /* '?' => '\\' */
        { 0x40, 0x32 }, /* '@' => '2' */
index 3f6b9f87d8be00a84f7d9030b1bcf4b6ba36a971..5bb05471c49eb8e8206f0c971de77ef975a2f88f 100644 (file)
@@ -19,6 +19,7 @@ struct key_mapping it_mapping[] __keymap = {
        { 0x2b, 0x5e }, /* '+' => '^' */
        { 0x2d, 0x27 }, /* '-' => '\'' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
        { 0x40, 0x22 }, /* '@' => '"' */
index 1a76c371c0c30cc0ef02f0364de715ed6fd7521b..3e99d8c6cedaf2ad47d5027b573d09c5427453c6 100644 (file)
@@ -12,5 +12,4 @@ FILE_LICENCE ( PUBLIC_DOMAIN );
 
 /** "lt" keyboard mapping */
 struct key_mapping lt_mapping[] __keymap = {
-       { 0x7f, 0x08 }, /* 0x7f => Ctrl-H */
 };
index e50e2b8cb56816ba4f24f65893eb5eba5e286b39..094a6fc60a364c8a60c9067b71a994fd49029316 100644 (file)
@@ -17,5 +17,4 @@ struct key_mapping mt_mapping[] __keymap = {
        { 0x40, 0x22 }, /* '@' => '"' */
        { 0x5c, 0x23 }, /* '\\' => '#' */
        { 0x7c, 0x7e }, /* '|' => '~' */
-       { 0x7f, 0x08 }, /* 0x7f => Ctrl-H */
 };
index b2b7ed2a9bd75c49dd6fc68f6d0e40a1df169640..ba051705e651f17e87646c7a7a32eaaf86b1875d 100644 (file)
@@ -20,7 +20,7 @@ struct key_mapping nl_mapping[] __keymap = {
        { 0x2d, 0x2f }, /* '-' => '/' */
        { 0x2f, 0x2d }, /* '/' => '-' */
        { 0x3b, 0x2b }, /* ';' => '+' */
-       { 0x3c, 0x5d }, /* '<' => ']' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x3d }, /* '?' => '=' */
        { 0x40, 0x22 }, /* '@' => '"' */
index c7131813fcf31f85eb951133feb3efbe7faedc51..0b082092936feb595fdbefac70d9b042d7dc86fd 100644 (file)
@@ -24,6 +24,7 @@ struct key_mapping sg_mapping[] __keymap = {
        { 0x2b, 0x60 }, /* '+' => '`' */
        { 0x2d, 0x27 }, /* '-' => '\'' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3d, 0x5e }, /* '=' => '^' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
index 84e752921d6cc06acff55b40ee108bd371c2dd93..0552f4d90e6578c3d2660558a340eee6df405661 100644 (file)
@@ -21,6 +21,7 @@ struct key_mapping sr_mapping[] __keymap = {
        { 0x2b, 0x2a }, /* '+' => '*' */
        { 0x2d, 0x27 }, /* '-' => '\'' */
        { 0x2f, 0x2d }, /* '/' => '-' */
+       { 0x3c, 0x3b }, /* '<' => ';' */
        { 0x3d, 0x2b }, /* '=' => '+' */
        { 0x3e, 0x3a }, /* '>' => ':' */
        { 0x3f, 0x5f }, /* '?' => '_' */
index 78e1e2bfa7424e6413241bfde86cfb8255a442f2..e8b44d1ed478b6064e52878a827ea10e7aae047a 100644 (file)
@@ -12,5 +12,4 @@ FILE_LICENCE ( PUBLIC_DOMAIN );
 
 /** "th" keyboard mapping */
 struct key_mapping th_mapping[] __keymap = {
-       { 0x7f, 0x08 }, /* 0x7f => Ctrl-H */
 };
index 6234780bed2636cac8dda85956d1d0c0fc9a1110..1106a8b28b15e23976959fef1c38dcfe164891a3 100644 (file)
@@ -12,5 +12,4 @@ FILE_LICENCE ( PUBLIC_DOMAIN );
 
 /** "ua" keyboard mapping */
 struct key_mapping ua_mapping[] __keymap = {
-       { 0x7f, 0x08 }, /* 0x7f => Ctrl-H */
 };
index 9fbf30aed9f3ef7ee6491e606762d6034377c60a..6550d8ee5466c36c2795748800590c3435259c5a 100644 (file)
@@ -13,7 +13,6 @@ FILE_LICENCE ( PUBLIC_DOMAIN );
 /** "uk" keyboard mapping */
 struct key_mapping uk_mapping[] __keymap = {
        { 0x22, 0x40 }, /* '"' => '@' */
-       { 0x3c, 0x5c }, /* '<' => '\\' */
        { 0x40, 0x22 }, /* '@' => '"' */
        { 0x5c, 0x23 }, /* '\\' => '#' */
        { 0x7c, 0x7e }, /* '|' => '~' */
index 8659044943778dc0447f823a80d1f6d0da1c869a..b453576122a2b926d3f99c6cb6c59bbd7573837c 100644 (file)
@@ -36,6 +36,7 @@ struct key_mapping wo_mapping[] __keymap = {
        { 0x38, 0x5f }, /* '8' => '_' */
        { 0x3a, 0x4d }, /* ':' => 'M' */
        { 0x3b, 0x6d }, /* ';' => 'm' */
+       { 0x3c, 0x2e }, /* '<' => '.' */
        { 0x3e, 0x2f }, /* '>' => '/' */
        { 0x40, 0x32 }, /* '@' => '2' */
        { 0x41, 0x51 }, /* 'A' => 'Q' */
index 89f14695d71e07e9a77d6b96d27a243f43096cb4..d556df27521e3146c4457fe98832c23e6081b9b1 100755 (executable)
@@ -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