Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 5 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #define XK_3270 // for XK_3270_BackTab | 9 #define XK_3270 // for XK_3270_BackTab |
| 10 #include <X11/XF86keysym.h> | 10 #include <X11/XF86keysym.h> |
| 11 #include <X11/Xlib.h> | 11 #include <X11/Xlib.h> |
| 12 #include <X11/Xutil.h> | 12 #include <X11/Xutil.h> |
| 13 #include <X11/extensions/XInput2.h> | 13 #include <X11/extensions/XInput2.h> |
| 14 #include <X11/keysym.h> | 14 #include <X11/keysym.h> |
| 15 #if !defined(XK_dead_greek) | |
|
Wez
2014/10/03 12:38:44
Under what circumstances will this be undefined?
Yuki
2014/10/03 14:33:47
Added a comment.
XK_dead_greek was recently added
| |
| 16 #define XK_dead_greek 0xfe8c | |
| 17 #endif | |
| 15 | 18 |
| 16 #include "base/basictypes.h" | 19 #include "base/basictypes.h" |
| 17 #include "base/logging.h" | 20 #include "base/logging.h" |
| 18 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 19 #include "base/strings/sys_string_conversions.h" | 22 #include "base/strings/sys_string_conversions.h" |
| 20 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
| 21 #include "ui/events/keycodes/dom4/keycode_converter.h" | 24 #include "ui/events/keycodes/dom4/keycode_converter.h" |
| 22 #include "ui/events/x/keysym_to_unicode.h" | 25 #include "ui/events/x/keysym_to_unicode.h" |
| 23 | 26 |
| 24 #define VKEY_UNSUPPORTED VKEY_UNKNOWN | 27 #define VKEY_UNSUPPORTED VKEY_UNKNOWN |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 | 455 |
| 453 template <class T_MAP> | 456 template <class T_MAP> |
| 454 KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) { | 457 KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) { |
| 455 T_MAP comp = {0}; | 458 T_MAP comp = {0}; |
| 456 const T_MAP* p = std::lower_bound(map, map + size, key, comp); | 459 const T_MAP* p = std::lower_bound(map, map + size, key, comp); |
| 457 if (p != map + size && !comp(*p, key) && !comp(key, *p)) | 460 if (p != map + size && !comp(*p, key) && !comp(key, *p)) |
| 458 return static_cast<KeyboardCode>(p->vk); | 461 return static_cast<KeyboardCode>(p->vk); |
| 459 return VKEY_UNKNOWN; | 462 return VKEY_UNKNOWN; |
| 460 } | 463 } |
| 461 | 464 |
| 462 } // namespace | 465 KeyboardCode KeyboardCodeFromHardwareKeycode( |
| 466 unsigned int hardware_code) { | |
| 467 // This function assumes that X11 is using evdev-based keycodes. | |
| 468 static const KeyboardCode kHardwareKeycodeMap[] = { | |
| 469 // Please refer to below links for the table content: | |
| 470 // http://www.w3.org/TR/DOM-Level-3-Events-code/#keyboard-101 | |
| 471 // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode | |
| 472 // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-92 3143f3456c/translate.pdf | |
| 473 VKEY_UNKNOWN, // 0x00: | |
| 474 VKEY_UNKNOWN, // 0x01: | |
| 475 VKEY_UNKNOWN, // 0x02: | |
| 476 VKEY_UNKNOWN, // 0x03: | |
| 477 VKEY_UNKNOWN, // 0x04: | |
| 478 VKEY_UNKNOWN, // 0x05: | |
| 479 VKEY_UNKNOWN, // 0x06: | |
| 480 VKEY_UNKNOWN, // XKB evdev (XKB - 8) X KeySym | |
| 481 VKEY_UNKNOWN, // === =============== ====== | |
| 482 VKEY_ESCAPE, // 0x09: KEY_ESC Escape | |
| 483 VKEY_1, // 0x0A: KEY_1 1 | |
| 484 VKEY_2, // 0x0B: KEY_2 2 | |
| 485 VKEY_3, // 0x0C: KEY_3 3 | |
| 486 VKEY_4, // 0x0D: KEY_4 4 | |
| 487 VKEY_5, // 0x0E: KEY_5 5 | |
| 488 VKEY_6, // 0x0F: KEY_6 6 | |
| 489 VKEY_7, // 0x10: KEY_7 7 | |
| 490 VKEY_8, // 0x11: KEY_8 8 | |
| 491 VKEY_9, // 0x12: KEY_9 9 | |
| 492 VKEY_0, // 0x13: KEY_0 0 | |
| 493 VKEY_OEM_MINUS, // 0x14: KEY_MINUS minus | |
| 494 VKEY_OEM_PLUS, // 0x15: KEY_EQUAL equal | |
| 495 VKEY_BACK, // 0x16: KEY_BACKSPACE BackSpace | |
| 496 VKEY_TAB, // 0x17: KEY_TAB Tab | |
| 497 VKEY_Q, // 0x18: KEY_Q q | |
| 498 VKEY_W, // 0x19: KEY_W w | |
| 499 VKEY_E, // 0x1A: KEY_E e | |
| 500 VKEY_R, // 0x1B: KEY_R r | |
| 501 VKEY_T, // 0x1C: KEY_T t | |
| 502 VKEY_Y, // 0x1D: KEY_Y y | |
| 503 VKEY_U, // 0x1E: KEY_U u | |
| 504 VKEY_I, // 0x1F: KEY_I i | |
| 505 VKEY_O, // 0x20: KEY_O o | |
| 506 VKEY_P, // 0x21: KEY_P p | |
| 507 VKEY_OEM_4, // 0x22: KEY_LEFTBRACE bracketleft | |
| 508 VKEY_OEM_6, // 0x23: KEY_RIGHTBRACE bracketright | |
| 509 VKEY_RETURN, // 0x24: KEY_ENTER Return | |
| 510 VKEY_LCONTROL, // 0x25: KEY_LEFTCTRL Control_L | |
| 511 VKEY_A, // 0x26: KEY_A a | |
| 512 VKEY_S, // 0x27: KEY_S s | |
| 513 VKEY_D, // 0x28: KEY_D d | |
| 514 VKEY_F, // 0x29: KEY_F f | |
| 515 VKEY_G, // 0x2A: KEY_G g | |
| 516 VKEY_H, // 0x2B: KEY_H h | |
| 517 VKEY_J, // 0x2C: KEY_J j | |
| 518 VKEY_K, // 0x2D: KEY_K k | |
| 519 VKEY_L, // 0x2E: KEY_L l | |
| 520 VKEY_OEM_1, // 0x2F: KEY_SEMICOLON semicolon | |
| 521 VKEY_OEM_7, // 0x30: KEY_APOSTROPHE apostrophe | |
| 522 VKEY_OEM_3, // 0x31: KEY_GRAVE grave | |
| 523 VKEY_LSHIFT, // 0x32: KEY_LEFTSHIFT Shift_L | |
| 524 VKEY_OEM_5, // 0x33: KEY_BACKSLASH backslash | |
| 525 VKEY_Z, // 0x34: KEY_Z z | |
| 526 VKEY_X, // 0x35: KEY_X x | |
| 527 VKEY_C, // 0x36: KEY_C c | |
| 528 VKEY_V, // 0x37: KEY_V v | |
| 529 VKEY_B, // 0x38: KEY_B b | |
| 530 VKEY_N, // 0x39: KEY_N n | |
| 531 VKEY_M, // 0x3A: KEY_M m | |
| 532 VKEY_OEM_COMMA, // 0x3B: KEY_COMMA comma | |
| 533 VKEY_OEM_PERIOD, // 0x3C: KEY_DOT period | |
| 534 VKEY_OEM_2, // 0x3D: KEY_SLASH slash | |
| 535 VKEY_RSHIFT, // 0x3E: KEY_RIGHTSHIFT Shift_R | |
| 536 VKEY_MULTIPLY, // 0x3F: KEY_KPASTERISK KP_Multiply | |
| 537 VKEY_LMENU, // 0x40: KEY_LEFTALT Alt_L | |
| 538 VKEY_SPACE, // 0x41: KEY_SPACE space | |
| 539 VKEY_CAPITAL, // 0x42: KEY_CAPSLOCK Caps_Lock | |
| 540 VKEY_F1, // 0x43: KEY_F1 F1 | |
| 541 VKEY_F2, // 0x44: KEY_F2 F2 | |
| 542 VKEY_F3, // 0x45: KEY_F3 F3 | |
| 543 VKEY_F4, // 0x46: KEY_F4 F4 | |
| 544 VKEY_F5, // 0x47: KEY_F5 F5 | |
| 545 VKEY_F6, // 0x48: KEY_F6 F6 | |
| 546 VKEY_F7, // 0x49: KEY_F7 F7 | |
| 547 VKEY_F8, // 0x4A: KEY_F8 F8 | |
| 548 VKEY_F9, // 0x4B: KEY_F9 F9 | |
| 549 VKEY_F10, // 0x4C: KEY_F10 F10 | |
| 550 VKEY_NUMLOCK, // 0x4D: KEY_NUMLOCK Num_Lock | |
| 551 VKEY_SCROLL, // 0x4E: KEY_SCROLLLOCK Scroll_Lock | |
| 552 VKEY_NUMPAD7, // 0x4F: KEY_KP7 KP_7 | |
| 553 VKEY_NUMPAD8, // 0x50: KEY_KP8 KP_8 | |
| 554 VKEY_NUMPAD9, // 0x51: KEY_KP9 KP_9 | |
| 555 VKEY_SUBTRACT, // 0x52: KEY_KPMINUS KP_Subtract | |
| 556 VKEY_NUMPAD4, // 0x53: KEY_KP4 KP_4 | |
| 557 VKEY_NUMPAD5, // 0x54: KEY_KP5 KP_5 | |
| 558 VKEY_NUMPAD6, // 0x55: KEY_KP6 KP_6 | |
| 559 VKEY_ADD, // 0x56: KEY_KPPLUS KP_Add | |
| 560 VKEY_NUMPAD1, // 0x57: KEY_KP1 KP_1 | |
| 561 VKEY_NUMPAD2, // 0x58: KEY_KP2 KP_2 | |
| 562 VKEY_NUMPAD3, // 0x59: KEY_KP3 KP_3 | |
| 563 VKEY_NUMPAD0, // 0x5A: KEY_KP0 KP_0 | |
| 564 VKEY_DECIMAL, // 0x5B: KEY_KPDOT KP_Decimal | |
| 565 VKEY_UNKNOWN, // 0x5C: | |
| 566 VKEY_DBE_DBCSCHAR, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku | |
| 567 VKEY_OEM_5, // 0x5E: KEY_102ND backslash | |
| 568 VKEY_F11, // 0x5F: KEY_F11 F11 | |
| 569 VKEY_F12, // 0x60: KEY_F12 F12 | |
| 570 VKEY_OEM_102, // 0x61: KEY_RO Romaji | |
| 571 VKEY_UNSUPPORTED, // 0x62: KEY_KATAKANA Katakana | |
| 572 VKEY_UNSUPPORTED, // 0x63: KEY_HIRAGANA Hiragana | |
| 573 VKEY_CONVERT, // 0x64: KEY_HENKAN Henkan | |
| 574 VKEY_UNSUPPORTED, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana | |
| 575 VKEY_NONCONVERT, // 0x66: KEY_MUHENKAN Muhenkan | |
| 576 VKEY_SEPARATOR, // 0x67: KEY_KPJPCOMMA KP_Separator | |
| 577 VKEY_RETURN, // 0x68: KEY_KPENTER KP_Enter | |
| 578 VKEY_RCONTROL, // 0x69: KEY_RIGHTCTRL Control_R | |
| 579 VKEY_DIVIDE, // 0x6A: KEY_KPSLASH KP_Divide | |
| 580 VKEY_PRINT, // 0x6B: KEY_SYSRQ Print | |
| 581 VKEY_RMENU, // 0x6C: KEY_RIGHTALT Alt_R | |
| 582 VKEY_RETURN, // 0x6D: KEY_LINEFEED Linefeed | |
| 583 VKEY_HOME, // 0x6E: KEY_HOME Home | |
| 584 VKEY_UP, // 0x6F: KEY_UP Up | |
| 585 VKEY_PRIOR, // 0x70: KEY_PAGEUP Page_Up | |
| 586 VKEY_LEFT, // 0x71: KEY_LEFT Left | |
| 587 VKEY_RIGHT, // 0x72: KEY_RIGHT Right | |
| 588 VKEY_END, // 0x73: KEY_END End | |
| 589 VKEY_DOWN, // 0x74: KEY_DOWN Down | |
| 590 VKEY_NEXT, // 0x75: KEY_PAGEDOWN Page_Down | |
| 591 VKEY_INSERT, // 0x76: KEY_INSERT Insert | |
| 592 VKEY_DELETE, // 0x77: KEY_DELETE Delete | |
| 593 VKEY_UNSUPPORTED, // 0x78: KEY_MACRO | |
| 594 VKEY_VOLUME_MUTE, // 0x79: KEY_MUTE XF86AudioMute | |
| 595 VKEY_VOLUME_DOWN, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume | |
| 596 VKEY_VOLUME_UP, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume | |
| 597 VKEY_POWER, // 0x7C: KEY_POWER XF86PowerOff | |
| 598 VKEY_OEM_PLUS, // 0x7D: KEY_KPEQUAL KP_Equal | |
| 599 VKEY_UNSUPPORTED, // 0x7E: KEY_KPPLUSMINUS plusminus | |
| 600 VKEY_PAUSE, // 0x7F: KEY_PAUSE Pause | |
| 601 VKEY_MEDIA_LAUNCH_APP1, // 0x80: KEY_SCALE XF86LaunchA | |
| 602 VKEY_DECIMAL, // 0x81: KEY_KPCOMMA KP_Decimal | |
| 603 VKEY_HANGUL, // 0x82: KEY_HANGUEL Hangul | |
| 604 VKEY_HANJA, // 0x83: KEY_HANJA Hangul_Hanja | |
| 605 VKEY_OEM_5, // 0x84: KEY_YEN yen | |
| 606 VKEY_LWIN, // 0x85: KEY_LEFTMETA Super_L | |
| 607 VKEY_RWIN, // 0x86: KEY_RIGHTMETA Super_R | |
| 608 VKEY_COMPOSE, // 0x87: KEY_COMPOSE Menu | |
| 609 }; | |
| 463 | 610 |
| 464 // Get an ui::KeyboardCode from an X keyevent | 611 if (hardware_code >= arraysize(kHardwareKeycodeMap)) { |
| 465 KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) { | 612 // Additional keycodes used by the Chrome OS top row special function keys. |
| 466 // Gets correct VKEY code from XEvent is performed as the following steps: | 613 switch (hardware_code) { |
| 467 // 1. Gets the keysym without modifier states. | 614 case 0xA6: // KEY_BACK |
| 468 // 2. For [a-z] & [0-9] cases, returns the VKEY code accordingly. | 615 return VKEY_BACK; |
| 469 // 3. Find keysym in map0. | 616 case 0xA7: // KEY_FORWARD |
| 470 // 4. If not found, fallback to find keysym + hardware_code in map1. | 617 return VKEY_BROWSER_FORWARD; |
| 471 // 5. If not found, fallback to find keysym + keysym_shift + hardware_code | 618 case 0xB5: // KEY_REFRESH |
| 472 // in map2. | 619 return VKEY_BROWSER_REFRESH; |
| 473 // 6. If not found, fallback to find keysym + keysym_shift + keysym_altgr + | 620 case 0xD4: // KEY_DASHBOARD |
| 474 // hardware_code in map3. | 621 return VKEY_MEDIA_LAUNCH_APP2; |
| 475 // 7. If not found, fallback to find in KeyboardCodeFromXKeysym(), which | 622 case 0xE8: // KEY_BRIGHTNESSDOWN |
| 476 // mainly for non-letter keys. | 623 return VKEY_BRIGHTNESS_DOWN; |
| 477 // 8. If not found, fallback to find with the hardware code in US layout. | 624 case 0xE9: // KEY_BRIGHTNESSUP |
| 478 | 625 return VKEY_BRIGHTNESS_UP; |
| 479 KeySym keysym = NoSymbol; | 626 } |
| 480 XEvent xkeyevent = {0}; | 627 return VKEY_UNKNOWN; |
| 481 if (xev->type == GenericEvent) { | |
| 482 // Convert the XI2 key event into a core key event so that we can | |
| 483 // continue to use XLookupString() until crbug.com/367732 is complete. | |
| 484 InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); | |
| 485 } else { | |
| 486 xkeyevent.xkey = xev->xkey; | |
| 487 } | 628 } |
| 488 XKeyEvent* xkey = &xkeyevent.xkey; | 629 return kHardwareKeycodeMap[hardware_code]; |
| 489 xkey->state &= (~0xFF | Mod2Mask); // Clears the xkey's state except numlock. | |
| 490 // XLookupKeysym does not take into consideration the state of the lock/shift | |
| 491 // etc. keys. So it is necessary to use XLookupString instead. | |
| 492 XLookupString(xkey, NULL, 0, &keysym, NULL); | |
| 493 | |
| 494 // [a-z] cases. | |
| 495 if (keysym >= XK_a && keysym <= XK_z) | |
| 496 return static_cast<KeyboardCode>(VKEY_A + keysym - XK_a); | |
| 497 | |
| 498 // [0-9] cases. | |
| 499 if (keysym >= XK_0 && keysym <= XK_9) | |
| 500 return static_cast<KeyboardCode>(VKEY_0 + keysym - XK_0); | |
| 501 | |
| 502 KeyboardCode keycode = VKEY_UNKNOWN; | |
| 503 | |
| 504 if (!IsKeypadKey(keysym) && !IsPrivateKeypadKey(keysym) && | |
| 505 !IsCursorKey(keysym) && !IsPFKey(keysym) && !IsFunctionKey(keysym) && | |
| 506 !IsModifierKey(keysym)) { | |
| 507 MAP0 key0 = {keysym & 0xFFFF, 0}; | |
| 508 keycode = FindVK(key0, map0, arraysize(map0)); | |
| 509 if (keycode != VKEY_UNKNOWN) | |
| 510 return keycode; | |
| 511 | |
| 512 MAP1 key1 = {keysym & 0xFFFF, xkey->keycode, 0}; | |
| 513 keycode = FindVK(key1, map1, arraysize(map1)); | |
| 514 if (keycode != VKEY_UNKNOWN) | |
| 515 return keycode; | |
| 516 | |
| 517 KeySym keysym_shift = NoSymbol; | |
| 518 xkey->state |= ShiftMask; | |
| 519 XLookupString(xkey, NULL, 0, &keysym_shift, NULL); | |
| 520 MAP2 key2 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0}; | |
| 521 keycode = FindVK(key2, map2, arraysize(map2)); | |
| 522 if (keycode != VKEY_UNKNOWN) | |
| 523 return keycode; | |
| 524 | |
| 525 KeySym keysym_altgr = NoSymbol; | |
| 526 xkey->state &= ~ShiftMask; | |
| 527 xkey->state |= Mod1Mask; | |
| 528 XLookupString(xkey, NULL, 0, &keysym_altgr, NULL); | |
| 529 MAP3 key3 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, | |
| 530 keysym_altgr & 0xFFFF, 0}; | |
| 531 keycode = FindVK(key3, map3, arraysize(map3)); | |
| 532 if (keycode != VKEY_UNKNOWN) | |
| 533 return keycode; | |
| 534 | |
| 535 // On Linux some keys has AltGr char but not on Windows. | |
| 536 // So if cannot find VKEY with (ch0+sc+ch1+ch2) in map3, tries to fallback | |
| 537 // to just find VKEY with (ch0+sc+ch1). This is the best we could do. | |
| 538 MAP3 key4 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0xFFFF, | |
| 539 0}; | |
| 540 const MAP3* p = | |
| 541 std::lower_bound(map3, map3 + arraysize(map3), key4, MAP3()); | |
| 542 if (p != map3 + arraysize(map3) && p->ch0 == key4.ch0 && p->sc == key4.sc && | |
| 543 p->ch1 == key4.ch1) | |
| 544 return static_cast<KeyboardCode>(p->vk); | |
| 545 } | |
| 546 | |
| 547 keycode = KeyboardCodeFromXKeysym(keysym); | |
| 548 if (keycode == VKEY_UNKNOWN) | |
| 549 keycode = DefaultKeyboardCodeFromHardwareKeycode(xkey->keycode); | |
| 550 | |
| 551 return keycode; | |
| 552 } | 630 } |
| 553 | 631 |
| 554 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { | 632 KeyboardCode KeyboardCodeFromXKeysymOrHardwareKeycode(unsigned int keysym, |
| 633 unsigned int keycode) { | |
| 555 // TODO(sad): Have |keysym| go through the X map list? | 634 // TODO(sad): Have |keysym| go through the X map list? |
| 556 | 635 |
| 557 switch (keysym) { | 636 switch (keysym) { |
| 558 case XK_BackSpace: | 637 case XK_BackSpace: |
| 559 return VKEY_BACK; | 638 return VKEY_BACK; |
| 560 case XK_Delete: | 639 case XK_Delete: |
| 561 case XK_KP_Delete: | 640 case XK_KP_Delete: |
| 562 return VKEY_DELETE; | 641 return VKEY_DELETE; |
| 563 case XK_Tab: | 642 case XK_Tab: |
| 564 case XK_KP_Tab: | 643 case XK_KP_Tab: |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 754 case XK_guillemotleft: | 833 case XK_guillemotleft: |
| 755 case XK_guillemotright: | 834 case XK_guillemotright: |
| 756 case XK_degree: | 835 case XK_degree: |
| 757 // In the case of canadian multilingual keyboard layout, VKEY_OEM_102 is | 836 // In the case of canadian multilingual keyboard layout, VKEY_OEM_102 is |
| 758 // assigned to ugrave key. | 837 // assigned to ugrave key. |
| 759 case XK_ugrave: | 838 case XK_ugrave: |
| 760 case XK_Ugrave: | 839 case XK_Ugrave: |
| 761 case XK_brokenbar: | 840 case XK_brokenbar: |
| 762 return VKEY_OEM_102; // international backslash key in 102 keyboard. | 841 return VKEY_OEM_102; // international backslash key in 102 keyboard. |
| 763 | 842 |
| 843 case XK_Hyper_L: | |
|
Wez
2014/10/03 12:38:44
Regardless of where this list of always-UNKNOWN co
Yuki
2014/10/03 14:33:47
Added a comment.
| |
| 844 case XK_Hyper_R: | |
| 845 case XK_ISO_Lock: | |
| 846 case XK_ISO_Level2_Latch: | |
| 847 case XK_ISO_Level3_Latch: | |
| 848 case XK_ISO_Level3_Lock: | |
| 849 case XK_ISO_Level5_Latch: | |
| 850 case XK_ISO_Level5_Lock: | |
| 851 case XK_ISO_Group_Latch: | |
| 852 case XK_ISO_Group_Lock: | |
| 853 case XK_ISO_Next_Group: | |
| 854 case XK_ISO_Next_Group_Lock: | |
| 855 case XK_ISO_Prev_Group: | |
| 856 case XK_ISO_Prev_Group_Lock: | |
| 857 case XK_ISO_First_Group: | |
| 858 case XK_ISO_First_Group_Lock: | |
| 859 case XK_ISO_Last_Group: | |
| 860 case XK_ISO_Last_Group_Lock: | |
| 861 case XK_dead_grave: | |
| 862 case XK_dead_acute: | |
| 863 case XK_dead_circumflex: | |
| 864 case XK_dead_tilde: | |
| 865 case XK_dead_macron: | |
| 866 case XK_dead_breve: | |
| 867 case XK_dead_abovedot: | |
| 868 case XK_dead_diaeresis: | |
| 869 case XK_dead_abovering: | |
| 870 case XK_dead_doubleacute: | |
| 871 case XK_dead_caron: | |
| 872 case XK_dead_cedilla: | |
| 873 case XK_dead_ogonek: | |
| 874 case XK_dead_iota: | |
| 875 case XK_dead_voiced_sound: | |
| 876 case XK_dead_semivoiced_sound: | |
| 877 case XK_dead_belowdot: | |
| 878 case XK_dead_hook: | |
| 879 case XK_dead_horn: | |
| 880 case XK_dead_stroke: | |
| 881 case XK_dead_abovecomma: | |
| 882 case XK_dead_abovereversedcomma: | |
| 883 case XK_dead_doublegrave: | |
| 884 case XK_dead_belowring: | |
| 885 case XK_dead_belowmacron: | |
| 886 case XK_dead_belowcircumflex: | |
| 887 case XK_dead_belowtilde: | |
| 888 case XK_dead_belowbreve: | |
| 889 case XK_dead_belowdiaeresis: | |
| 890 case XK_dead_invertedbreve: | |
| 891 case XK_dead_belowcomma: | |
| 892 case XK_dead_currency: | |
| 893 case XK_dead_a: | |
| 894 case XK_dead_A: | |
| 895 case XK_dead_e: | |
| 896 case XK_dead_E: | |
| 897 case XK_dead_i: | |
| 898 case XK_dead_I: | |
| 899 case XK_dead_o: | |
| 900 case XK_dead_O: | |
| 901 case XK_dead_u: | |
| 902 case XK_dead_U: | |
| 903 case XK_dead_small_schwa: | |
| 904 case XK_dead_capital_schwa: | |
| 905 case XK_dead_greek: | |
| 906 case XK_First_Virtual_Screen: | |
| 907 case XK_Prev_Virtual_Screen: | |
| 908 case XK_Next_Virtual_Screen: | |
| 909 case XK_Last_Virtual_Screen: | |
| 910 case XK_Terminate_Server: | |
| 911 case XK_AccessX_Enable: | |
| 912 case XK_AccessX_Feedback_Enable: | |
| 913 case XK_RepeatKeys_Enable: | |
| 914 case XK_SlowKeys_Enable: | |
| 915 case XK_BounceKeys_Enable: | |
| 916 case XK_StickyKeys_Enable: | |
| 917 case XK_MouseKeys_Enable: | |
| 918 case XK_MouseKeys_Accel_Enable: | |
| 919 case XK_Overlay1_Enable: | |
| 920 case XK_Overlay2_Enable: | |
| 921 case XK_AudibleBell_Enable: | |
| 922 case XK_Pointer_Left: | |
| 923 case XK_Pointer_Right: | |
| 924 case XK_Pointer_Up: | |
| 925 case XK_Pointer_Down: | |
| 926 case XK_Pointer_UpLeft: | |
| 927 case XK_Pointer_UpRight: | |
| 928 case XK_Pointer_DownLeft: | |
| 929 case XK_Pointer_DownRight: | |
| 930 case XK_Pointer_Button_Dflt: | |
| 931 case XK_Pointer_Button1: | |
| 932 case XK_Pointer_Button2: | |
| 933 case XK_Pointer_Button3: | |
| 934 case XK_Pointer_Button4: | |
| 935 case XK_Pointer_Button5: | |
| 936 case XK_Pointer_DblClick_Dflt: | |
| 937 case XK_Pointer_DblClick1: | |
| 938 case XK_Pointer_DblClick2: | |
| 939 case XK_Pointer_DblClick3: | |
| 940 case XK_Pointer_DblClick4: | |
| 941 case XK_Pointer_DblClick5: | |
| 942 case XK_Pointer_Drag_Dflt: | |
| 943 case XK_Pointer_Drag1: | |
| 944 case XK_Pointer_Drag2: | |
| 945 case XK_Pointer_Drag3: | |
| 946 case XK_Pointer_Drag4: | |
| 947 case XK_Pointer_Drag5: | |
| 948 case XK_Pointer_EnableKeys: | |
| 949 case XK_Pointer_Accelerate: | |
| 950 case XK_Pointer_DfltBtnNext: | |
| 951 case XK_Pointer_DfltBtnPrev: | |
| 952 return VKEY_UNKNOWN; | |
| 953 | |
| 764 // When evdev is in use, /usr/share/X11/xkb/symbols/inet maps F13-18 keys | 954 // When evdev is in use, /usr/share/X11/xkb/symbols/inet maps F13-18 keys |
| 765 // to the special XF86XK symbols to support Microsoft Ergonomic keyboards: | 955 // to the special XF86XK symbols to support Microsoft Ergonomic keyboards: |
| 766 // https://bugs.freedesktop.org/show_bug.cgi?id=5783 | 956 // https://bugs.freedesktop.org/show_bug.cgi?id=5783 |
| 767 // In Chrome, we map these X key symbols back to F13-18 since we don't have | 957 // In Chrome, we map these X key symbols back to F13-18 since we don't have |
| 768 // VKEYs for these XF86XK symbols. | 958 // VKEYs for these XF86XK symbols. |
| 769 case XF86XK_Launch5: | 959 case XF86XK_Launch5: |
| 770 return VKEY_F14; | 960 return VKEY_F14; |
| 771 case XF86XK_Launch6: | 961 case XF86XK_Launch6: |
| 772 return VKEY_F15; | 962 return VKEY_F15; |
| 773 case XF86XK_Launch7: | 963 case XF86XK_Launch7: |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 828 return VKEY_BRIGHTNESS_DOWN; | 1018 return VKEY_BRIGHTNESS_DOWN; |
| 829 case XF86XK_MonBrightnessUp: | 1019 case XF86XK_MonBrightnessUp: |
| 830 return VKEY_BRIGHTNESS_UP; | 1020 return VKEY_BRIGHTNESS_UP; |
| 831 case XF86XK_KbdBrightnessDown: | 1021 case XF86XK_KbdBrightnessDown: |
| 832 return VKEY_KBD_BRIGHTNESS_DOWN; | 1022 return VKEY_KBD_BRIGHTNESS_DOWN; |
| 833 case XF86XK_KbdBrightnessUp: | 1023 case XF86XK_KbdBrightnessUp: |
| 834 return VKEY_KBD_BRIGHTNESS_UP; | 1024 return VKEY_KBD_BRIGHTNESS_UP; |
| 835 | 1025 |
| 836 // TODO(sad): some keycodes are still missing. | 1026 // TODO(sad): some keycodes are still missing. |
| 837 } | 1027 } |
| 1028 | |
| 838 DVLOG(1) << "Unknown keysym: " << base::StringPrintf("0x%x", keysym); | 1029 DVLOG(1) << "Unknown keysym: " << base::StringPrintf("0x%x", keysym); |
| 839 return VKEY_UNKNOWN; | 1030 return KeyboardCodeFromHardwareKeycode(keycode); |
| 1031 } | |
| 1032 | |
| 1033 } // namespace | |
| 1034 | |
| 1035 // Get an ui::KeyboardCode from an X keyevent | |
| 1036 KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) { | |
| 1037 // Gets correct VKEY code from XEvent is performed as the following steps: | |
| 1038 // 1. Gets the keysym without modifier states. | |
| 1039 // 2. For [a-z] & [0-9] cases, returns the VKEY code accordingly. | |
| 1040 // 3. Find keysym in map0. | |
| 1041 // 4. If not found, fallback to find keysym + hardware_code in map1. | |
| 1042 // 5. If not found, fallback to find keysym + keysym_shift + hardware_code | |
| 1043 // in map2. | |
| 1044 // 6. If not found, fallback to find keysym + keysym_shift + keysym_altgr + | |
| 1045 // hardware_code in map3. | |
| 1046 // 7. If not found, fallback to find in KeyboardCodeFromXKeysym(), which | |
| 1047 // mainly for non-letter keys. | |
| 1048 // 8. If not found, fallback to find with the hardware code in US layout. | |
|
Wez
2014/10/03 12:38:44
Looks like steps #7 and #8 are now folded into Fro
Yuki
2014/10/03 14:33:47
Thanks for the suggestion. I made a separate func
| |
| 1049 | |
| 1050 KeySym keysym = NoSymbol; | |
| 1051 XEvent xkeyevent = {0}; | |
| 1052 if (xev->type == GenericEvent) { | |
| 1053 // Convert the XI2 key event into a core key event so that we can | |
| 1054 // continue to use XLookupString() until crbug.com/367732 is complete. | |
| 1055 InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); | |
| 1056 } else { | |
| 1057 xkeyevent.xkey = xev->xkey; | |
| 1058 } | |
| 1059 XKeyEvent* xkey = &xkeyevent.xkey; | |
| 1060 xkey->state &= (~0xFF | Mod2Mask); // Clears the xkey's state except numlock. | |
| 1061 // XLookupKeysym does not take into consideration the state of the lock/shift | |
| 1062 // etc. keys. So it is necessary to use XLookupString instead. | |
| 1063 XLookupString(xkey, NULL, 0, &keysym, NULL); | |
| 1064 | |
| 1065 // [a-z] cases. | |
| 1066 if (keysym >= XK_a && keysym <= XK_z) | |
| 1067 return static_cast<KeyboardCode>(VKEY_A + keysym - XK_a); | |
| 1068 | |
| 1069 // [0-9] cases. | |
| 1070 if (keysym >= XK_0 && keysym <= XK_9) | |
| 1071 return static_cast<KeyboardCode>(VKEY_0 + keysym - XK_0); | |
| 1072 | |
| 1073 KeyboardCode keycode = VKEY_UNKNOWN; | |
| 1074 | |
| 1075 if (!IsKeypadKey(keysym) && !IsPrivateKeypadKey(keysym) && | |
| 1076 !IsCursorKey(keysym) && !IsPFKey(keysym) && !IsFunctionKey(keysym) && | |
| 1077 !IsModifierKey(keysym)) { | |
| 1078 MAP0 key0 = {keysym & 0xFFFF, 0}; | |
| 1079 keycode = FindVK(key0, map0, arraysize(map0)); | |
| 1080 if (keycode != VKEY_UNKNOWN) | |
| 1081 return keycode; | |
| 1082 | |
| 1083 MAP1 key1 = {keysym & 0xFFFF, xkey->keycode, 0}; | |
| 1084 keycode = FindVK(key1, map1, arraysize(map1)); | |
| 1085 if (keycode != VKEY_UNKNOWN) | |
| 1086 return keycode; | |
| 1087 | |
| 1088 KeySym keysym_shift = NoSymbol; | |
| 1089 xkey->state |= ShiftMask; | |
| 1090 XLookupString(xkey, NULL, 0, &keysym_shift, NULL); | |
| 1091 MAP2 key2 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0}; | |
| 1092 keycode = FindVK(key2, map2, arraysize(map2)); | |
| 1093 if (keycode != VKEY_UNKNOWN) | |
| 1094 return keycode; | |
| 1095 | |
| 1096 KeySym keysym_altgr = NoSymbol; | |
| 1097 xkey->state &= ~ShiftMask; | |
| 1098 xkey->state |= Mod1Mask; | |
| 1099 XLookupString(xkey, NULL, 0, &keysym_altgr, NULL); | |
| 1100 MAP3 key3 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, | |
| 1101 keysym_altgr & 0xFFFF, 0}; | |
| 1102 keycode = FindVK(key3, map3, arraysize(map3)); | |
| 1103 if (keycode != VKEY_UNKNOWN) | |
| 1104 return keycode; | |
| 1105 | |
| 1106 // On Linux some keys has AltGr char but not on Windows. | |
| 1107 // So if cannot find VKEY with (ch0+sc+ch1+ch2) in map3, tries to fallback | |
| 1108 // to just find VKEY with (ch0+sc+ch1). This is the best we could do. | |
| 1109 MAP3 key4 = {keysym & 0xFFFF, xkey->keycode, keysym_shift & 0xFFFF, 0xFFFF, | |
| 1110 0}; | |
| 1111 const MAP3* p = | |
| 1112 std::lower_bound(map3, map3 + arraysize(map3), key4, MAP3()); | |
| 1113 if (p != map3 + arraysize(map3) && p->ch0 == key4.ch0 && p->sc == key4.sc && | |
| 1114 p->ch1 == key4.ch1) | |
| 1115 return static_cast<KeyboardCode>(p->vk); | |
| 1116 } | |
| 1117 | |
| 1118 return KeyboardCodeFromXKeysymOrHardwareKeycode(keysym, xkey->keycode); | |
| 1119 } | |
| 1120 | |
| 1121 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { | |
| 1122 return KeyboardCodeFromXKeysymOrHardwareKeycode(keysym, 0); | |
| 840 } | 1123 } |
| 841 | 1124 |
| 842 const char* CodeFromXEvent(const XEvent* xev) { | 1125 const char* CodeFromXEvent(const XEvent* xev) { |
| 843 int keycode = (xev->type == GenericEvent) | 1126 int keycode = (xev->type == GenericEvent) |
| 844 ? static_cast<XIDeviceEvent*>(xev->xcookie.data)->detail | 1127 ? static_cast<XIDeviceEvent*>(xev->xcookie.data)->detail |
| 845 : xev->xkey.keycode; | 1128 : xev->xkey.keycode; |
| 846 return ui::KeycodeConverter::NativeKeycodeToCode(keycode); | 1129 return ui::KeycodeConverter::NativeKeycodeToCode(keycode); |
| 847 } | 1130 } |
| 848 | 1131 |
| 849 uint16 GetCharacterFromXEvent(const XEvent* xev) { | 1132 uint16 GetCharacterFromXEvent(const XEvent* xev) { |
| 850 XEvent xkeyevent = {0}; | 1133 XEvent xkeyevent = {0}; |
| 851 const XKeyEvent* xkey = NULL; | 1134 const XKeyEvent* xkey = NULL; |
| 852 if (xev->type == GenericEvent) { | 1135 if (xev->type == GenericEvent) { |
| 853 // Convert the XI2 key event into a core key event so that we can | 1136 // Convert the XI2 key event into a core key event so that we can |
| 854 // continue to use XLookupString() until crbug.com/367732 is complete. | 1137 // continue to use XLookupString() until crbug.com/367732 is complete. |
| 855 InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); | 1138 InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); |
| 856 xkey = &xkeyevent.xkey; | 1139 xkey = &xkeyevent.xkey; |
| 857 } else { | 1140 } else { |
| 858 xkey = &xev->xkey; | 1141 xkey = &xev->xkey; |
| 859 } | 1142 } |
| 860 KeySym keysym = XK_VoidSymbol; | 1143 KeySym keysym = XK_VoidSymbol; |
| 861 XLookupString(const_cast<XKeyEvent*>(xkey), NULL, 0, &keysym, NULL); | 1144 XLookupString(const_cast<XKeyEvent*>(xkey), NULL, 0, &keysym, NULL); |
| 862 return GetUnicodeCharacterFromXKeySym(keysym); | 1145 return GetUnicodeCharacterFromXKeySym(keysym); |
| 863 } | 1146 } |
| 864 | 1147 |
| 865 KeyboardCode DefaultKeyboardCodeFromHardwareKeycode( | |
| 866 unsigned int hardware_code) { | |
| 867 // This function assumes that X11 is using evdev-based keycodes. | |
| 868 static const KeyboardCode kHardwareKeycodeMap[] = { | |
| 869 // Please refer to below links for the table content: | |
| 870 // http://www.w3.org/TR/DOM-Level-3-Events-code/#keyboard-101 | |
| 871 // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode | |
| 872 // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-92 3143f3456c/translate.pdf | |
| 873 VKEY_UNKNOWN, // 0x00: | |
| 874 VKEY_UNKNOWN, // 0x01: | |
| 875 VKEY_UNKNOWN, // 0x02: | |
| 876 VKEY_UNKNOWN, // 0x03: | |
| 877 VKEY_UNKNOWN, // 0x04: | |
| 878 VKEY_UNKNOWN, // 0x05: | |
| 879 VKEY_UNKNOWN, // 0x06: | |
| 880 VKEY_UNKNOWN, // XKB evdev (XKB - 8) X KeySym | |
| 881 VKEY_UNKNOWN, // === =============== ====== | |
| 882 VKEY_ESCAPE, // 0x09: KEY_ESC Escape | |
| 883 VKEY_1, // 0x0A: KEY_1 1 | |
| 884 VKEY_2, // 0x0B: KEY_2 2 | |
| 885 VKEY_3, // 0x0C: KEY_3 3 | |
| 886 VKEY_4, // 0x0D: KEY_4 4 | |
| 887 VKEY_5, // 0x0E: KEY_5 5 | |
| 888 VKEY_6, // 0x0F: KEY_6 6 | |
| 889 VKEY_7, // 0x10: KEY_7 7 | |
| 890 VKEY_8, // 0x11: KEY_8 8 | |
| 891 VKEY_9, // 0x12: KEY_9 9 | |
| 892 VKEY_0, // 0x13: KEY_0 0 | |
| 893 VKEY_OEM_MINUS, // 0x14: KEY_MINUS minus | |
| 894 VKEY_OEM_PLUS, // 0x15: KEY_EQUAL equal | |
| 895 VKEY_BACK, // 0x16: KEY_BACKSPACE BackSpace | |
| 896 VKEY_TAB, // 0x17: KEY_TAB Tab | |
| 897 VKEY_Q, // 0x18: KEY_Q q | |
| 898 VKEY_W, // 0x19: KEY_W w | |
| 899 VKEY_E, // 0x1A: KEY_E e | |
| 900 VKEY_R, // 0x1B: KEY_R r | |
| 901 VKEY_T, // 0x1C: KEY_T t | |
| 902 VKEY_Y, // 0x1D: KEY_Y y | |
| 903 VKEY_U, // 0x1E: KEY_U u | |
| 904 VKEY_I, // 0x1F: KEY_I i | |
| 905 VKEY_O, // 0x20: KEY_O o | |
| 906 VKEY_P, // 0x21: KEY_P p | |
| 907 VKEY_OEM_4, // 0x22: KEY_LEFTBRACE bracketleft | |
| 908 VKEY_OEM_6, // 0x23: KEY_RIGHTBRACE bracketright | |
| 909 VKEY_RETURN, // 0x24: KEY_ENTER Return | |
| 910 VKEY_LCONTROL, // 0x25: KEY_LEFTCTRL Control_L | |
| 911 VKEY_A, // 0x26: KEY_A a | |
| 912 VKEY_S, // 0x27: KEY_S s | |
| 913 VKEY_D, // 0x28: KEY_D d | |
| 914 VKEY_F, // 0x29: KEY_F f | |
| 915 VKEY_G, // 0x2A: KEY_G g | |
| 916 VKEY_H, // 0x2B: KEY_H h | |
| 917 VKEY_J, // 0x2C: KEY_J j | |
| 918 VKEY_K, // 0x2D: KEY_K k | |
| 919 VKEY_L, // 0x2E: KEY_L l | |
| 920 VKEY_OEM_1, // 0x2F: KEY_SEMICOLON semicolon | |
| 921 VKEY_OEM_7, // 0x30: KEY_APOSTROPHE apostrophe | |
| 922 VKEY_OEM_3, // 0x31: KEY_GRAVE grave | |
| 923 VKEY_LSHIFT, // 0x32: KEY_LEFTSHIFT Shift_L | |
| 924 VKEY_OEM_5, // 0x33: KEY_BACKSLASH backslash | |
| 925 VKEY_Z, // 0x34: KEY_Z z | |
| 926 VKEY_X, // 0x35: KEY_X x | |
| 927 VKEY_C, // 0x36: KEY_C c | |
| 928 VKEY_V, // 0x37: KEY_V v | |
| 929 VKEY_B, // 0x38: KEY_B b | |
| 930 VKEY_N, // 0x39: KEY_N n | |
| 931 VKEY_M, // 0x3A: KEY_M m | |
| 932 VKEY_OEM_COMMA, // 0x3B: KEY_COMMA comma | |
| 933 VKEY_OEM_PERIOD, // 0x3C: KEY_DOT period | |
| 934 VKEY_OEM_2, // 0x3D: KEY_SLASH slash | |
| 935 VKEY_RSHIFT, // 0x3E: KEY_RIGHTSHIFT Shift_R | |
| 936 VKEY_MULTIPLY, // 0x3F: KEY_KPASTERISK KP_Multiply | |
| 937 VKEY_LMENU, // 0x40: KEY_LEFTALT Alt_L | |
| 938 VKEY_SPACE, // 0x41: KEY_SPACE space | |
| 939 VKEY_CAPITAL, // 0x42: KEY_CAPSLOCK Caps_Lock | |
| 940 VKEY_F1, // 0x43: KEY_F1 F1 | |
| 941 VKEY_F2, // 0x44: KEY_F2 F2 | |
| 942 VKEY_F3, // 0x45: KEY_F3 F3 | |
| 943 VKEY_F4, // 0x46: KEY_F4 F4 | |
| 944 VKEY_F5, // 0x47: KEY_F5 F5 | |
| 945 VKEY_F6, // 0x48: KEY_F6 F6 | |
| 946 VKEY_F7, // 0x49: KEY_F7 F7 | |
| 947 VKEY_F8, // 0x4A: KEY_F8 F8 | |
| 948 VKEY_F9, // 0x4B: KEY_F9 F9 | |
| 949 VKEY_F10, // 0x4C: KEY_F10 F10 | |
| 950 VKEY_NUMLOCK, // 0x4D: KEY_NUMLOCK Num_Lock | |
| 951 VKEY_SCROLL, // 0x4E: KEY_SCROLLLOCK Scroll_Lock | |
| 952 VKEY_NUMPAD7, // 0x4F: KEY_KP7 KP_7 | |
| 953 VKEY_NUMPAD8, // 0x50: KEY_KP8 KP_8 | |
| 954 VKEY_NUMPAD9, // 0x51: KEY_KP9 KP_9 | |
| 955 VKEY_SUBTRACT, // 0x52: KEY_KPMINUS KP_Subtract | |
| 956 VKEY_NUMPAD4, // 0x53: KEY_KP4 KP_4 | |
| 957 VKEY_NUMPAD5, // 0x54: KEY_KP5 KP_5 | |
| 958 VKEY_NUMPAD6, // 0x55: KEY_KP6 KP_6 | |
| 959 VKEY_ADD, // 0x56: KEY_KPPLUS KP_Add | |
| 960 VKEY_NUMPAD1, // 0x57: KEY_KP1 KP_1 | |
| 961 VKEY_NUMPAD2, // 0x58: KEY_KP2 KP_2 | |
| 962 VKEY_NUMPAD3, // 0x59: KEY_KP3 KP_3 | |
| 963 VKEY_NUMPAD0, // 0x5A: KEY_KP0 KP_0 | |
| 964 VKEY_DECIMAL, // 0x5B: KEY_KPDOT KP_Decimal | |
| 965 VKEY_UNKNOWN, // 0x5C: | |
| 966 VKEY_DBE_DBCSCHAR, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku | |
| 967 VKEY_OEM_5, // 0x5E: KEY_102ND backslash | |
| 968 VKEY_F11, // 0x5F: KEY_F11 F11 | |
| 969 VKEY_F12, // 0x60: KEY_F12 F12 | |
| 970 VKEY_OEM_102, // 0x61: KEY_RO Romaji | |
| 971 VKEY_UNSUPPORTED, // 0x62: KEY_KATAKANA Katakana | |
| 972 VKEY_UNSUPPORTED, // 0x63: KEY_HIRAGANA Hiragana | |
| 973 VKEY_CONVERT, // 0x64: KEY_HENKAN Henkan | |
| 974 VKEY_UNSUPPORTED, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana | |
| 975 VKEY_NONCONVERT, // 0x66: KEY_MUHENKAN Muhenkan | |
| 976 VKEY_SEPARATOR, // 0x67: KEY_KPJPCOMMA KP_Separator | |
| 977 VKEY_RETURN, // 0x68: KEY_KPENTER KP_Enter | |
| 978 VKEY_RCONTROL, // 0x69: KEY_RIGHTCTRL Control_R | |
| 979 VKEY_DIVIDE, // 0x6A: KEY_KPSLASH KP_Divide | |
| 980 VKEY_PRINT, // 0x6B: KEY_SYSRQ Print | |
| 981 VKEY_RMENU, // 0x6C: KEY_RIGHTALT Alt_R | |
| 982 VKEY_RETURN, // 0x6D: KEY_LINEFEED Linefeed | |
| 983 VKEY_HOME, // 0x6E: KEY_HOME Home | |
| 984 VKEY_UP, // 0x6F: KEY_UP Up | |
| 985 VKEY_PRIOR, // 0x70: KEY_PAGEUP Page_Up | |
| 986 VKEY_LEFT, // 0x71: KEY_LEFT Left | |
| 987 VKEY_RIGHT, // 0x72: KEY_RIGHT Right | |
| 988 VKEY_END, // 0x73: KEY_END End | |
| 989 VKEY_DOWN, // 0x74: KEY_DOWN Down | |
| 990 VKEY_NEXT, // 0x75: KEY_PAGEDOWN Page_Down | |
| 991 VKEY_INSERT, // 0x76: KEY_INSERT Insert | |
| 992 VKEY_DELETE, // 0x77: KEY_DELETE Delete | |
| 993 VKEY_UNSUPPORTED, // 0x78: KEY_MACRO | |
| 994 VKEY_VOLUME_MUTE, // 0x79: KEY_MUTE XF86AudioMute | |
| 995 VKEY_VOLUME_DOWN, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume | |
| 996 VKEY_VOLUME_UP, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume | |
| 997 VKEY_POWER, // 0x7C: KEY_POWER XF86PowerOff | |
| 998 VKEY_OEM_PLUS, // 0x7D: KEY_KPEQUAL KP_Equal | |
| 999 VKEY_UNSUPPORTED, // 0x7E: KEY_KPPLUSMINUS plusminus | |
| 1000 VKEY_PAUSE, // 0x7F: KEY_PAUSE Pause | |
| 1001 VKEY_MEDIA_LAUNCH_APP1, // 0x80: KEY_SCALE XF86LaunchA | |
| 1002 VKEY_DECIMAL, // 0x81: KEY_KPCOMMA KP_Decimal | |
| 1003 VKEY_HANGUL, // 0x82: KEY_HANGUEL Hangul | |
| 1004 VKEY_HANJA, // 0x83: KEY_HANJA Hangul_Hanja | |
| 1005 VKEY_OEM_5, // 0x84: KEY_YEN yen | |
| 1006 VKEY_LWIN, // 0x85: KEY_LEFTMETA Super_L | |
| 1007 VKEY_RWIN, // 0x86: KEY_RIGHTMETA Super_R | |
| 1008 VKEY_COMPOSE, // 0x87: KEY_COMPOSE Menu | |
| 1009 }; | |
| 1010 | |
| 1011 if (hardware_code >= arraysize(kHardwareKeycodeMap)) { | |
| 1012 // Additional keycodes used by the Chrome OS top row special function keys. | |
| 1013 switch (hardware_code) { | |
| 1014 case 0xA6: // KEY_BACK | |
| 1015 return VKEY_BACK; | |
| 1016 case 0xA7: // KEY_FORWARD | |
| 1017 return VKEY_BROWSER_FORWARD; | |
| 1018 case 0xB5: // KEY_REFRESH | |
| 1019 return VKEY_BROWSER_REFRESH; | |
| 1020 case 0xD4: // KEY_DASHBOARD | |
| 1021 return VKEY_MEDIA_LAUNCH_APP2; | |
| 1022 case 0xE8: // KEY_BRIGHTNESSDOWN | |
| 1023 return VKEY_BRIGHTNESS_DOWN; | |
| 1024 case 0xE9: // KEY_BRIGHTNESSUP | |
| 1025 return VKEY_BRIGHTNESS_UP; | |
| 1026 } | |
| 1027 return VKEY_UNKNOWN; | |
| 1028 } | |
| 1029 return kHardwareKeycodeMap[hardware_code]; | |
| 1030 } | |
| 1031 | |
| 1032 // TODO(jcampan): this method might be incomplete. | 1148 // TODO(jcampan): this method might be incomplete. |
| 1033 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { | 1149 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { |
| 1034 switch (keycode) { | 1150 switch (keycode) { |
| 1035 case VKEY_NUMPAD0: | 1151 case VKEY_NUMPAD0: |
| 1036 return XK_KP_0; | 1152 return XK_KP_0; |
| 1037 case VKEY_NUMPAD1: | 1153 case VKEY_NUMPAD1: |
| 1038 return XK_KP_1; | 1154 return XK_KP_1; |
| 1039 case VKEY_NUMPAD2: | 1155 case VKEY_NUMPAD2: |
| 1040 return XK_KP_2; | 1156 return XK_KP_2; |
| 1041 case VKEY_NUMPAD3: | 1157 case VKEY_NUMPAD3: |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1347 // alone does not map to XK_less; XKeysymToKeycode() returns KEY_102ND | 1463 // alone does not map to XK_less; XKeysymToKeycode() returns KEY_102ND |
| 1348 // (the '<>' key between Shift and Z on 105-key keyboards) which does. | 1464 // (the '<>' key between Shift and Z on 105-key keyboards) which does. |
| 1349 // | 1465 // |
| 1350 // crbug.com/386066 and crbug.com/390263 are examples of problems | 1466 // crbug.com/386066 and crbug.com/390263 are examples of problems |
| 1351 // associated with this. | 1467 // associated with this. |
| 1352 // | 1468 // |
| 1353 return XKeysymToKeycode(display, XKeysymForWindowsKeyCode(key_code, false)); | 1469 return XKeysymToKeycode(display, XKeysymForWindowsKeyCode(key_code, false)); |
| 1354 } | 1470 } |
| 1355 | 1471 |
| 1356 } // namespace ui | 1472 } // namespace ui |
| OLD | NEW |