Reviewed by Darin Adler.
authorap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 21 Apr 2010 04:55:14 +0000 (04:55 +0000)
committerap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 21 Apr 2010 04:55:14 +0000 (04:55 +0000)
        https://bugs.webkit.org/show_bug.cgi?id=37776
        <rdar://problem/7877716> REGRESSION: When using dvorak, keydown/keyup reports qwerty keyCodes

        * platform/cocoa/KeyEventCocoa.mm: (WebCore::windowsKeyCodeForCharCode): Re-added mapping
        for Roman letters and punctuation.

        * platform/mac/KeyEventMac.mm: (WebCore::windowsKeyCodeForKeyEvent): Improved approximation
        of IE behavior. Keyboard layouts that change location of Roman letters (like AZERTY or Dvorak)
        also switch their keycodes. Also, restored Safari 4 behavior for punctuation. It's difficult
        to match Windows for punctuation exactly, because keyboard layouts make arbitrary changes
        to their keycodes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@57951 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/cocoa/KeyEventCocoa.mm
WebCore/platform/mac/KeyEventMac.mm

index 9d6071b..df2db70 100644 (file)
@@ -1,3 +1,19 @@
+2010-04-20  Alexey Proskuryakov  <ap@apple.com>
+
+        Reviewed by Darin Adler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=37776
+        <rdar://problem/7877716> REGRESSION: When using dvorak, keydown/keyup reports qwerty keyCodes
+
+        * platform/cocoa/KeyEventCocoa.mm: (WebCore::windowsKeyCodeForCharCode): Re-added mapping
+        for Roman letters and punctuation.
+
+        * platform/mac/KeyEventMac.mm: (WebCore::windowsKeyCodeForKeyEvent): Improved approximation
+        of IE behavior. Keyboard layouts that change location of Roman letters (like AZERTY or Dvorak)
+        also switch their keycodes. Also, restored Safari 4 behavior for punctuation. It's difficult
+        to match Windows for punctuation exactly, because keyboard layouts make arbitrary changes
+        to their keycodes.
+
 2010-04-20  Shinichiro Hamaji  <hamaji@chromium.org>
 
         Reviewed by Darin Adler and Alexey Proskuryakov.
index ff0c887..522c420 100644 (file)
@@ -470,20 +470,61 @@ int windowsKeyCodeForKeyCode(uint16_t keyCode)
 
 int windowsKeyCodeForCharCode(unichar charCode)
 {
-    // AppKit generates Unicode PUA character codes for some function keys; using these when key code is not known.
     switch (charCode) {
+        case 'a': case 'A': return VK_A; 
+        case 'b': case 'B': return VK_B; 
+        case 'c': case 'C': return VK_C; 
+        case 'd': case 'D': return VK_D; 
+        case 'e': case 'E': return VK_E; 
+        case 'f': case 'F': return VK_F; 
+        case 'g': case 'G': return VK_G; 
+        case 'h': case 'H': return VK_H; 
+        case 'i': case 'I': return VK_I; 
+        case 'j': case 'J': return VK_J; 
+        case 'k': case 'K': return VK_K; 
+        case 'l': case 'L': return VK_L; 
+        case 'm': case 'M': return VK_M; 
+        case 'n': case 'N': return VK_N; 
+        case 'o': case 'O': return VK_O; 
+        case 'p': case 'P': return VK_P; 
+        case 'q': case 'Q': return VK_Q; 
+        case 'r': case 'R': return VK_R; 
+        case 's': case 'S': return VK_S; 
+        case 't': case 'T': return VK_T; 
+        case 'u': case 'U': return VK_U; 
+        case 'v': case 'V': return VK_V; 
+        case 'w': case 'W': return VK_W; 
+        case 'x': case 'X': return VK_X; 
+        case 'y': case 'Y': return VK_Y; 
+        case 'z': case 'Z': return VK_Z; 
+
+        // AppKit generates Unicode PUA character codes for some function keys; using these when key code is not known.
         case NSPauseFunctionKey: return VK_PAUSE;
         case NSSelectFunctionKey: return VK_SELECT;
         case NSPrintFunctionKey: return VK_PRINT;
         case NSExecuteFunctionKey: return VK_EXECUTE;
         case NSPrintScreenFunctionKey: return VK_SNAPSHOT;
         case NSInsertFunctionKey: return VK_INSERT;
-
         case NSF21FunctionKey: return VK_F21;
         case NSF22FunctionKey: return VK_F22;
         case NSF23FunctionKey: return VK_F23;
         case NSF24FunctionKey: return VK_F24;
         case NSScrollLockFunctionKey: return VK_SCROLL;
+
+        // This is for U.S. keyboard mapping, and doesn't necessarily make sense for different keyboard layouts.
+        // For example, '"' on Windows Russian layout is VK_2, not VK_OEM_7.
+        case ';': case ':': return VK_OEM_1; 
+        case '=': case '+': return VK_OEM_PLUS; 
+        case ',': case '<': return VK_OEM_COMMA; 
+        case '-': case '_': return VK_OEM_MINUS; 
+        case '.': case '>': return VK_OEM_PERIOD; 
+        case '/': case '?': return VK_OEM_2; 
+        case '`': case '~': return VK_OEM_3; 
+        case '[': case '{': return VK_OEM_4; 
+        case '\\': case '|': return VK_OEM_5; 
+        case ']': case '}': return VK_OEM_6; 
+        case '\'': case '"': return VK_OEM_7; 
+
     }
 
     return 0;
index 9cdf890..b8bf500 100644 (file)
@@ -161,19 +161,23 @@ static String keyIdentifierForKeyEvent(NSEvent* event)
 
 static int windowsKeyCodeForKeyEvent(NSEvent *event)
 {
-    // Virtual key codes don't depend on active keyboard layout - one gets the same Event.keyCode when pressing the key next to Caps Lock
-    // on U.S. keyboard ('A') and on Russian keyboard (CYRILLIC LETTER EF).
-    // FIXME: This is not true for certain non-alphabetic keys that have VK_OEM_* key codes on Windows. These can get different VK_OEM_*
-    // codes depending on active keyboard layout, and we don't currently implement this quirk on Mac OS X.
-    int code = windowsKeyCodeForKeyCode([event keyCode]);
-    if (code)
-        return code;
-
-    // Some function keys have known "character code" from Unicode private use area generated by AppKit, but no known virtual key code.
-    NSString* s = [event charactersIgnoringModifiers];
-    if ([s length] != 1)
-        return 0;
-    return windowsKeyCodeForCharCode([s characterAtIndex:0]);
+    int code = 0;
+    // There are several kinds of characters for which we produce key code from char code:
+    // 1. Roman letters. Windows keyboard layouts affect both virtual key codes and character codes for these,
+    //    so e.g. 'A' gets the same keyCode on QWERTY, AZERTY or Dvorak layouts.
+    // 2. Keys for which there is no known Mac virtual key codes, like PrintScreen.
+    // 3. Certain punctuation keys. On Windows, these are also remapped depending on current keyboard layout,
+    //    but see comment in windowsKeyCodeForCharCode().
+    if ([event type] == NSKeyDown || [event type] == NSKeyUp) {
+        NSString* s = [event characters]; // Cannot use charactersIgnoringModifiers, because Cmd switches Roman letters for Dvorak-QWERTY layout.
+        code = [s length] > 0 ? windowsKeyCodeForCharCode([s characterAtIndex:0]) : 0;
+        if (code)
+            return code;
+    }
+
+    // Map Mac virtual key code directly to Windows one for any keys not handled above.
+    // E.g. the key next to Caps Lock has the same Event.keyCode on U.S. keyboard ('A') and on Russian keyboard (CYRILLIC LETTER EF).
+    return windowsKeyCodeForKeyCode([event keyCode]);
 }
 
 PlatformKeyboardEvent::PlatformKeyboardEvent(NSEvent *event)