Japanese 106 keyboard mapping bug + patch

Aric Cyr acyr at alumni.uwaterloo.ca
Mon Mar 28 20:11:39 CST 2005


I was having a mysterious problem with my Japanese 106 keyboard in
World of Warcraft.  The keyboard worked just fine when logging into
the game or typing messages in game, etc.  However, using the macro
keys for the quickbar (1 2 3 ... 0) each of the keys was off by one.
The keys were mapped as:

1 = 1
2 = 1
3 = 2
4 = 3 
5 = 4
...

Notice that the 1 and 2 key both mapped to one, and every key after
that maps to the previous key.  This only occured for the top keyboard
row and text input fields all worked correctly (which was the
mysterious part).

Anyways, I tracked down the problem to the keyboard layout for jp106
in the x11drv/keyboard.c.  For Japanese keyboards, the first printable
character on the keyboard is '1' (as the shown in the
main_key_JA_jp106[MAIN_LEN][4] array).  However, the jp106 keyboard is
defined to use the regular qwerty scan and vkey maps, which seem to
define the first key as OEM, not '1'.  I believe this was causing my
off-by-one key problem, so created a new jp106 qwerty scan and vkey
map to fix the problem.  I have tested the patch with World of
Warcraft, and indeed my keys are now all mapped correctly.  I am not
familiar with the keyboard stuff too much, so let me know if there are
any problems with the patch, otherwise please commit it.

I also created a bug for this, and attached the patch there as well:
http://bugs.winehq.org/show_bug.cgi?id=2832

-- 
Aric Cyr <acyr at alumni dot uwaterloo dot ca>    (http://acyr.net)
gpg fingerprint: 943A 1549 47AC D766 B7F8  D551 6703 7142 C282 D542
-------------- next part --------------
--- wine-20050310/dlls/x11drv/keyboard.c	2005-03-10 01:45:23.000000000 +0900
+++ /tmp/keyboard.c	2005-03-29 01:46:20.000000000 +0900
@@ -136,6 +136,21 @@
    0x56 /* the 102nd key (actually to the right of l-shift) */
 };
 
+static const WORD main_key_scan_qwerty_jp106[MAIN_LEN] =
+{
+/* this is my (106-key) keyboard layout, sorry if it doesn't quite match yours */
+/* 1    2    3    4    5    6    7    8    9    0    -    ^    \ */
+0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x29,
+/* q    w    e    r    t    y    u    i    o    p    @    [ */
+0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
+/* a    s    d    f    g    h    j    k    l    ;    :    ] */
+0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,
+/* z    x    c    v    b    n    m    ,    .    / */
+0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
+0x56 /* the 102nd key (actually to the right of l-shift) */
+};
+
+
 static const WORD main_key_vkey_qwerty[MAIN_LEN] =
 {
 /* NOTE: this layout must concur with the scan codes layout above */
@@ -146,6 +161,16 @@
    VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */
 };
 
+static const WORD main_key_vkey_qwerty_jp106[MAIN_LEN] =
+{
+/* NOTE: this layout must concur with the scan codes layout above */
+'1','2','3','4','5','6','7','8','9','0',VK_OEM_MINUS,VK_OEM_PLUS,VK_OEM_3,
+'Q','W','E','R','T','Y','U','I','O','P',VK_OEM_4,VK_OEM_6,
+'A','S','D','F','G','H','J','K','L',VK_OEM_1,VK_OEM_7,VK_OEM_5,
+'Z','X','C','V','B','N','M',VK_OEM_COMMA,VK_OEM_PERIOD,VK_OEM_2,
+VK_OEM_102 /* the 102nd key (actually to the right of l-shift) */
+};
+
 static const WORD main_key_vkey_qwerty_v2[MAIN_LEN] =
 {
 /* NOTE: this layout must concur with the scan codes layout above */
@@ -881,7 +906,7 @@
  {0x0424, "Slovenian keyboard layout", &main_key_SI, &main_key_scan_qwerty, &main_key_vkey_qwertz},
  {0x041a, "Croatian keyboard layout", &main_key_HR, &main_key_scan_qwerty, &main_key_vkey_qwertz},
  {0x041a, "Croatian keyboard layout (specific)", &main_key_HR_jelly, &main_key_scan_qwerty, &main_key_vkey_qwerty},
- {0x0411, "Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty, &main_key_vkey_qwerty},
+{0x0411, "Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty_jp106, &main_key_vkey_qwerty_jp106},
  {0x0411, "Japanese pc98x1 keyboard layout", &main_key_JA_pc98x1, &main_key_scan_qwerty, &main_key_vkey_qwerty},
  {0x041b, "Slovak keyboard layout", &main_key_SK, &main_key_scan_qwerty, &main_key_vkey_qwerty},
  {0x041b, "Slovak and Czech keyboard layout without dead keys", &main_key_SK_prog, &main_key_scan_qwerty, &main_key_vkey_qwerty},


More information about the wine-devel mailing list