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 |