in remote/browser/KeyEventProcessing.cpp [421:583]
void processKeyEvent(
CefKeyEvent & cef_event,
int event_type, // event.getID()
int modifiers, // event.getModifiersEx()
char16_t key_char, // event.getKeyChar()
long scanCode, // event.scancode, windows only
int key_code // event.getKeyCode()
) {
cef_event.modifiers = GetCefModifiers(modifiers);
#if defined(OS_WIN)
BYTE VkCode = LOBYTE(MapVirtualKey(scanCode, MAPVK_VSC_TO_VK));
cef_event.native_key_code = (scanCode << 16) | // key scan code
1; // key repeat count
#elif defined(OS_LINUX) || defined(OS_MAC)
#if defined(OS_LINUX)
// cef_event.native_key_code = JavaKeyCode2X11(env, &cls, key_code);
// KeyboardCode windows_key_code =
// KeyboardCodeFromXKeysym(cef_event.native_key_code);
// cef_event.windows
// GetWindowsKeyCodeWithoutLocation(windows_key_code);
if (cef_event.modifiers & EVENTFLAG_ALT_DOWN)
cef_event.is_system_key = true;
// if (windows_key_code == JAVA_VKEY_RETURN) {
// // We need to treat the enter key as a key press of character \r. This
// // is apparently just how webkit handles it and what it expects.
// cef_event.unmodified_character = '\r';
// } else {
// cef_event.unmodified_character = key_char != '\n' ? key_char : '\r';
// }
// If ctrl key is pressed down, then control character shall be input.
// if (cef_event.modifiers & EVENTFLAG_CONTROL_DOWN) {
// cef_event.character = GetControlCharacter(
// windows_key_code, cef_event.modifiers & EVENTFLAG_SHIFT_DOWN);
// } else {
// cef_event.character = cef_event.unmodified_character;
// }
#elif defined(OS_MAC)
if (key_code == (JAVA_VK_BACK_SPACE)) {
cef_event.native_key_code = kVK_Delete;
cef_event.unmodified_character = kBackspaceCharCode;
} else if (key_code == (JAVA_VK_DELETE)) {
cef_event.native_key_code = kVK_ForwardDelete;
cef_event.unmodified_character = kDeleteCharCode;
} else if (key_code == (JAVA_VK_DOWN)) {
cef_event.native_key_code = kVK_DownArrow;
cef_event.unmodified_character = /* NSDownArrowFunctionKey */ 0xF701;
} else if (key_code == (JAVA_VK_ENTER)) {
cef_event.native_key_code = kVK_Return;
cef_event.unmodified_character = kReturnCharCode;
} else if (key_code == (JAVA_VK_ESCAPE)) {
cef_event.native_key_code = kVK_Escape;
cef_event.unmodified_character = kEscapeCharCode;
} else if (key_code == (JAVA_VK_LEFT)) {
cef_event.native_key_code = kVK_LeftArrow;
cef_event.unmodified_character = /* NSLeftArrowFunctionKey */ 0xF702;
} else if (key_code == (JAVA_VK_RIGHT)) {
cef_event.native_key_code = kVK_RightArrow;
cef_event.unmodified_character = /* NSRightArrowFunctionKey */ 0xF703;
} else if (key_code == (JAVA_VK_TAB)) {
cef_event.native_key_code = kVK_Tab;
cef_event.unmodified_character = kTabCharCode;
} else if (key_code == (JAVA_VK_UP)) {
cef_event.native_key_code = kVK_UpArrow;
cef_event.unmodified_character = /* NSUpArrowFunctionKey */ 0xF700;
} else {
cef_event.native_key_code = GetMacKeyCodeFromChar(key_char);
if (cef_event.native_key_code == -1)
cef_event.native_key_code = 0;
if (cef_event.native_key_code == kVK_Return) {
cef_event.unmodified_character = kReturnCharCode;
} else {
cef_event.unmodified_character = key_char;
}
}
cef_event.character = cef_event.unmodified_character;
// Fill in |character| according to flags.
if (cef_event.modifiers & EVENTFLAG_SHIFT_DOWN) {
if (key_char >= '0' && key_char <= '9') {
cef_event.character = kShiftCharsForNumberKeys[key_char - '0'];
} else if (key_char >= 'A' && key_char <= 'Z') {
cef_event.character = 'A' + (key_char - 'A');
} else {
switch (cef_event.native_key_code) {
case kVK_ANSI_Grave:
cef_event.character = '~';
break;
case kVK_ANSI_Minus:
cef_event.character = '_';
break;
case kVK_ANSI_Equal:
cef_event.character = '+';
break;
case kVK_ANSI_LeftBracket:
cef_event.character = '{';
break;
case kVK_ANSI_RightBracket:
cef_event.character = '}';
break;
case kVK_ANSI_Backslash:
cef_event.character = '|';
break;
case kVK_ANSI_Semicolon:
cef_event.character = ':';
break;
case kVK_ANSI_Quote:
cef_event.character = '\"';
break;
case kVK_ANSI_Comma:
cef_event.character = '<';
break;
case kVK_ANSI_Period:
cef_event.character = '>';
break;
case kVK_ANSI_Slash:
cef_event.character = '?';
break;
default:
break;
}
}
}
// Control characters.
if (cef_event.modifiers & EVENTFLAG_CONTROL_DOWN) {
if (key_char >= 'A' && key_char <= 'Z')
cef_event.character = 1 + key_char - 'A';
else if (cef_event.native_key_code == kVK_ANSI_LeftBracket)
cef_event.character = 27;
else if (cef_event.native_key_code == kVK_ANSI_Backslash)
cef_event.character = 28;
else if (cef_event.native_key_code == kVK_ANSI_RightBracket)
cef_event.character = 29;
}
#endif // defined(OS_MAC)
#endif // defined(OS_LINUX) || defined(OS_MAC)
if (event_type == (JAVA_KEY_PRESSED)) {
#if defined(OS_WIN)
cef_event.windows_key_code = VkCode;
#endif
cef_event.type = KEYEVENT_RAWKEYDOWN;
} else if (event_type == (JAVA_KEY_RELEASED)) {
#if defined(OS_WIN)
cef_event.windows_key_code = VkCode;
// bits 30 and 31 should always be 1 for WM_KEYUP
cef_event.native_key_code |= 0xC0000000;
#endif
cef_event.type = KEYEVENT_KEYUP;
} else if (event_type == (JAVA_KEY_TYPED)) {
#if defined(OS_WIN)
cef_event.windows_key_code = key_char == '\n' ? '\r' : key_char;
#endif
cef_event.type = KEYEVENT_CHAR;
}
}