Separate Mac and iOS implementation of windowsKeyCodeForCharCode()
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 24 Sep 2018 20:47:39 +0000 (20:47 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 24 Sep 2018 20:47:39 +0000 (20:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=189898

Reviewed by Tim Horton.

Extract the Mac and iOS implementations into a windowsKeyCodeForCharCode() defined in file
KeyEventMac.mm and file KeyEventIOS, respectively.

Mac and iOS have significant differences in how they represent function keys. It is not worthwhile
to share windowsKeyCodeForCharCode() between them given these differences. On Mac function keys
are represented by a char code in the range 0xF700-0xF8FF. On iOS these keys may not have a unique
char code (e.g. F1 = 0x10 = F10) and must be identified either by special string (e.g. UIKeyInputUpArrow)
or key code.

* platform/cocoa/KeyEventCocoa.mm:
(WebCore::windowsKeyCodeForCharCode): Deleted.
* platform/ios/KeyEventIOS.mm:
(WebCore::windowsKeyCodeForCharCode): Added. Remove the handling of NS*FunctionKey char codes
as function keys are not represented using them as of iOS 12.
* platform/mac/KeyEventMac.mm:
(WebCore::windowsKeyCodeForCharCode): Added.

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

Source/WebCore/ChangeLog
Source/WebCore/platform/cocoa/KeyEventCocoa.mm
Source/WebCore/platform/ios/KeyEventIOS.mm
Source/WebCore/platform/mac/KeyEventMac.mm

index b8f5397..f0de58d 100644 (file)
@@ -1,3 +1,27 @@
+2018-09-24  Daniel Bates  <dabates@apple.com>
+
+        Separate Mac and iOS implementation of windowsKeyCodeForCharCode()
+        https://bugs.webkit.org/show_bug.cgi?id=189898
+
+        Reviewed by Tim Horton.
+
+        Extract the Mac and iOS implementations into a windowsKeyCodeForCharCode() defined in file
+        KeyEventMac.mm and file KeyEventIOS, respectively.
+
+        Mac and iOS have significant differences in how they represent function keys. It is not worthwhile
+        to share windowsKeyCodeForCharCode() between them given these differences. On Mac function keys
+        are represented by a char code in the range 0xF700-0xF8FF. On iOS these keys may not have a unique
+        char code (e.g. F1 = 0x10 = F10) and must be identified either by special string (e.g. UIKeyInputUpArrow)
+        or key code.
+
+        * platform/cocoa/KeyEventCocoa.mm:
+        (WebCore::windowsKeyCodeForCharCode): Deleted.
+        * platform/ios/KeyEventIOS.mm:
+        (WebCore::windowsKeyCodeForCharCode): Added. Remove the handling of NS*FunctionKey char codes
+        as function keys are not represented using them as of iOS 12.
+        * platform/mac/KeyEventMac.mm:
+        (WebCore::windowsKeyCodeForCharCode): Added.
+
 2018-09-21  Simon Fraser  <simon.fraser@apple.com>
 
         Remove the old "AcceleratedCompositingForOverflowScroll" code
index 354119c..9e1cfae 100644 (file)
@@ -484,118 +484,4 @@ String keyIdentifierForCharCode(unichar charCode)
     }
 }
 
-int windowsKeyCodeForCharCode(unichar charCode)
-{
-    switch (charCode) {
-#if PLATFORM(IOS)
-        case 8: case 0x7F: return VK_BACK;
-        case 9: return VK_TAB;
-        case 0xD: case 3: return VK_RETURN;
-        case 0x1B: return VK_ESCAPE;
-        case ' ': return VK_SPACE;
-        case NSHomeFunctionKey: return VK_HOME;
-        case NSEndFunctionKey: return VK_END;
-        case NSPageUpFunctionKey: return VK_PRIOR;
-        case NSPageDownFunctionKey: return VK_NEXT;
-        case NSUpArrowFunctionKey: return VK_UP;
-        case NSDownArrowFunctionKey: return VK_DOWN;
-        case NSLeftArrowFunctionKey: return VK_LEFT;
-        case NSRightArrowFunctionKey: return VK_RIGHT;
-        case NSDeleteFunctionKey: return VK_DELETE;
-
-        case '0': case ')': return VK_0;
-        case '1': case '!': return VK_1;
-        case '2': case '@': return VK_2;
-        case '3': case '#': return VK_3;
-        case '4': case '$': return VK_4;
-        case '5': case '%': return VK_5;
-        case '6': case '^': return VK_6;
-        case '7': case '&': return VK_7;
-        case '8': case '*': return VK_8;
-        case '9': case '(': return VK_9;
-#endif
-        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;
-#if PLATFORM(IOS)
-        case NSInsertFunctionKey: case NSHelpFunctionKey: return VK_INSERT;
-
-        case NSF1FunctionKey: return VK_F1;
-        case NSF2FunctionKey: return VK_F2;
-        case NSF3FunctionKey: return VK_F3;
-        case NSF4FunctionKey: return VK_F4;
-        case NSF5FunctionKey: return VK_F5;
-        case NSF6FunctionKey: return VK_F6;
-        case NSF7FunctionKey: return VK_F7;
-        case NSF8FunctionKey: return VK_F8;
-        case NSF9FunctionKey: return VK_F9;
-        case NSF10FunctionKey: return VK_F10;
-        case NSF11FunctionKey: return VK_F11;
-        case NSF12FunctionKey: return VK_F12;
-        case NSF13FunctionKey: return VK_F13;
-        case NSF14FunctionKey: return VK_F14;
-        case NSF15FunctionKey: return VK_F15;
-        case NSF16FunctionKey: return VK_F16;
-        case NSF17FunctionKey: return VK_F17;
-        case NSF18FunctionKey: return VK_F18;
-        case NSF19FunctionKey: return VK_F19;
-        case NSF20FunctionKey: return VK_F20;
-#else
-        case NSInsertFunctionKey: return VK_INSERT;
-#endif
-        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 304e9f7..acb8ba1 100644 (file)
@@ -196,6 +196,69 @@ int windowsKeyCodeForKeyCode(uint16_t keyCode)
     return 0; // Unknown key
 }
 
+int windowsKeyCodeForCharCode(unichar charCode)
+{
+    switch (charCode) {
+    case 8: case 0x7F: return VK_BACK;
+    case 9: return VK_TAB;
+    case 0xD: case 3: return VK_RETURN;
+    case 0x1B: return VK_ESCAPE;
+    case ' ': return VK_SPACE;
+
+    case '0': case ')': return VK_0;
+    case '1': case '!': return VK_1;
+    case '2': case '@': return VK_2;
+    case '3': case '#': return VK_3;
+    case '4': case '$': return VK_4;
+    case '5': case '%': return VK_5;
+    case '6': case '^': return VK_6;
+    case '7': case '&': return VK_7;
+    case '8': case '*': return VK_8;
+    case '9': case '(': return VK_9;
+    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;
+
+    // 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;
+}
+
 void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool backwardCompatibilityMode)
 {
     // Can only change type from KeyDown to RawKeyDown or Char, as we lack information for other conversions.
index c4282fd..7405874 100644 (file)
@@ -172,6 +172,66 @@ int windowsKeyCodeForKeyCode(uint16_t keyCode)
     return 0;
 }
 
+int windowsKeyCodeForCharCode(unichar charCode)
+{
+    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;
+}
+
 void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool backwardCompatibilityMode)
 {
     // Can only change type from KeyDown to RawKeyDown or Char, as we lack information for other conversions.