Chromium Code Reviews| Index: ui/events/keycodes/keyboard_code_conversion_x.cc |
| diff --git a/ui/events/keycodes/keyboard_code_conversion_x.cc b/ui/events/keycodes/keyboard_code_conversion_x.cc |
| index 5d6c6ace60609550e06a34e47da506a94bef181b..30c0a005d63e8e80d488c7c886306affac98c390 100644 |
| --- a/ui/events/keycodes/keyboard_code_conversion_x.cc |
| +++ b/ui/events/keycodes/keyboard_code_conversion_x.cc |
| @@ -4,6 +4,8 @@ |
| #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
| +#include <algorithm> |
| + |
| #define XK_3270 // for XK_3270_BackTab |
| #include <X11/keysym.h> |
| #include <X11/Xlib.h> |
| @@ -19,17 +21,459 @@ |
| namespace ui { |
| +namespace { |
| + |
| +// MAP0 - MAP3: |
| +// They are the generated VKEY code maps for all possible Latin keyboard |
| +// layouts in Windows. And the maps are only for special letter keys exclude |
| +// [a-z] & [0-9]. |
| +// |
| +// ch0: the keysym without modifier states. |
| +// ch1: the keysym with shift state. |
| +// ch2: the keysym with altgr state. |
| +// sc: the hardware keycode (in Windows, it's called scan code). |
| +// vk: the VKEY code. |
| +// |
| +// MAP0: maps from ch0 to vk. |
| +// MAP1: maps from ch0+sc to vk. |
| +// MAP2: maps from ch0+ch1+sc to vk. |
| +// MAP3: maps from ch0+ch1+ch2+sc to vk. |
| +// MAP0 - MAP3 are all sorted, so that finding VK can be binary search. |
| +// |
| +// The reason of creating these maps is because a hard-coded mapping in |
| +// KeyboardCodeFromXKeysym() doesn't support non-US keyboard layouts. |
| +// e.g. in UK keyboard, the # key is located at BackSlash key position, and its |
| +// VKEY code should be VKEY_OEM_5 instead of VKEY_3. |
|
Wez
2014/06/26 02:10:42
I think it's important to make clear in this comme
Shu Chen
2014/06/26 06:55:39
Done.
|
| +// |
| +// Please refer to crbug.com/386066. |
| +// |
| +const struct MAP0 { |
| + uint16 ch0; |
| + uint8 vk; |
| + bool operator()(const MAP0& m1, const MAP0& m2) const { |
| + return m1.ch0 < m2.ch0; |
| + } |
| +} map0[] = { |
| + {0x0025, 0x35}, |
|
Wez
2014/06/26 02:10:42
This table is basically impossible to sanity-check
Shu Chen
2014/06/26 06:55:39
Done.
|
| + {0x0026, 0x31}, |
| + {0x003C, 0xDC}, |
| + {0x007B, 0xDE}, |
| + {0x007C, 0xDC}, |
| + {0x007D, 0xBF}, |
| + {0x007E, 0xDC}, |
| + {0x00A1, 0xDD}, |
| + {0x00AD, 0xC0}, |
| + {0x00B0, 0xDE}, |
| + {0x00B2, 0xDE}, |
| + {0x00B5, 0xDC}, |
| + {0x00BB, 0x39}, |
| + {0x00BD, 0xDC}, |
| + {0x00BF, 0xDD}, |
| + {0x00DF, 0xDB}, |
| + {0x00E5, 0xDD}, |
| + {0x00EA, 0x33}, |
| + {0x00EB, 0xBA}, |
| + {0x00EC, 0xDD}, |
| + {0x00EE, 0xDD}, |
| + {0x00F1, 0xC0}, |
| + {0x00F2, 0xC0}, |
| + {0x00F5, 0xDB}, |
| + {0x00F7, 0xDD}, |
| + {0x00FD, 0x37}, |
| + {0x00FE, 0xBD}, |
| + {0x0101, 0xDF}, |
| + {0x0107, 0xDE}, |
| + {0x010B, 0xC0}, |
| + {0x0113, 0x57}, |
| + {0x011B, 0x32}, |
| + {0x011F, 0xDD}, |
| + {0x0121, 0xDB}, |
| + {0x0127, 0xDD}, |
| + {0x012B, 0xDD}, |
| + {0x0131, 0xBA}, |
| + {0x0137, 0xDC}, |
| + {0x013C, 0xBF}, |
| + {0x013E, 0x32}, |
| + {0x0146, 0xDB}, |
| + {0x0148, 0xDC}, |
| + {0x0151, 0xDB}, |
| + {0x0159, 0x35}, |
| + {0x015B, 0xDD}, |
| + {0x0163, 0xDE}, |
| + {0x0165, 0x35}, |
| + {0x016F, 0xBA}, |
| + {0x0171, 0xDC}, |
| + {0x01A1, 0xDD}, |
| + {0x01B0, 0xDB}, |
| + {0x0219, 0xBA}, |
| + {0x021B, 0xDE}, |
| + {0x0259, 0xC0}, |
| + {0x0300, 0x35}, |
| + {0x0301, 0x38}, |
| + {0x0303, 0x37}, |
| + {0x0309, 0x36}, |
| + {0x0323, 0x39}, |
| +}; |
| + |
| +const struct MAP1 { |
| + uint16 ch0; |
| + uint8 sc; |
| + uint8 vk; |
| + bool operator()(const MAP1& m1, const MAP1& m2) const { |
| + if (m1.ch0 == m2.ch0) |
| + return m1.sc < m2.sc; |
| + return m1.ch0 < m2.ch0; |
| + } |
| +} map1[] = { |
| + {0x0021, 0x0A, 0x31}, |
| + {0x0021, 0x11, 0x38}, |
| + {0x0021, 0x3D, 0xDF}, |
| + {0x0022, 0x0B, 0x32}, |
| + {0x0022, 0x0C, 0x33}, |
| + {0x0023, 0x31, 0xDE}, |
| + {0x0024, 0x23, 0xBA}, |
| + {0x0024, 0x33, 0xDF}, |
| + {0x0027, 0x0D, 0x34}, |
| + {0x0027, 0x18, 0xDE}, |
| + {0x0027, 0x23, 0xBA}, |
| + {0x0027, 0x3D, 0xDE}, |
| + {0x0028, 0x0E, 0x35}, |
| + {0x0028, 0x12, 0x39}, |
| + {0x0028, 0x33, 0xDC}, |
| + {0x0029, 0x13, 0x30}, |
| + {0x0029, 0x14, 0xDB}, |
| + {0x0029, 0x23, 0xDD}, |
| + {0x002A, 0x23, 0xBA}, |
| + {0x002A, 0x33, 0xDC}, |
| + {0x002B, 0x0A, 0x31}, |
| + {0x002B, 0x15, 0xBB}, |
| + {0x002B, 0x22, 0xBB}, |
| + {0x002B, 0x23, 0xBB}, |
| + {0x002B, 0x2F, 0xBB}, |
| + {0x002B, 0x33, 0xBF}, |
| + {0x002C, 0x0C, 0x33}, |
| + {0x002C, 0x0E, 0x35}, |
| + {0x002C, 0x0F, 0x36}, |
| + {0x002C, 0x12, 0x39}, |
| + {0x002C, 0x19, 0xBC}, |
| + {0x002C, 0x37, 0xBC}, |
| + {0x002C, 0x3A, 0xBC}, |
| + {0x002C, 0x3B, 0xBC}, |
| + {0x002D, 0x0B, 0x32}, |
| + {0x002D, 0x0F, 0x36}, |
| + {0x002D, 0x14, 0xBD}, |
| + {0x002D, 0x26, 0xBD}, |
| + {0x002D, 0x30, 0xBD}, |
| + {0x002E, 0x10, 0x37}, |
| + {0x002E, 0x11, 0x38}, |
| + {0x002E, 0x1A, 0xBE}, |
| + {0x002E, 0x1B, 0xBE}, |
| + {0x002E, 0x20, 0xBE}, |
| + {0x002E, 0x30, 0xDE}, |
| + {0x002E, 0x3C, 0xBE}, |
| + {0x002E, 0x3D, 0xBF}, |
| + {0x002F, 0x14, 0xDB}, |
| + {0x002F, 0x22, 0xBF}, |
| + {0x002F, 0x31, 0xDE}, |
| + {0x002F, 0x33, 0xDC}, |
| + {0x002F, 0x3D, 0xBF}, |
| + {0x003A, 0x0A, 0x31}, |
| + {0x003A, 0x0E, 0x35}, |
| + {0x003A, 0x0F, 0x36}, |
| + {0x003A, 0x3C, 0xBF}, |
| + {0x003B, 0x0D, 0x34}, |
| + {0x003B, 0x11, 0x38}, |
| + {0x003B, 0x18, 0xBA}, |
| + {0x003B, 0x22, 0xBA}, |
| + {0x003B, 0x23, 0xDD}, |
| + {0x003B, 0x2F, 0xBA}, |
| + {0x003B, 0x34, 0xBA}, |
| + {0x003B, 0x3B, 0xBE}, |
| + {0x003B, 0x3D, 0xBF}, |
| + {0x003D, 0x11, 0x38}, |
| + {0x003D, 0x15, 0xBB}, |
| + {0x003D, 0x23, 0xBB}, |
| + {0x003F, 0x0B, 0x32}, |
| + {0x003F, 0x10, 0x37}, |
| + {0x003F, 0x11, 0x38}, |
| + {0x003F, 0x14, 0xBB}, |
| + {0x0040, 0x23, 0xDD}, |
| + {0x0040, 0x31, 0xDE}, |
| + {0x005B, 0x0A, 0xDB}, |
| + {0x005B, 0x14, 0xDB}, |
| + {0x005B, 0x22, 0xDB}, |
| + {0x005B, 0x23, 0xDD}, |
| + {0x005B, 0x30, 0xDE}, |
| + {0x005D, 0x0B, 0xDD}, |
| + {0x005D, 0x15, 0xDD}, |
| + {0x005D, 0x23, 0xDD}, |
| + {0x005D, 0x31, 0xC0}, |
| + {0x005D, 0x33, 0xDC}, |
| + {0x005F, 0x11, 0x38}, |
| + {0x005F, 0x14, 0xBD}, |
| + {0x00A7, 0x0D, 0x34}, |
| + {0x00A7, 0x0F, 0x36}, |
| + {0x00A7, 0x30, 0xDE}, |
| + {0x00AB, 0x11, 0x38}, |
| + {0x00AB, 0x15, 0xDD}, |
| + {0x00BA, 0x30, 0xDE}, |
| + {0x00BA, 0x31, 0xDC}, |
| + {0x00E0, 0x13, 0x30}, |
| + {0x00E0, 0x33, 0xDC}, |
| + {0x00E1, 0x11, 0x38}, |
| + {0x00E1, 0x30, 0xDE}, |
| + {0x00E2, 0x0B, 0x32}, |
| + {0x00E2, 0x33, 0xDC}, |
| + {0x00E4, 0x23, 0xDD}, |
| + {0x00E6, 0x2F, 0xC0}, |
| + {0x00E6, 0x30, 0xDE}, |
| + {0x00E7, 0x12, 0x39}, |
| + {0x00E7, 0x22, 0xDB}, |
| + {0x00E7, 0x23, 0xDD}, |
| + {0x00E7, 0x30, 0xDE}, |
| + {0x00E7, 0x33, 0xBF}, |
| + {0x00E7, 0x3B, 0xBC}, |
| + {0x00E8, 0x10, 0x37}, |
| + {0x00E8, 0x22, 0xBA}, |
| + {0x00E8, 0x30, 0xC0}, |
| + {0x00E9, 0x0B, 0x32}, |
| + {0x00E9, 0x13, 0x30}, |
| + {0x00E9, 0x3D, 0xBF}, |
| + {0x00ED, 0x12, 0x39}, |
| + {0x00ED, 0x31, 0x30}, |
| + {0x00F0, 0x22, 0xDD}, |
| + {0x00F0, 0x23, 0xBA}, |
| + {0x00F3, 0x15, 0xBB}, |
| + {0x00F3, 0x33, 0xDC}, |
| + {0x00F4, 0x0D, 0x34}, |
| + {0x00F4, 0x2F, 0xBA}, |
| + {0x00F6, 0x13, 0xC0}, |
| + {0x00F6, 0x14, 0xBB}, |
| + {0x00F6, 0x22, 0xDB}, |
| + {0x00F8, 0x2F, 0xC0}, |
| + {0x00F8, 0x30, 0xDE}, |
| + {0x00F9, 0x30, 0xC0}, |
| + {0x00F9, 0x33, 0xBF}, |
| + {0x00FA, 0x22, 0xDB}, |
| + {0x00FA, 0x23, 0xDD}, |
| + {0x00FC, 0x19, 0x57}, |
| + {0x0103, 0x0A, 0x31}, |
| + {0x0103, 0x22, 0xDB}, |
| + {0x0105, 0x0A, 0x31}, |
| + {0x0105, 0x18, 0x51}, |
| + {0x0105, 0x30, 0xDE}, |
| + {0x010D, 0x0B, 0x32}, |
| + {0x010D, 0x0D, 0x34}, |
| + {0x010D, 0x21, 0x58}, |
| + {0x010D, 0x2F, 0xBA}, |
| + {0x010D, 0x3B, 0xBC}, |
| + {0x0111, 0x13, 0x30}, |
| + {0x0111, 0x23, 0xDD}, |
| + {0x0117, 0x0D, 0x34}, |
| + {0x0117, 0x30, 0xDE}, |
| + {0x0119, 0x0C, 0x33}, |
| + {0x012F, 0x0E, 0x35}, |
| + {0x0142, 0x2F, 0xBA}, |
| + {0x0142, 0x33, 0xBF}, |
| + {0x015F, 0x2F, 0xBA}, |
| + {0x015F, 0x3C, 0xBE}, |
| + {0x0161, 0x0C, 0x33}, |
| + {0x0161, 0x0F, 0x36}, |
| + {0x0161, 0x22, 0xDB}, |
| + {0x0161, 0x26, 0xBA}, |
| + {0x0161, 0x29, 0x46}, |
| + {0x0161, 0x3C, 0xBE}, |
| + {0x016B, 0x11, 0x38}, |
| + {0x016B, 0x18, 0x51}, |
| + {0x016B, 0x35, 0x58}, |
| + {0x0173, 0x10, 0x37}, |
| + {0x017C, 0x22, 0xDB}, |
| + {0x017C, 0x33, 0xDC}, |
| + {0x017E, 0x0F, 0x36}, |
| + {0x017E, 0x15, 0xBB}, |
| + {0x017E, 0x19, 0x57}, |
| + {0x017E, 0x22, 0x59}, |
| + {0x017E, 0x33, 0xDC}, |
| +}; |
| + |
| +const struct MAP2 { |
| + uint16 ch0; |
| + uint8 sc; |
| + uint16 ch1; |
| + uint8 vk; |
| + bool operator()(const MAP2& m1, const MAP2& m2) const { |
| + if (m1.ch0 == m2.ch0 && m1.sc == m2.sc) |
| + return m1.ch1 < m2.ch1; |
| + if (m1.ch0 == m2.ch0) |
| + return m1.sc < m2.sc; |
| + return m1.ch0 < m2.ch0; |
| + } |
| +} map2[] = { |
| + {0x0023, 0x33, 0x0027, 0xBF}, |
| + {0x0027, 0x30, 0x0022, 0xDE}, |
| + {0x0027, 0x31, 0x0022, 0xC0}, |
| + {0x0027, 0x31, 0x00B7, 0xDC}, |
| + {0x002D, 0x3D, 0x003D, 0xBD}, |
| + {0x002F, 0x0C, 0x0033, 0x33}, |
| + {0x002F, 0x0C, 0x003F, 0xBF}, |
| + {0x002F, 0x13, 0x0030, 0x30}, |
| + {0x002F, 0x13, 0x003F, 0xBF}, |
| + {0x003D, 0x3D, 0x0025, 0xDF}, |
| + {0x003D, 0x3D, 0x002B, 0xBB}, |
| + {0x005C, 0x33, 0x002F, 0xDE}, |
| + {0x005C, 0x33, 0x007C, 0xDC}, |
| + {0x0060, 0x31, 0x00AC, 0xDF}, |
| + {0x00A7, 0x31, 0x00B0, 0xBF}, |
| + {0x00A7, 0x31, 0x00BD, 0xDC}, |
| + {0x00E0, 0x30, 0x00B0, 0xDE}, |
| + {0x00E0, 0x30, 0x00E4, 0xDC}, |
| + {0x00E4, 0x30, 0x00E0, 0xDC}, |
| + {0x00E9, 0x2F, 0x00C9, 0xBA}, |
| + {0x00E9, 0x2F, 0x00F6, 0xDE}, |
| + {0x00F6, 0x2F, 0x00E9, 0xDE}, |
| + {0x00FC, 0x22, 0x00E8, 0xBA}, |
| +}; |
| + |
| +const struct MAP3 { |
| + uint16 ch0; |
| + uint8 sc; |
| + uint16 ch1; |
| + uint16 ch2; |
| + uint8 vk; |
| + bool operator()(const MAP3& m1, const MAP3& m2) const { |
| + if (m1.ch0 == m2.ch0 && m1.sc == m2.sc && m1.ch1 == m2.ch1) |
| + return m1.ch2 < m2.ch2; |
| + if (m1.ch0 == m2.ch0 && m1.sc == m2.sc) |
| + return m1.ch1 < m2.ch1; |
| + if (m1.ch0 == m2.ch0) |
| + return m1.sc < m2.sc; |
| + return m1.ch0 < m2.ch0; |
| + } |
| +} map3[] = { |
| + {0x0023, 0x33, 0x007E, 0x0000, 0xDC}, |
| + {0x0023, 0x33, 0x007E, 0x001C, 0xDE}, |
| + {0x0027, 0x14, 0x003F, 0x001C, 0xDB}, |
| + {0x0027, 0x14, 0x003F, 0x00DD, 0xDB}, |
| + {0x0027, 0x14, 0x003F, 0xF001, 0xBF}, |
| + {0x0027, 0x15, 0x002A, 0x0000, 0xBB}, |
| + {0x0027, 0x15, 0x002A, 0xF001, 0xBF}, |
| + {0x0027, 0x30, 0x0040, 0x0000, 0xC0}, |
| + {0x0027, 0x30, 0x0040, 0xF001, 0xC0}, |
| + {0x0027, 0x33, 0x002A, 0x0000, 0xBF}, |
| + {0x0027, 0x33, 0x002A, 0x00BD, 0xDC}, |
| + {0x0027, 0x33, 0x002A, 0x0141, 0xBF}, |
| + {0x0027, 0x34, 0x0022, 0x0000, 0x5A}, |
| + {0x0027, 0x34, 0x0022, 0x0158, 0xDE}, |
| + {0x002B, 0x14, 0x003F, 0x0000, 0xBB}, |
| + {0x002B, 0x14, 0x003F, 0x005C, 0xBD}, |
| + {0x002B, 0x14, 0x003F, 0x0151, 0xBB}, |
| + {0x002B, 0x14, 0x003F, 0xF001, 0xBB}, |
| + {0x002D, 0x15, 0x005F, 0x0000, 0xBD}, |
| + {0x002D, 0x15, 0x005F, 0x0157, 0xDB}, |
| + {0x002D, 0x3D, 0x005F, 0x0000, 0xBD}, |
| + {0x002D, 0x3D, 0x005F, 0x001F, 0xBD}, |
| + {0x002D, 0x3D, 0x005F, 0x002A, 0xBD}, |
| + {0x002D, 0x3D, 0x005F, 0x002F, 0xBF}, |
| + {0x002D, 0x3D, 0x005F, 0x006E, 0xBD}, |
| + {0x003D, 0x14, 0x0025, 0x002D, 0xBD}, |
| + {0x003D, 0x14, 0x0025, 0xF001, 0xBB}, |
| + {0x005C, 0x31, 0x007C, 0x0031, 0xDC}, |
| + {0x005C, 0x31, 0x007C, 0x0145, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x0000, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x0031, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x003B, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x0060, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x00BF, 0xC0}, |
| + {0x0060, 0x31, 0x007E, 0x0151, 0xC0}, |
| + {0x00E4, 0x30, 0x00C4, 0x0000, 0xDE}, |
| + {0x00E4, 0x30, 0x00C4, 0x0159, 0xDE}, |
| + {0x00E4, 0x30, 0x00C4, 0x015A, 0xDE}, |
| + {0x00E4, 0x30, 0x00C4, 0xF001, 0xBF}, |
| + {0x00E7, 0x2F, 0x00C7, 0x0000, 0xBA}, |
| + {0x00E7, 0x2F, 0x00C7, 0x00DE, 0xC0}, |
| + {0x00F6, 0x2F, 0x00D6, 0x0000, 0xBA}, |
| + {0x00F6, 0x2F, 0x00D6, 0x01DE, 0xC0}, |
| + {0x00FC, 0x14, 0x00DC, 0x0000, 0xBD}, |
| + {0x00FC, 0x14, 0x00DC, 0xF001, 0xBF}, |
| + {0x00FC, 0x22, 0x00DC, 0x0000, 0xBA}, |
| + {0x00FC, 0x22, 0x00DC, 0x0141, 0xC0}, |
| + {0x0119, 0x3D, 0x0118, 0x0000, 0xBD}, |
| + {0x0119, 0x3D, 0x0118, 0x006E, 0xBF}, |
| + {0x012F, 0x22, 0x012E, 0x0000, 0xDD}, |
| + {0x012F, 0x22, 0x012E, 0x001B, 0xDB}, |
| + {0x0173, 0x2F, 0x0172, 0x0000, 0xC0}, |
| + {0x0173, 0x2F, 0x0172, 0x01DE, 0xBA}, |
| +}; |
| + |
| +template<class T_MAP> |
| +KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) |
| +{ |
| + T_MAP comp = {0}; |
| + const T_MAP* p = std::lower_bound(map, map + size, key, comp); |
| + if (p != map + size && !comp(*p, key) && !comp(key, *p)) |
| + return static_cast<KeyboardCode>(p->vk); |
| + return VKEY_UNKNOWN; |
| +} |
| + |
| +} // namespace |
| + |
| // Get an ui::KeyboardCode from an X keyevent |
| KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { |
| - // XLookupKeysym does not take into consideration the state of the lock/shift |
| - // etc. keys. So it is necessary to use XLookupString instead. |
| - KeySym keysym; |
| - XLookupString(&xev->xkey, NULL, 0, &keysym, NULL); |
| - KeyboardCode keycode = KeyboardCodeFromXKeysym(keysym); |
| - if (keycode == VKEY_UNKNOWN) { |
| - keysym = DefaultXKeysymFromHardwareKeycode(xev->xkey.keycode); |
| - keycode = KeyboardCodeFromXKeysym(keysym); |
| - } |
| + // Gets correct VKEY code from XEvent is performed as the following steps: |
|
Wez
2014/06/26 02:10:42
This doesn't necessarily find the correct VKEY, th
Shu Chen
2014/06/26 06:55:40
It is necessary to find the correct VKEY, and US i
|
| + // 1. Gets the keysym without modifier states. |
| + // 2. For [a-z] & [0-9] cases, returns the VKEY code accordingly. |
| + // 3. Find keysym in map0. |
| + // 4. If not found, fallback to find keysym + hardware_code in map1. |
| + // 5. If not found, fallback to find keysym + keysym_shift + hardware_code |
| + // in map2. |
| + // 6. If not found, fallback to find keysym + keysym_shift + keysym_altgr + |
| + // hardware_code in map3. |
| + // 7. If not found, fallback to find in KeyboardCodeFromXKeysym(), which |
| + // mainly for non-letter keys. |
| + // 8. If not found, fallback to find with the hardward code in US layout. |
| + |
| + KeySym keysym = NoSymbol; |
| + XKeyEvent xkey = xev->xkey; |
| + xkey.state = 0; |
| + XLookupString(&xkey, NULL, 0, &keysym, NULL); |
| + |
| + // [a-z] cases. |
| + if (keysym >= XK_a && keysym <= XK_z) |
| + return static_cast<KeyboardCode>(VKEY_A + keysym - XK_a); |
| + |
| + // [0-9] cases. |
| + if (keysym >= XK_0 && keysym <= XK_9) |
| + return static_cast<KeyboardCode>(VKEY_0 + keysym - XK_0); |
| + |
| + MAP0 key0 = {keysym, 0}; |
| + KeyboardCode keycode = FindVK(key0, map0, arraysize(map0)); |
| + if (keycode != VKEY_UNKNOWN) |
| + return keycode; |
| + |
| + MAP1 key1 = {keysym, xkey.keycode, 0}; |
| + keycode = FindVK(key1, map1, arraysize(map1)); |
| + if (keycode != VKEY_UNKNOWN) |
| + return keycode; |
| + |
| + KeySym keysym_shift = NoSymbol; |
| + xkey.state = ShiftMask; |
| + XLookupString(&xkey, NULL, 0, &keysym_shift, NULL); |
| + MAP2 key2 = {keysym, keysym_shift, xkey.keycode, 0}; |
| + keycode = FindVK(key2, map2, arraysize(map2)); |
| + if (keycode != VKEY_UNKNOWN) |
| + return keycode; |
| + |
| + KeySym keysym_altgr = NoSymbol; |
| + xkey.state = Mod1Mask; |
| + XLookupString(&xkey, NULL, 0, &keysym_altgr, NULL); |
| + MAP3 key3 = {keysym, keysym_shift, keysym_altgr, xkey.keycode, 0}; |
| + keycode = FindVK(key3, map3, arraysize(map3)); |
| + if (keycode != VKEY_UNKNOWN) |
| + return keycode; |
| + |
| + keycode = KeyboardCodeFromXKeysym(keysym); |
| + if (keycode == VKEY_UNKNOWN) |
| + keycode = DefaultKeyboardCodeFromHardwareKeycode(xkey.keycode); |
| return keycode; |
| } |
| @@ -100,117 +544,6 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { |
| return VKEY_NONCONVERT; |
| case XK_Zenkaku_Hankaku: |
| return VKEY_DBE_DBCSCHAR; |
| - case XK_A: |
| - case XK_a: |
| - return VKEY_A; |
| - case XK_B: |
| - case XK_b: |
| - return VKEY_B; |
| - case XK_C: |
| - case XK_c: |
| - return VKEY_C; |
| - case XK_D: |
| - case XK_d: |
| - return VKEY_D; |
| - case XK_E: |
| - case XK_e: |
| - return VKEY_E; |
| - case XK_F: |
| - case XK_f: |
| - return VKEY_F; |
| - case XK_G: |
| - case XK_g: |
| - return VKEY_G; |
| - case XK_H: |
| - case XK_h: |
| - return VKEY_H; |
| - case XK_I: |
| - case XK_i: |
| - return VKEY_I; |
| - case XK_J: |
| - case XK_j: |
| - return VKEY_J; |
| - case XK_K: |
| - case XK_k: |
| - return VKEY_K; |
| - case XK_L: |
| - case XK_l: |
| - return VKEY_L; |
| - case XK_M: |
| - case XK_m: |
| - return VKEY_M; |
| - case XK_N: |
| - case XK_n: |
| - return VKEY_N; |
| - case XK_O: |
| - case XK_o: |
| - return VKEY_O; |
| - case XK_P: |
| - case XK_p: |
| - return VKEY_P; |
| - case XK_Q: |
| - case XK_q: |
| - return VKEY_Q; |
| - case XK_R: |
| - case XK_r: |
| - return VKEY_R; |
| - case XK_S: |
| - case XK_s: |
| - return VKEY_S; |
| - case XK_T: |
| - case XK_t: |
| - return VKEY_T; |
| - case XK_U: |
| - case XK_u: |
| - return VKEY_U; |
| - case XK_V: |
| - case XK_v: |
| - return VKEY_V; |
| - case XK_W: |
| - case XK_w: |
| - return VKEY_W; |
| - case XK_X: |
| - case XK_x: |
| - return VKEY_X; |
| - case XK_Y: |
| - case XK_y: |
| - return VKEY_Y; |
| - case XK_Z: |
| - case XK_z: |
| - return VKEY_Z; |
| - |
| - case XK_0: |
| - case XK_1: |
| - case XK_2: |
| - case XK_3: |
| - case XK_4: |
| - case XK_5: |
| - case XK_6: |
| - case XK_7: |
| - case XK_8: |
| - case XK_9: |
| - return static_cast<KeyboardCode>(VKEY_0 + (keysym - XK_0)); |
| - |
| - case XK_parenright: |
| - return VKEY_0; |
| - case XK_exclam: |
| - return VKEY_1; |
| - case XK_at: |
| - return VKEY_2; |
| - case XK_numbersign: |
| - return VKEY_3; |
| - case XK_dollar: |
| - return VKEY_4; |
| - case XK_percent: |
| - return VKEY_5; |
| - case XK_asciicircum: |
| - return VKEY_6; |
| - case XK_ampersand: |
| - return VKEY_7; |
| - case XK_asterisk: |
| - return VKEY_8; |
| - case XK_parenleft: |
| - return VKEY_9; |
| case XK_KP_0: |
| case XK_KP_1: |
| @@ -444,165 +777,166 @@ uint16 GetCharacterFromXEvent(XEvent* xev) { |
| return result.length() == 1 ? result[0] : 0; |
| } |
| -unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) { |
| +KeyboardCode DefaultKeyboardCodeFromHardwareKeycode( |
| + unsigned int hardware_code) { |
| // This function assumes that X11 is using evdev-based keycodes. |
| - static const unsigned int kHardwareKeycodeMap[] = { |
| + static const KeyboardCode kHardwareKeycodeMap[] = { |
| // This table covers the core 105-key keyboard. |
| - 0, // 0x00: |
| - 0, // 0x01: |
| - 0, // 0x02: |
| - 0, // 0x03: |
| - 0, // 0x04: |
| - 0, // 0x05: |
| - 0, // 0x06: |
| - 0, // XKB evdev (XKB - 8) X KeySym |
| - 0, // === =============== ====== |
| - XK_Escape, // 0x09: KEY_ESC Escape |
| - XK_1, // 0x0A: KEY_1 1 |
| - XK_2, // 0x0B: KEY_2 2 |
| - XK_3, // 0x0C: KEY_3 3 |
| - XK_4, // 0x0D: KEY_4 4 |
| - XK_5, // 0x0E: KEY_5 5 |
| - XK_6, // 0x0F: KEY_6 6 |
| - XK_7, // 0x10: KEY_7 7 |
| - XK_8, // 0x11: KEY_8 8 |
| - XK_9, // 0x12: KEY_9 9 |
| - XK_0, // 0x13: KEY_0 0 |
| - XK_minus, // 0x14: KEY_MINUS minus |
| - XK_equal, // 0x15: KEY_EQUAL equal |
| - XK_BackSpace, // 0x16: KEY_BACKSPACE BackSpace |
| - XK_Tab, // 0x17: KEY_TAB Tab |
| - XK_q, // 0x18: KEY_Q q |
| - XK_w, // 0x19: KEY_W w |
| - XK_e, // 0x1A: KEY_E e |
| - XK_r, // 0x1B: KEY_R r |
| - XK_t, // 0x1C: KEY_T t |
| - XK_y, // 0x1D: KEY_Y y |
| - XK_u, // 0x1E: KEY_U u |
| - XK_i, // 0x1F: KEY_I i |
| - XK_o, // 0x20: KEY_O o |
| - XK_p, // 0x21: KEY_P p |
| - XK_bracketleft, // 0x22: KEY_LEFTBRACE bracketleft |
| - XK_bracketright, // 0x23: KEY_RIGHTBRACE bracketright |
| - XK_Return, // 0x24: KEY_ENTER Return |
| - XK_Control_L, // 0x25: KEY_LEFTCTRL Control_L |
| - XK_a, // 0x26: KEY_A a |
| - XK_s, // 0x27: KEY_S s |
| - XK_d, // 0x28: KEY_D d |
| - XK_f, // 0x29: KEY_F f |
| - XK_g, // 0x2A: KEY_G g |
| - XK_h, // 0x2B: KEY_H h |
| - XK_j, // 0x2C: KEY_J j |
| - XK_k, // 0x2D: KEY_K k |
| - XK_l, // 0x2E: KEY_L l |
| - XK_semicolon, // 0x2F: KEY_SEMICOLON semicolon |
| - XK_apostrophe, // 0x30: KEY_APOSTROPHE apostrophe |
| - XK_grave, // 0x31: KEY_GRAVE grave |
| - XK_Shift_L, // 0x32: KEY_LEFTSHIFT Shift_L |
| - XK_backslash, // 0x33: KEY_BACKSLASH backslash |
| - XK_z, // 0x34: KEY_Z z |
| - XK_x, // 0x35: KEY_X x |
| - XK_c, // 0x36: KEY_C c |
| - XK_v, // 0x37: KEY_V v |
| - XK_b, // 0x38: KEY_B b |
| - XK_n, // 0x39: KEY_N n |
| - XK_m, // 0x3A: KEY_M m |
| - XK_comma, // 0x3B: KEY_COMMA comma |
| - XK_period, // 0x3C: KEY_DOT period |
| - XK_slash, // 0x3D: KEY_SLASH slash |
| - XK_Shift_R, // 0x3E: KEY_RIGHTSHIFT Shift_R |
| - 0, // 0x3F: KEY_KPASTERISK KP_Multiply |
| - XK_Alt_L, // 0x40: KEY_LEFTALT Alt_L |
| - XK_space, // 0x41: KEY_SPACE space |
| - XK_Caps_Lock, // 0x42: KEY_CAPSLOCK Caps_Lock |
| - XK_F1, // 0x43: KEY_F1 F1 |
| - XK_F2, // 0x44: KEY_F2 F2 |
| - XK_F3, // 0x45: KEY_F3 F3 |
| - XK_F4, // 0x46: KEY_F4 F4 |
| - XK_F5, // 0x47: KEY_F5 F5 |
| - XK_F6, // 0x48: KEY_F6 F6 |
| - XK_F7, // 0x49: KEY_F7 F7 |
| - XK_F8, // 0x4A: KEY_F8 F8 |
| - XK_F9, // 0x4B: KEY_F9 F9 |
| - XK_F10, // 0x4C: KEY_F10 F10 |
| - XK_Num_Lock, // 0x4D: KEY_NUMLOCK Num_Lock |
| - XK_Scroll_Lock, // 0x4E: KEY_SCROLLLOCK Scroll_Lock |
| - XK_KP_7, // 0x4F: KEY_KP7 KP_7 |
| - XK_KP_8, // 0x50: KEY_KP8 KP_8 |
| - XK_KP_9, // 0x51: KEY_KP9 KP_9 |
| - XK_KP_Subtract, // 0x52: KEY_KPMINUS KP_Subtract |
| - XK_KP_4, // 0x53: KEY_KP4 KP_4 |
| - XK_KP_5, // 0x54: KEY_KP5 KP_5 |
| - XK_KP_6, // 0x55: KEY_KP6 KP_6 |
| - XK_KP_Add, // 0x56: KEY_KPPLUS KP_Add |
| - XK_KP_1, // 0x57: KEY_KP1 KP_1 |
| - XK_KP_2, // 0x58: KEY_KP2 KP_2 |
| - XK_KP_3, // 0x59: KEY_KP3 KP_3 |
| - XK_KP_0, // 0x5A: KEY_KP0 KP_0 |
| - XK_KP_Decimal, // 0x5B: KEY_KPDOT KP_Decimal |
| - 0, // 0x5C: |
| - XK_Zenkaku_Hankaku, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku |
| - XK_backslash, // 0x5E: KEY_102ND backslash |
| - XK_F11, // 0x5F: KEY_F11 F11 |
| - XK_F12, // 0x60: KEY_F12 F12 |
| - XK_Romaji, // 0x61: KEY_RO Romaji |
| - XK_Katakana, // 0x62: KEY_KATAKANA Katakana |
| - XK_Hiragana, // 0x63: KEY_HIRAGANA Hiragana |
| - XK_Henkan, // 0x64: KEY_HENKAN Henkan |
| - XK_Hiragana_Katakana, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana |
| - XK_Muhenkan, // 0x66: KEY_MUHENKAN Muhenkan |
| - XK_KP_Separator, // 0x67: KEY_KPJPCOMMA KP_Separator |
| - XK_KP_Enter, // 0x68: KEY_KPENTER KP_Enter |
| - XK_Control_R, // 0x69: KEY_RIGHTCTRL Control_R |
| - XK_KP_Divide, // 0x6A: KEY_KPSLASH KP_Divide |
| - XK_Print, // 0x6B: KEY_SYSRQ Print |
| - XK_Alt_R, // 0x6C: KEY_RIGHTALT Alt_R |
| - XK_Linefeed, // 0x6D: KEY_LINEFEED Linefeed |
| - XK_Home, // 0x6E: KEY_HOME Home |
| - XK_Up, // 0x6F: KEY_UP Up |
| - XK_Page_Up, // 0x70: KEY_PAGEUP Page_Up |
| - XK_Left, // 0x71: KEY_LEFT Left |
| - XK_Right, // 0x72: KEY_RIGHT Right |
| - XK_End, // 0x73: KEY_END End |
| - XK_Down, // 0x74: KEY_DOWN Down |
| - XK_Page_Down, // 0x75: KEY_PAGEDOWN Page_Down |
| - XK_Insert, // 0x76: KEY_INSERT Insert |
| - XK_Delete, // 0x77: KEY_DELETE Delete |
| - 0, // 0x78: KEY_MACRO |
| - XF86XK_AudioMute, // 0x79: KEY_MUTE XF86AudioMute |
| - XF86XK_AudioLowerVolume, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume |
| - XF86XK_AudioRaiseVolume, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume |
| - XF86XK_PowerOff, // 0x7C: KEY_POWER XF86PowerOff |
| - XK_KP_Equal, // 0x7D: KEY_KPEQUAL KP_Equal |
| - XK_plusminus, // 0x7E: KEY_KPPLUSMINUS plusminus |
| - XK_Pause, // 0x7F: KEY_PAUSE Pause |
| - XF86XK_LaunchA, // 0x80: KEY_SCALE XF86LaunchA |
| - XK_KP_Decimal, // 0x81: KEY_KPCOMMA KP_Decimal |
| - XK_Hangul, // 0x82: KEY_HANGUEL Hangul |
| - XK_Hangul_Hanja, // 0x83: KEY_HANJA Hangul_Hanja |
| - XK_yen, // 0x84: KEY_YEN yen |
| - XK_Super_L, // 0x85: KEY_LEFTMETA Super_L |
| - XK_Super_R, // 0x86: KEY_RIGHTMETA Super_R |
| - XK_Menu, // 0x87: KEY_COMPOSE Menu |
| + VKEY_UNKNOWN, // 0x00: |
| + VKEY_UNKNOWN, // 0x01: |
| + VKEY_UNKNOWN, // 0x02: |
| + VKEY_UNKNOWN, // 0x03: |
| + VKEY_UNKNOWN, // 0x04: |
| + VKEY_UNKNOWN, // 0x05: |
| + VKEY_UNKNOWN, // 0x06: |
| + VKEY_UNKNOWN, // XKB evdev (XKB - 8) X KeySym |
| + VKEY_UNKNOWN, // === =============== ====== |
| + VKEY_ESCAPE, // 0x09: KEY_ESC Escape |
| + VKEY_1, // 0x0A: KEY_1 1 |
| + VKEY_2, // 0x0B: KEY_2 2 |
| + VKEY_3, // 0x0C: KEY_3 3 |
| + VKEY_4, // 0x0D: KEY_4 4 |
| + VKEY_5, // 0x0E: KEY_5 5 |
| + VKEY_6, // 0x0F: KEY_6 6 |
| + VKEY_7, // 0x10: KEY_7 7 |
| + VKEY_8, // 0x11: KEY_8 8 |
| + VKEY_9, // 0x12: KEY_9 9 |
| + VKEY_0, // 0x13: KEY_0 0 |
| + VKEY_OEM_MINUS, // 0x14: KEY_MINUS minus |
| + VKEY_OEM_PLUS, // 0x15: KEY_EQUAL equal |
| + VKEY_BACK, // 0x16: KEY_BACKSPACE BackSpace |
| + VKEY_TAB, // 0x17: KEY_TAB Tab |
| + VKEY_Q, // 0x18: KEY_Q q |
| + VKEY_W, // 0x19: KEY_W w |
| + VKEY_E, // 0x1A: KEY_E e |
| + VKEY_R, // 0x1B: KEY_R r |
| + VKEY_T, // 0x1C: KEY_T t |
| + VKEY_Y, // 0x1D: KEY_Y y |
| + VKEY_U, // 0x1E: KEY_U u |
| + VKEY_I, // 0x1F: KEY_I i |
| + VKEY_O, // 0x20: KEY_O o |
| + VKEY_P, // 0x21: KEY_P p |
| + VKEY_OEM_4, // 0x22: KEY_LEFTBRACE bracketleft |
| + VKEY_OEM_6, // 0x23: KEY_RIGHTBRACE bracketright |
| + VKEY_RETURN, // 0x24: KEY_ENTER Return |
| + VKEY_LCONTROL, // 0x25: KEY_LEFTCTRL Control_L |
| + VKEY_A, // 0x26: KEY_A a |
| + VKEY_S, // 0x27: KEY_S s |
| + VKEY_D, // 0x28: KEY_D d |
| + VKEY_F, // 0x29: KEY_F f |
| + VKEY_G, // 0x2A: KEY_G g |
| + VKEY_H, // 0x2B: KEY_H h |
| + VKEY_J, // 0x2C: KEY_J j |
| + VKEY_K, // 0x2D: KEY_K k |
| + VKEY_L, // 0x2E: KEY_L l |
| + VKEY_OEM_1, // 0x2F: KEY_SEMICOLON semicolon |
| + VKEY_OEM_7, // 0x30: KEY_APOSTROPHE apostrophe |
| + VKEY_OEM_3, // 0x31: KEY_GRAVE grave |
| + VKEY_LSHIFT, // 0x32: KEY_LEFTSHIFT Shift_L |
| + VKEY_OEM_5, // 0x33: KEY_BACKSLASH backslash |
| + VKEY_Z, // 0x34: KEY_Z z |
| + VKEY_X, // 0x35: KEY_X x |
| + VKEY_C, // 0x36: KEY_C c |
| + VKEY_V, // 0x37: KEY_V v |
| + VKEY_B, // 0x38: KEY_B b |
| + VKEY_N, // 0x39: KEY_N n |
| + VKEY_M, // 0x3A: KEY_M m |
| + VKEY_OEM_COMMA, // 0x3B: KEY_COMMA comma |
| + VKEY_OEM_PERIOD, // 0x3C: KEY_DOT period |
| + VKEY_OEM_2, // 0x3D: KEY_SLASH slash |
| + VKEY_RSHIFT, // 0x3E: KEY_RIGHTSHIFT Shift_R |
| + VKEY_MULTIPLY, // 0x3F: KEY_KPASTERISK KP_Multiply |
| + VKEY_LMENU, // 0x40: KEY_LEFTALT Alt_L |
| + VKEY_SPACE, // 0x41: KEY_SPACE space |
| + VKEY_CAPITAL, // 0x42: KEY_CAPSLOCK Caps_Lock |
| + VKEY_F1, // 0x43: KEY_F1 F1 |
| + VKEY_F2, // 0x44: KEY_F2 F2 |
| + VKEY_F3, // 0x45: KEY_F3 F3 |
| + VKEY_F4, // 0x46: KEY_F4 F4 |
| + VKEY_F5, // 0x47: KEY_F5 F5 |
| + VKEY_F6, // 0x48: KEY_F6 F6 |
| + VKEY_F7, // 0x49: KEY_F7 F7 |
| + VKEY_F8, // 0x4A: KEY_F8 F8 |
| + VKEY_F9, // 0x4B: KEY_F9 F9 |
| + VKEY_F10, // 0x4C: KEY_F10 F10 |
| + VKEY_NUMLOCK, // 0x4D: KEY_NUMLOCK Num_Lock |
| + VKEY_SCROLL, // 0x4E: KEY_SCROLLLOCK Scroll_Lock |
| + VKEY_NUMPAD7, // 0x4F: KEY_KP7 KP_7 |
| + VKEY_NUMPAD8, // 0x50: KEY_KP8 KP_8 |
| + VKEY_NUMPAD9, // 0x51: KEY_KP9 KP_9 |
| + VKEY_SUBTRACT, // 0x52: KEY_KPMINUS KP_Subtract |
| + VKEY_NUMPAD4, // 0x53: KEY_KP4 KP_4 |
| + VKEY_NUMPAD5, // 0x54: KEY_KP5 KP_5 |
| + VKEY_NUMPAD6, // 0x55: KEY_KP6 KP_6 |
| + VKEY_ADD, // 0x56: KEY_KPPLUS KP_Add |
| + VKEY_NUMPAD1, // 0x57: KEY_KP1 KP_1 |
| + VKEY_NUMPAD2, // 0x58: KEY_KP2 KP_2 |
| + VKEY_NUMPAD3, // 0x59: KEY_KP3 KP_3 |
| + VKEY_NUMPAD0, // 0x5A: KEY_KP0 KP_0 |
| + VKEY_DECIMAL, // 0x5B: KEY_KPDOT KP_Decimal |
| + VKEY_UNKNOWN, // 0x5C: |
| + VKEY_DBE_DBCSCHAR, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku |
| + VKEY_OEM_5, // 0x5E: KEY_102ND backslash |
| + VKEY_F11, // 0x5F: KEY_F11 F11 |
| + VKEY_F12, // 0x60: KEY_F12 F12 |
| + VKEY_UNKNOWN, // 0x61: KEY_RO Romaji |
| + VKEY_UNKNOWN, // 0x62: KEY_KATAKANA Katakana |
| + VKEY_UNKNOWN, // 0x63: KEY_HIRAGANA Hiragana |
| + VKEY_CONVERT, // 0x64: KEY_HENKAN Henkan |
| + VKEY_UNKNOWN, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana |
| + VKEY_NONCONVERT, // 0x66: KEY_MUHENKAN Muhenkan |
| + VKEY_SEPARATOR, // 0x67: KEY_KPJPCOMMA KP_Separator |
| + VKEY_RETURN, // 0x68: KEY_KPENTER KP_Enter |
| + VKEY_RCONTROL, // 0x69: KEY_RIGHTCTRL Control_R |
| + VKEY_DIVIDE, // 0x6A: KEY_KPSLASH KP_Divide |
| + VKEY_PRINT, // 0x6B: KEY_SYSRQ Print |
| + VKEY_RMENU, // 0x6C: KEY_RIGHTALT Alt_R |
| + VKEY_RETURN, // 0x6D: KEY_LINEFEED Linefeed |
| + VKEY_HOME, // 0x6E: KEY_HOME Home |
| + VKEY_UP, // 0x6F: KEY_UP Up |
| + VKEY_PRIOR, // 0x70: KEY_PAGEUP Page_Up |
| + VKEY_LEFT, // 0x71: KEY_LEFT Left |
| + VKEY_RIGHT, // 0x72: KEY_RIGHT Right |
| + VKEY_END, // 0x73: KEY_END End |
| + VKEY_DOWN, // 0x74: KEY_DOWN Down |
| + VKEY_NEXT, // 0x75: KEY_PAGEDOWN Page_Down |
| + VKEY_INSERT, // 0x76: KEY_INSERT Insert |
| + VKEY_DELETE, // 0x77: KEY_DELETE Delete |
| + VKEY_UNKNOWN, // 0x78: KEY_MACRO |
| + VKEY_VOLUME_MUTE, // 0x79: KEY_MUTE XF86AudioMute |
| + VKEY_VOLUME_DOWN, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume |
| + VKEY_VOLUME_UP, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume |
| + VKEY_POWER, // 0x7C: KEY_POWER XF86PowerOff |
| + VKEY_OEM_PLUS, // 0x7D: KEY_KPEQUAL KP_Equal |
| + VKEY_UNKNOWN, // 0x7E: KEY_KPPLUSMINUS plusminus |
| + VKEY_PAUSE, // 0x7F: KEY_PAUSE Pause |
| + VKEY_MEDIA_LAUNCH_APP1, // 0x80: KEY_SCALE XF86LaunchA |
| + VKEY_DECIMAL, // 0x81: KEY_KPCOMMA KP_Decimal |
| + VKEY_HANGUL, // 0x82: KEY_HANGUEL Hangul |
| + VKEY_HANJA, // 0x83: KEY_HANJA Hangul_Hanja |
| + VKEY_UNKNOWN, // 0x84: KEY_YEN yen |
| + VKEY_LWIN, // 0x85: KEY_LEFTMETA Super_L |
| + VKEY_RWIN, // 0x86: KEY_RIGHTMETA Super_R |
| + VKEY_COMPOSE, // 0x87: KEY_COMPOSE Menu |
| }; |
| if (hardware_code >= arraysize(kHardwareKeycodeMap)) { |
| // Additional keycodes used by the Chrome OS top row special function keys. |
| switch (hardware_code) { |
| case 0xA6: // KEY_BACK |
| - return XF86XK_Back; |
| + return VKEY_BACK; |
| case 0xA7: // KEY_FORWARD |
| - return XF86XK_Forward; |
| + return VKEY_BROWSER_FORWARD; |
| case 0xB5: // KEY_REFRESH |
| - return XF86XK_Reload; |
| + return VKEY_BROWSER_REFRESH; |
| case 0xD4: // KEY_DASHBOARD |
| - return XF86XK_LaunchB; |
| + return VKEY_MEDIA_LAUNCH_APP2; |
| case 0xE8: // KEY_BRIGHTNESSDOWN |
| - return XF86XK_MonBrightnessDown; |
| + return VKEY_BRIGHTNESS_DOWN; |
| case 0xE9: // KEY_BRIGHTNESSUP |
| - return XF86XK_MonBrightnessUp; |
| + return VKEY_BRIGHTNESS_UP; |
| } |
| - return 0; |
| + return VKEY_UNKNOWN; |
| } |
| return kHardwareKeycodeMap[hardware_code]; |
| } |