Index: ui/base/keycodes/keyboard_code_conversion_x.cc |
diff --git a/ui/base/keycodes/keyboard_code_conversion_x.cc b/ui/base/keycodes/keyboard_code_conversion_x.cc |
index 47ce8302dcdfd287e02b1746f2c7874042d59768..4235fca327cbfef0ca8de8c7fdd9aef219b9ffe0 100644 |
--- a/ui/base/keycodes/keyboard_code_conversion_x.cc |
+++ b/ui/base/keycodes/keyboard_code_conversion_x.cc |
@@ -7,6 +7,7 @@ |
#include <X11/keysym.h> |
#include <X11/Xlib.h> |
+#include "base/basictypes.h" |
#include "base/logging.h" |
namespace ui { |
@@ -15,6 +16,16 @@ namespace ui { |
KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { |
KeySym keysym = XLookupKeysym(&xev->xkey, 0); |
+ KeyboardCode keycode = KeyboardCodeFromXKeysym(keysym); |
+ if (keycode == VKEY_UNKNOWN) { |
+ keysym = DefaultXKeysymFromHardwareKeycode(xev->xkey.keycode); |
+ keycode = KeyboardCodeFromXKeysym(keysym); |
+ } |
+ |
+ return keycode; |
+} |
+ |
+KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { |
// Consult GDK key translation (in WindowsKeyCodeForGdkKeyCode) for details |
// about the following translations. |
@@ -278,4 +289,91 @@ KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { |
return VKEY_UNKNOWN; |
} |
+unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) { |
+ static const unsigned int kHardwareKeycodeMap[] = { |
+ 0, // 0x00: |
+ 0, // 0x01: |
+ 0, // 0x02: |
+ 0, // 0x03: |
+ 0, // 0x04: |
+ 0, // 0x05: |
+ 0, // 0x06: |
+ 0, // 0x07: |
+ 0, // 0x08: |
+ XK_Escape, // 0x09: XK_Escape |
+ XK_1, // 0x0A: XK_1 |
+ XK_2, // 0x0B: XK_2 |
+ XK_3, // 0x0C: XK_3 |
+ XK_4, // 0x0D: XK_4 |
+ XK_5, // 0x0E: XK_5 |
+ XK_6, // 0x0F: XK_6 |
+ XK_7, // 0x10: XK_7 |
+ XK_8, // 0x11: XK_8 |
+ XK_9, // 0x12: XK_9 |
+ XK_0, // 0x13: XK_0 |
+ XK_minus, // 0x14: XK_minus |
+ XK_equal, // 0x15: XK_equal |
+ XK_BackSpace, // 0x16: XK_BackSpace |
+ XK_Tab, // 0x17: XK_Tab |
+ XK_q, // 0x18: XK_q |
+ XK_w, // 0x19: XK_w |
+ XK_e, // 0x1A: XK_e |
+ XK_r, // 0x1B: XK_r |
+ XK_t, // 0x1C: XK_t |
+ XK_y, // 0x1D: XK_y |
+ XK_u, // 0x1E: XK_u |
+ XK_i, // 0x1F: XK_i |
+ XK_o, // 0x20: XK_o |
+ XK_p, // 0x21: XK_p |
+ XK_bracketleft, // 0x22: XK_bracketleft |
+ XK_bracketright, // 0x23: XK_bracketright |
+ XK_Return, // 0x24: XK_Return |
+ XK_Control_L, // 0x25: XK_Control_L |
+ XK_a, // 0x26: XK_a |
+ XK_s, // 0x27: XK_s |
+ XK_d, // 0x28: XK_d |
+ XK_f, // 0x29: XK_f |
+ XK_g, // 0x2A: XK_g |
+ XK_h, // 0x2B: XK_h |
+ XK_j, // 0x2C: XK_j |
+ XK_k, // 0x2D: XK_k |
+ XK_l, // 0x2E: XK_l |
+ XK_semicolon, // 0x2F: XK_semicolon |
+ XK_apostrophe, // 0x30: XK_apostrophe |
+ XK_grave, // 0x31: XK_grave |
+ XK_Shift_L, // 0x32: XK_Shift_L |
+ XK_backslash, // 0x33: XK_backslash |
+ XK_z, // 0x34: XK_z |
+ XK_x, // 0x35: XK_x |
+ XK_c, // 0x36: XK_c |
+ XK_v, // 0x37: XK_v |
+ XK_b, // 0x38: XK_b |
+ XK_n, // 0x39: XK_n |
+ XK_m, // 0x3A: XK_m |
+ XK_comma, // 0x3B: XK_comma |
+ XK_period, // 0x3C: XK_period |
+ XK_slash, // 0x3D: XK_slash |
+ XK_Shift_R, // 0x3E: XK_Shift_R |
+ 0, // 0x3F: XK_KP_Multiply |
+ XK_Alt_L, // 0x40: XK_Alt_L |
+ XK_space, // 0x41: XK_space |
+ XK_Caps_Lock, // 0x42: XK_Caps_Lock |
+ XK_F1, // 0x43: XK_F1 |
+ XK_F2, // 0x44: XK_F2 |
+ XK_F3, // 0x45: XK_F3 |
+ XK_F4, // 0x46: XK_F4 |
+ XK_F5, // 0x47: XK_F5 |
+ XK_F6, // 0x48: XK_F6 |
+ XK_F7, // 0x49: XK_F7 |
+ XK_F8, // 0x4A: XK_F8 |
+ XK_F9, // 0x4B: XK_F9 |
+ XK_F10, // 0x4C: XK_F10 |
+ XK_Num_Lock, // 0x4D: XK_Num_Lock |
+ XK_Scroll_Lock, // 0x4E: XK_Scroll_Lock |
+ }; |
+ |
+ return hardware_code < arraysize(kHardwareKeycodeMap) ? |
+ kHardwareKeycodeMap[hardware_code] : 0; |
+} |
+ |
} // namespace ui |