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> | |
| 8 | |
| 7 #define XK_3270 // for XK_3270_BackTab | 9 #define XK_3270 // for XK_3270_BackTab |
| 8 #include <X11/keysym.h> | 10 #include <X11/keysym.h> |
| 9 #include <X11/Xlib.h> | 11 #include <X11/Xlib.h> |
| 10 #include <X11/Xutil.h> | 12 #include <X11/Xutil.h> |
| 11 #include <X11/XF86keysym.h> | 13 #include <X11/XF86keysym.h> |
| 12 | 14 |
| 13 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
| 14 #include "base/logging.h" | 16 #include "base/logging.h" |
| 15 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
| 16 #include "base/strings/sys_string_conversions.h" | 18 #include "base/strings/sys_string_conversions.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 18 #include "ui/events/keycodes/dom4/keycode_converter.h" | 20 #include "ui/events/keycodes/dom4/keycode_converter.h" |
| 19 | 21 |
| 22 #define VKEY_UNSUPPORTED VKEY_UNKNOWN | |
| 23 | |
| 20 namespace ui { | 24 namespace ui { |
| 21 | 25 |
| 26 namespace { | |
| 27 | |
| 28 // MAP0 - MAP3: | |
| 29 // These are the generated VKEY code maps for all possible Latin keyboard | |
| 30 // layouts in Windows. And the maps are only for special letter keys excluding | |
| 31 // [a-z] & [0-9]. | |
| 32 // | |
| 33 // ch0: the keysym without modifier states. | |
| 34 // ch1: the keysym with shift state. | |
| 35 // ch2: the keysym with altgr state. | |
| 36 // sc: the hardware keycode (in Windows, it's called scan code). | |
| 37 // vk: the VKEY code. | |
| 38 // | |
| 39 // MAP0: maps from ch0 to vk. | |
| 40 // MAP1: maps from ch0+sc to vk. | |
| 41 // MAP2: maps from ch0+ch1+sc to vk. | |
| 42 // MAP3: maps from ch0+ch1+ch2+sc to vk. | |
| 43 // MAP0 - MAP3 are all sorted, so that finding VK can be binary search. | |
| 44 // | |
| 45 // Reason for creating these maps is because a hard-coded mapping in | |
| 46 // KeyboardCodeFromXKeysym() doesn't support non-US keyboard layouts. | |
| 47 // e.g. in UK keyboard, the key between Quote and Enter keys has the VKEY code | |
| 48 // VKEY_OEM_5 instead of VKEY_3. | |
| 49 // | |
| 50 // The key symbols which are not [a-zA-Z0-9] and functional/extend keys (e.g. | |
| 51 // TAB, ENTER, BS, Arrow keys, modifier keys, F1-F12, media/app keys, etc.) | |
| 52 // should go through these maps for correct VKEY codes. | |
| 53 // | |
| 54 // Please refer to crbug.com/386066. | |
| 55 // | |
| 56 const struct MAP0 { | |
| 57 uint16 ch0; | |
| 58 uint8 vk; | |
| 59 bool operator()(const MAP0& m1, const MAP0& m2) const { | |
| 60 return m1.ch0 < m2.ch0; | |
| 61 } | |
| 62 } map0[] = { | |
| 63 {0x0025, 0x35}, // XK_percent: VKEY_5 | |
| 64 {0x0026, 0x31}, // XK_ampersand: VKEY_1 | |
| 65 {0x003C, 0xDC}, // XK_less: VKEY_OEM_5 | |
| 66 {0x007B, 0xDE}, // XK_braceleft: VKEY_OEM_7 | |
| 67 {0x007C, 0xDC}, // XK_bar: VKEY_OEM_5 | |
| 68 {0x007D, 0xBF}, // XK_braceright: VKEY_OEM_2 | |
| 69 {0x007E, 0xDC}, // XK_asciitilde: VKEY_OEM_5 | |
| 70 {0x00A1, 0xDD}, // XK_exclamdown: VKEY_OEM_6 | |
| 71 {0x00AD, 0xC0}, // XK_hyphen: VKEY_OEM_3 | |
| 72 {0x00B2, 0xDE}, // XK_twosuperior: VKEY_OEM_7 | |
| 73 {0x00B5, 0xDC}, // XK_mu: VKEY_OEM_5 | |
| 74 {0x00BB, 0x39}, // XK_guillemotright: VKEY_9 | |
| 75 {0x00BD, 0xDC}, // XK_onehalf: VKEY_OEM_5 | |
| 76 {0x00BF, 0xDD}, // XK_questiondown: VKEY_OEM_6 | |
| 77 {0x00DF, 0xDB}, // XK_ssharp: VKEY_OEM_4 | |
| 78 {0x00E5, 0xDD}, // XK_aring: VKEY_OEM_6 | |
| 79 {0x00EA, 0x33}, // XK_ecircumflex: VKEY_3 | |
| 80 {0x00EB, 0xBA}, // XK_ediaeresis: VKEY_OEM_1 | |
| 81 {0x00EC, 0xDD}, // XK_igrave: VKEY_OEM_6 | |
| 82 {0x00EE, 0xDD}, // XK_icircumflex: VKEY_OEM_6 | |
| 83 {0x00F1, 0xC0}, // XK_ntilde: VKEY_OEM_3 | |
| 84 {0x00F2, 0xC0}, // XK_ograve: VKEY_OEM_3 | |
| 85 {0x00F5, 0xDB}, // XK_otilde: VKEY_OEM_4 | |
| 86 {0x00F7, 0xDD}, // XK_division: VKEY_OEM_6 | |
| 87 {0x00FD, 0x37}, // XK_yacute: VKEY_7 | |
| 88 {0x00FE, 0xBD}, // XK_thorn: VKEY_OEM_MINUS | |
| 89 {0x01A1, 0xDD}, // XK_ohorn: VKEY_OEM_6 | |
| 90 {0x01B0, 0xDB}, // XK_uhorn: VKEY_OEM_4 | |
| 91 {0x01B5, 0x32}, // XK_lcaron: VKEY_2 | |
| 92 {0x01B6, 0xDD}, // XK_zstroke: VKEY_OEM_6 | |
| 93 {0x01BB, 0x35}, // XK_tcaron: VKEY_5 | |
| 94 {0x01E6, 0xDE}, // XK_cacute: VKEY_OEM_7 | |
| 95 {0x01EC, 0x32}, // XK_ecaron: VKEY_2 | |
| 96 {0x01F2, 0xDC}, // XK_ncaron: VKEY_OEM_5 | |
| 97 {0x01F5, 0xDB}, // XK_odoubleacute: VKEY_OEM_4 | |
| 98 {0x01F8, 0x35}, // XK_rcaron: VKEY_5 | |
| 99 {0x01F9, 0xBA}, // XK_uring: VKEY_OEM_1 | |
| 100 {0x01FB, 0xDC}, // XK_udoubleacute: VKEY_OEM_5 | |
| 101 {0x01FE, 0xDE}, // XK_tcedilla: VKEY_OEM_7 | |
| 102 {0x0259, 0xC0}, // XK_schwa: VKEY_OEM_3 | |
| 103 {0x02B1, 0xDD}, // XK_hstroke: VKEY_OEM_6 | |
| 104 {0x02B9, 0xBA}, // XK_idotless: VKEY_OEM_1 | |
| 105 {0x02BB, 0xDD}, // XK_gbreve: VKEY_OEM_6 | |
| 106 {0x02E5, 0xC0}, // XK_cabovedot: VKEY_OEM_3 | |
| 107 {0x02F5, 0xDB}, // XK_gabovedot: VKEY_OEM_4 | |
| 108 {0x03B6, 0xBF}, // XK_lcedilla: VKEY_OEM_2 | |
| 109 {0x03BA, 0x57}, // XK_emacron: VKEY_W | |
| 110 {0x03E0, 0xDF}, // XK_amacron: VKEY_OEM_8 | |
| 111 {0x03EF, 0xDD}, // XK_imacron: VKEY_OEM_6 | |
| 112 {0x03F1, 0xDB}, // XK_ncedilla: VKEY_OEM_4 | |
| 113 {0x03F3, 0xDC}, // XK_kcedilla: VKEY_OEM_5 | |
| 114 }; | |
| 115 | |
| 116 const struct MAP1 { | |
| 117 uint16 ch0; | |
| 118 uint8 sc; | |
| 119 uint8 vk; | |
| 120 bool operator()(const MAP1& m1, const MAP1& m2) const { | |
| 121 if (m1.ch0 == m2.ch0) | |
| 122 return m1.sc < m2.sc; | |
| 123 return m1.ch0 < m2.ch0; | |
| 124 } | |
| 125 } map1[] = { | |
| 126 {0x0021, 0x0A, 0x31}, // XK_exclam+AE01: VKEY_1 | |
| 127 {0x0021, 0x11, 0x38}, // XK_exclam+AE08: VKEY_8 | |
| 128 {0x0021, 0x3D, 0xDF}, // XK_exclam+AB10: VKEY_OEM_8 | |
| 129 {0x0022, 0x0B, 0x32}, // XK_quotedbl+AE02: VKEY_2 | |
| 130 {0x0022, 0x0C, 0x33}, // XK_quotedbl+AE03: VKEY_3 | |
| 131 {0x0023, 0x31, 0xDE}, // XK_numbersign+TLDE: VKEY_OEM_7 | |
| 132 {0x0024, 0x23, 0xBA}, // XK_dollar+AD12: VKEY_OEM_1 | |
| 133 {0x0024, 0x33, 0xDF}, // XK_dollar+BKSL: VKEY_OEM_8 | |
| 134 {0x0027, 0x0D, 0x34}, // XK_quoteright+AE04: VKEY_4 | |
| 135 {0x0027, 0x18, 0xDE}, // XK_quoteright+AD01: VKEY_OEM_7 | |
| 136 {0x0027, 0x23, 0xBA}, // XK_quoteright+AD12: VKEY_OEM_1 | |
| 137 {0x0027, 0x3D, 0xDE}, // XK_quoteright+AB10: VKEY_OEM_7 | |
| 138 {0x0028, 0x0E, 0x35}, // XK_parenleft+AE05: VKEY_5 | |
| 139 {0x0028, 0x12, 0x39}, // XK_parenleft+AE09: VKEY_9 | |
| 140 {0x0028, 0x33, 0xDC}, // XK_parenleft+BKSL: VKEY_OEM_5 | |
| 141 {0x0029, 0x13, 0x30}, // XK_parenright+AE10: VKEY_0 | |
| 142 {0x0029, 0x14, 0xDB}, // XK_parenright+AE11: VKEY_OEM_4 | |
| 143 {0x0029, 0x23, 0xDD}, // XK_parenright+AD12: VKEY_OEM_6 | |
| 144 {0x002A, 0x23, 0xBA}, // XK_asterisk+AD12: VKEY_OEM_1 | |
| 145 {0x002A, 0x33, 0xDC}, // XK_asterisk+BKSL: VKEY_OEM_5 | |
| 146 {0x002B, 0x0A, 0x31}, // XK_plus+AE01: VKEY_1 | |
| 147 {0x002B, 0x15, 0xBB}, // XK_plus+AE12: VKEY_OEM_PLUS | |
| 148 {0x002B, 0x22, 0xBB}, // XK_plus+AD11: VKEY_OEM_PLUS | |
| 149 {0x002B, 0x23, 0xBB}, // XK_plus+AD12: VKEY_OEM_PLUS | |
| 150 {0x002B, 0x2F, 0xBB}, // XK_plus+AC10: VKEY_OEM_PLUS | |
| 151 {0x002B, 0x33, 0xBF}, // XK_plus+BKSL: VKEY_OEM_2 | |
| 152 {0x002C, 0x0C, 0x33}, // XK_comma+AE03: VKEY_3 | |
| 153 {0x002C, 0x0E, 0x35}, // XK_comma+AE05: VKEY_5 | |
| 154 {0x002C, 0x0F, 0x36}, // XK_comma+AE06: VKEY_6 | |
| 155 {0x002C, 0x12, 0x39}, // XK_comma+AE09: VKEY_9 | |
| 156 {0x002C, 0x19, 0xBC}, // XK_comma+AD02: VKEY_OEM_COMMA | |
| 157 {0x002C, 0x37, 0xBC}, // XK_comma+AB04: VKEY_OEM_COMMA | |
| 158 {0x002C, 0x3A, 0xBC}, // XK_comma+AB07: VKEY_OEM_COMMA | |
| 159 {0x002C, 0x3B, 0xBC}, // XK_comma+AB08: VKEY_OEM_COMMA | |
| 160 {0x002D, 0x0B, 0x32}, // XK_minus+AE02: VKEY_2 | |
| 161 {0x002D, 0x0F, 0x36}, // XK_minus+AE06: VKEY_6 | |
| 162 {0x002D, 0x14, 0xBD}, // XK_minus+AE11: VKEY_OEM_MINUS | |
| 163 {0x002D, 0x26, 0xBD}, // XK_minus+AC01: VKEY_OEM_MINUS | |
| 164 {0x002D, 0x30, 0xBD}, // XK_minus+AC11: VKEY_OEM_MINUS | |
| 165 {0x002E, 0x10, 0x37}, // XK_period+AE07: VKEY_7 | |
| 166 {0x002E, 0x11, 0x38}, // XK_period+AE08: VKEY_8 | |
| 167 {0x002E, 0x1A, 0xBE}, // XK_period+AD03: VKEY_OEM_PERIOD | |
| 168 {0x002E, 0x1B, 0xBE}, // XK_period+AD04: VKEY_OEM_PERIOD | |
| 169 {0x002E, 0x20, 0xBE}, // XK_period+AD09: VKEY_OEM_PERIOD | |
| 170 {0x002E, 0x30, 0xDE}, // XK_period+AC11: VKEY_OEM_7 | |
| 171 {0x002E, 0x3C, 0xBE}, // XK_period+AB09: VKEY_OEM_PERIOD | |
| 172 {0x002E, 0x3D, 0xBF}, // XK_period+AB10: VKEY_OEM_2 | |
| 173 {0x002F, 0x14, 0xDB}, // XK_slash+AE11: VKEY_OEM_4 | |
| 174 {0x002F, 0x22, 0xBF}, // XK_slash+AD11: VKEY_OEM_2 | |
| 175 {0x002F, 0x31, 0xDE}, // XK_slash+TLDE: VKEY_OEM_7 | |
| 176 {0x002F, 0x33, 0xDC}, // XK_slash+BKSL: VKEY_OEM_5 | |
| 177 {0x002F, 0x3D, 0xBF}, // XK_slash+AB10: VKEY_OEM_2 | |
| 178 {0x003A, 0x0A, 0x31}, // XK_colon+AE01: VKEY_1 | |
| 179 {0x003A, 0x0E, 0x35}, // XK_colon+AE05: VKEY_5 | |
| 180 {0x003A, 0x0F, 0x36}, // XK_colon+AE06: VKEY_6 | |
| 181 {0x003A, 0x3C, 0xBF}, // XK_colon+AB09: VKEY_OEM_2 | |
| 182 {0x003B, 0x0D, 0x34}, // XK_semicolon+AE04: VKEY_4 | |
| 183 {0x003B, 0x11, 0x38}, // XK_semicolon+AE08: VKEY_8 | |
| 184 {0x003B, 0x18, 0xBA}, // XK_semicolon+AD01: VKEY_OEM_1 | |
| 185 {0x003B, 0x22, 0xBA}, // XK_semicolon+AD11: VKEY_OEM_1 | |
| 186 {0x003B, 0x23, 0xDD}, // XK_semicolon+AD12: VKEY_OEM_6 | |
| 187 {0x003B, 0x2F, 0xBA}, // XK_semicolon+AC10: VKEY_OEM_1 | |
| 188 {0x003B, 0x31, 0xC0}, // XK_semicolon+TLDE: VKEY_OEM_3 | |
| 189 {0x003B, 0x34, 0xBA}, // XK_semicolon+AB01: VKEY_OEM_1 | |
| 190 {0x003B, 0x3B, 0xBE}, // XK_semicolon+AB08: VKEY_OEM_PERIOD | |
| 191 {0x003B, 0x3D, 0xBF}, // XK_semicolon+AB10: VKEY_OEM_2 | |
| 192 {0x003D, 0x11, 0x38}, // XK_equal+AE08: VKEY_8 | |
| 193 {0x003D, 0x15, 0xBB}, // XK_equal+AE12: VKEY_OEM_PLUS | |
| 194 {0x003D, 0x23, 0xBB}, // XK_equal+AD12: VKEY_OEM_PLUS | |
| 195 {0x003F, 0x0B, 0x32}, // XK_question+AE02: VKEY_2 | |
| 196 {0x003F, 0x10, 0x37}, // XK_question+AE07: VKEY_7 | |
| 197 {0x003F, 0x11, 0x38}, // XK_question+AE08: VKEY_8 | |
| 198 {0x003F, 0x14, 0xBB}, // XK_question+AE11: VKEY_OEM_PLUS | |
| 199 {0x0040, 0x23, 0xDD}, // XK_at+AD12: VKEY_OEM_6 | |
| 200 {0x0040, 0x31, 0xDE}, // XK_at+TLDE: VKEY_OEM_7 | |
| 201 {0x005B, 0x0A, 0xDB}, // XK_bracketleft+AE01: VKEY_OEM_4 | |
| 202 {0x005B, 0x14, 0xDB}, // XK_bracketleft+AE11: VKEY_OEM_4 | |
| 203 {0x005B, 0x22, 0xDB}, // XK_bracketleft+AD11: VKEY_OEM_4 | |
| 204 {0x005B, 0x23, 0xDD}, // XK_bracketleft+AD12: VKEY_OEM_6 | |
| 205 {0x005B, 0x30, 0xDE}, // XK_bracketleft+AC11: VKEY_OEM_7 | |
| 206 {0x005C, 0x15, 0xDB}, // XK_backslash+AE12: VKEY_OEM_4 | |
| 207 {0x005D, 0x0B, 0xDD}, // XK_bracketright+AE02: VKEY_OEM_6 | |
| 208 {0x005D, 0x15, 0xDD}, // XK_bracketright+AE12: VKEY_OEM_6 | |
| 209 {0x005D, 0x23, 0xDD}, // XK_bracketright+AD12: VKEY_OEM_6 | |
| 210 {0x005D, 0x31, 0xC0}, // XK_bracketright+TLDE: VKEY_OEM_3 | |
| 211 {0x005D, 0x33, 0xDC}, // XK_bracketright+BKSL: VKEY_OEM_5 | |
| 212 {0x005F, 0x11, 0x38}, // XK_underscore+AE08: VKEY_8 | |
| 213 {0x005F, 0x14, 0xBD}, // XK_underscore+AE11: VKEY_OEM_MINUS | |
| 214 {0x00A7, 0x0D, 0x34}, // XK_section+AE04: VKEY_4 | |
| 215 {0x00A7, 0x0F, 0x36}, // XK_section+AE06: VKEY_6 | |
| 216 {0x00A7, 0x30, 0xDE}, // XK_section+AC11: VKEY_OEM_7 | |
| 217 {0x00AB, 0x11, 0x38}, // XK_guillemotleft+AE08: VKEY_8 | |
| 218 {0x00AB, 0x15, 0xDD}, // XK_guillemotleft+AE12: VKEY_OEM_6 | |
| 219 {0x00B0, 0x15, 0xBF}, // XK_degree+AE12: VKEY_OEM_2 | |
| 220 {0x00B0, 0x31, 0xDE}, // XK_degree+TLDE: VKEY_OEM_7 | |
| 221 {0x00BA, 0x30, 0xDE}, // XK_masculine+AC11: VKEY_OEM_7 | |
| 222 {0x00BA, 0x31, 0xDC}, // XK_masculine+TLDE: VKEY_OEM_5 | |
| 223 {0x00E0, 0x13, 0x30}, // XK_agrave+AE10: VKEY_0 | |
| 224 {0x00E0, 0x33, 0xDC}, // XK_agrave+BKSL: VKEY_OEM_5 | |
| 225 {0x00E1, 0x11, 0x38}, // XK_aacute+AE08: VKEY_8 | |
| 226 {0x00E1, 0x30, 0xDE}, // XK_aacute+AC11: VKEY_OEM_7 | |
| 227 {0x00E2, 0x0B, 0x32}, // XK_acircumflex+AE02: VKEY_2 | |
| 228 {0x00E2, 0x33, 0xDC}, // XK_acircumflex+BKSL: VKEY_OEM_5 | |
| 229 {0x00E4, 0x23, 0xDD}, // XK_adiaeresis+AD12: VKEY_OEM_6 | |
| 230 {0x00E6, 0x2F, 0xC0}, // XK_ae+AC10: VKEY_OEM_3 | |
| 231 {0x00E6, 0x30, 0xDE}, // XK_ae+AC11: VKEY_OEM_7 | |
| 232 {0x00E7, 0x12, 0x39}, // XK_ccedilla+AE09: VKEY_9 | |
| 233 {0x00E7, 0x22, 0xDB}, // XK_ccedilla+AD11: VKEY_OEM_4 | |
| 234 {0x00E7, 0x23, 0xDD}, // XK_ccedilla+AD12: VKEY_OEM_6 | |
| 235 {0x00E7, 0x30, 0xDE}, // XK_ccedilla+AC11: VKEY_OEM_7 | |
| 236 {0x00E7, 0x33, 0xBF}, // XK_ccedilla+BKSL: VKEY_OEM_2 | |
| 237 {0x00E7, 0x3B, 0xBC}, // XK_ccedilla+AB08: VKEY_OEM_COMMA | |
| 238 {0x00E8, 0x10, 0x37}, // XK_egrave+AE07: VKEY_7 | |
| 239 {0x00E8, 0x22, 0xBA}, // XK_egrave+AD11: VKEY_OEM_1 | |
| 240 {0x00E8, 0x30, 0xC0}, // XK_egrave+AC11: VKEY_OEM_3 | |
| 241 {0x00E9, 0x0B, 0x32}, // XK_eacute+AE02: VKEY_2 | |
| 242 {0x00E9, 0x13, 0x30}, // XK_eacute+AE10: VKEY_0 | |
| 243 {0x00E9, 0x3D, 0xBF}, // XK_eacute+AB10: VKEY_OEM_2 | |
| 244 {0x00ED, 0x12, 0x39}, // XK_iacute+AE09: VKEY_9 | |
| 245 {0x00ED, 0x31, 0x30}, // XK_iacute+TLDE: VKEY_0 | |
| 246 {0x00F0, 0x22, 0xDD}, // XK_eth+AD11: VKEY_OEM_6 | |
| 247 {0x00F0, 0x23, 0xBA}, // XK_eth+AD12: VKEY_OEM_1 | |
| 248 {0x00F3, 0x15, 0xBB}, // XK_oacute+AE12: VKEY_OEM_PLUS | |
| 249 {0x00F3, 0x33, 0xDC}, // XK_oacute+BKSL: VKEY_OEM_5 | |
| 250 {0x00F4, 0x0D, 0x34}, // XK_ocircumflex+AE04: VKEY_4 | |
| 251 {0x00F4, 0x2F, 0xBA}, // XK_ocircumflex+AC10: VKEY_OEM_1 | |
| 252 {0x00F6, 0x13, 0xC0}, // XK_odiaeresis+AE10: VKEY_OEM_3 | |
| 253 {0x00F6, 0x14, 0xBB}, // XK_odiaeresis+AE11: VKEY_OEM_PLUS | |
| 254 {0x00F6, 0x22, 0xDB}, // XK_odiaeresis+AD11: VKEY_OEM_4 | |
| 255 {0x00F8, 0x2F, 0xC0}, // XK_oslash+AC10: VKEY_OEM_3 | |
| 256 {0x00F8, 0x30, 0xDE}, // XK_oslash+AC11: VKEY_OEM_7 | |
| 257 {0x00F9, 0x30, 0xC0}, // XK_ugrave+AC11: VKEY_OEM_3 | |
| 258 {0x00F9, 0x33, 0xBF}, // XK_ugrave+BKSL: VKEY_OEM_2 | |
| 259 {0x00FA, 0x22, 0xDB}, // XK_uacute+AD11: VKEY_OEM_4 | |
| 260 {0x00FA, 0x23, 0xDD}, // XK_uacute+AD12: VKEY_OEM_6 | |
| 261 {0x00FC, 0x19, 0x57}, // XK_udiaeresis+AD02: VKEY_W | |
| 262 {0x01B1, 0x0A, 0x31}, // XK_aogonek+AE01: VKEY_1 | |
| 263 {0x01B1, 0x18, 0x51}, // XK_aogonek+AD01: VKEY_Q | |
| 264 {0x01B1, 0x30, 0xDE}, // XK_aogonek+AC11: VKEY_OEM_7 | |
| 265 {0x01B3, 0x2F, 0xBA}, // XK_lstroke+AC10: VKEY_OEM_1 | |
| 266 {0x01B3, 0x33, 0xBF}, // XK_lstroke+BKSL: VKEY_OEM_2 | |
| 267 {0x01B9, 0x0C, 0x33}, // XK_scaron+AE03: VKEY_3 | |
| 268 {0x01B9, 0x0F, 0x36}, // XK_scaron+AE06: VKEY_6 | |
| 269 {0x01B9, 0x22, 0xDB}, // XK_scaron+AD11: VKEY_OEM_4 | |
| 270 {0x01B9, 0x26, 0xBA}, // XK_scaron+AC01: VKEY_OEM_1 | |
| 271 {0x01B9, 0x29, 0x46}, // XK_scaron+AC04: VKEY_F | |
| 272 {0x01B9, 0x3C, 0xBE}, // XK_scaron+AB09: VKEY_OEM_PERIOD | |
| 273 {0x01BA, 0x2F, 0xBA}, // XK_scedilla+AC10: VKEY_OEM_1 | |
| 274 {0x01BA, 0x3C, 0xBE}, // XK_scedilla+AB09: VKEY_OEM_PERIOD | |
| 275 {0x01BE, 0x0F, 0x36}, // XK_zcaron+AE06: VKEY_6 | |
| 276 {0x01BE, 0x15, 0xBB}, // XK_zcaron+AE12: VKEY_OEM_PLUS | |
| 277 {0x01BE, 0x19, 0x57}, // XK_zcaron+AD02: VKEY_W | |
| 278 {0x01BE, 0x22, 0x59}, // XK_zcaron+AD11: VKEY_Y | |
| 279 {0x01BE, 0x33, 0xDC}, // XK_zcaron+BKSL: VKEY_OEM_5 | |
| 280 {0x01BF, 0x22, 0xDB}, // XK_zabovedot+AD11: VKEY_OEM_4 | |
| 281 {0x01BF, 0x33, 0xDC}, // XK_zabovedot+BKSL: VKEY_OEM_5 | |
| 282 {0x01E3, 0x0A, 0x31}, // XK_abreve+AE01: VKEY_1 | |
| 283 {0x01E3, 0x22, 0xDB}, // XK_abreve+AD11: VKEY_OEM_4 | |
| 284 {0x01E8, 0x0B, 0x32}, // XK_ccaron+AE02: VKEY_2 | |
| 285 {0x01E8, 0x0D, 0x34}, // XK_ccaron+AE04: VKEY_4 | |
| 286 {0x01E8, 0x21, 0x58}, // XK_ccaron+AD10: VKEY_X | |
| 287 {0x01E8, 0x2F, 0xBA}, // XK_ccaron+AC10: VKEY_OEM_1 | |
| 288 {0x01E8, 0x3B, 0xBC}, // XK_ccaron+AB08: VKEY_OEM_COMMA | |
| 289 {0x01EA, 0x0C, 0x33}, // XK_eogonek+AE03: VKEY_3 | |
| 290 {0x01F0, 0x13, 0x30}, // XK_dstroke+AE10: VKEY_0 | |
| 291 {0x01F0, 0x23, 0xDD}, // XK_dstroke+AD12: VKEY_OEM_6 | |
| 292 {0x03E7, 0x0E, 0x35}, // XK_iogonek+AE05: VKEY_5 | |
| 293 {0x03EC, 0x0D, 0x34}, // XK_eabovedot+AE04: VKEY_4 | |
| 294 {0x03EC, 0x30, 0xDE}, // XK_eabovedot+AC11: VKEY_OEM_7 | |
| 295 {0x03F9, 0x10, 0x37}, // XK_uogonek+AE07: VKEY_7 | |
| 296 {0x03FE, 0x11, 0x38}, // XK_umacron+AE08: VKEY_8 | |
| 297 {0x03FE, 0x18, 0x51}, // XK_umacron+AD01: VKEY_Q | |
| 298 {0x03FE, 0x35, 0x58}, // XK_umacron+AB02: VKEY_X | |
| 299 }; | |
| 300 | |
| 301 const struct MAP2 { | |
| 302 uint16 ch0; | |
| 303 uint8 sc; | |
| 304 uint16 ch1; | |
| 305 uint8 vk; | |
| 306 bool operator()(const MAP2& m1, const MAP2& m2) const { | |
| 307 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc) | |
| 308 return m1.ch1 < m2.ch1; | |
| 309 if (m1.ch0 == m2.ch0) | |
| 310 return m1.sc < m2.sc; | |
| 311 return m1.ch0 < m2.ch0; | |
| 312 } | |
| 313 } map2[] = { | |
| 314 {0x0023, 0x33, 0x0027, 0xBF}, // XK_numbersign+BKSL+XK_quoteright: VKEY_OEM_2 | |
| 315 {0x0027, 0x30, 0x0022, 0xDE}, // XK_quoteright+AC11+XK_quotedbl: VKEY_OEM_7 | |
| 316 {0x0027, 0x31, 0x0022, 0xC0}, // XK_quoteright+TLDE+XK_quotedbl: VKEY_OEM_3 | |
| 317 {0x0027, 0x31, 0x00B7, 0xDC}, // XK_quoteright+TLDE+XK_periodcentered: VKEY_O EM_5 | |
| 318 {0x0027, 0x33, 0x0000, 0xDC}, // XK_quoteright+BKSL+NoSymbol: VKEY_OEM_5 | |
| 319 {0x002D, 0x3D, 0x003D, 0xBD}, // XK_minus+AB10+XK_equal: VKEY_OEM_MINUS | |
| 320 {0x002F, 0x0C, 0x0033, 0x33}, // XK_slash+AE03+XK_3: VKEY_3 | |
| 321 {0x002F, 0x0C, 0x003F, 0xBF}, // XK_slash+AE03+XK_question: VKEY_OEM_2 | |
| 322 {0x002F, 0x13, 0x0030, 0x30}, // XK_slash+AE10+XK_0: VKEY_0 | |
| 323 {0x002F, 0x13, 0x003F, 0xBF}, // XK_slash+AE10+XK_question: VKEY_OEM_2 | |
| 324 {0x003D, 0x3D, 0x0025, 0xDF}, // XK_equal+AB10+XK_percent: VKEY_OEM_8 | |
| 325 {0x003D, 0x3D, 0x002B, 0xBB}, // XK_equal+AB10+XK_plus: VKEY_OEM_PLUS | |
| 326 {0x005C, 0x33, 0x002F, 0xDE}, // XK_backslash+BKSL+XK_slash: VKEY_OEM_7 | |
| 327 {0x005C, 0x33, 0x007C, 0xDC}, // XK_backslash+BKSL+XK_bar: VKEY_OEM_5 | |
| 328 {0x0060, 0x31, 0x0000, 0xC0}, // XK_quoteleft+TLDE+NoSymbol: VKEY_OEM_3 | |
| 329 {0x0060, 0x31, 0x00AC, 0xDF}, // XK_quoteleft+TLDE+XK_notsign: VKEY_OEM_8 | |
| 330 {0x00A7, 0x31, 0x00B0, 0xBF}, // XK_section+TLDE+XK_degree: VKEY_OEM_2 | |
| 331 {0x00A7, 0x31, 0x00BD, 0xDC}, // XK_section+TLDE+XK_onehalf: VKEY_OEM_5 | |
| 332 {0x00E0, 0x30, 0x00B0, 0xDE}, // XK_agrave+AC11+XK_degree: VKEY_OEM_7 | |
| 333 {0x00E0, 0x30, 0x00E4, 0xDC}, // XK_agrave+AC11+XK_adiaeresis: VKEY_OEM_5 | |
| 334 {0x00E4, 0x30, 0x00E0, 0xDC}, // XK_adiaeresis+AC11+XK_agrave: VKEY_OEM_5 | |
| 335 {0x00E9, 0x2F, 0x00C9, 0xBA}, // XK_eacute+AC10+XK_Eacute: VKEY_OEM_1 | |
| 336 {0x00E9, 0x2F, 0x00F6, 0xDE}, // XK_eacute+AC10+XK_odiaeresis: VKEY_OEM_7 | |
| 337 {0x00F6, 0x2F, 0x00E9, 0xDE}, // XK_odiaeresis+AC10+XK_eacute: VKEY_OEM_7 | |
| 338 {0x00FC, 0x22, 0x00E8, 0xBA}, // XK_udiaeresis+AD11+XK_egrave: VKEY_OEM_1 | |
| 339 }; | |
| 340 | |
| 341 const struct MAP3 { | |
| 342 uint16 ch0; | |
| 343 uint8 sc; | |
| 344 uint16 ch1; | |
| 345 uint16 ch2; | |
| 346 uint8 vk; | |
| 347 bool operator()(const MAP3& m1, const MAP3& m2) const { | |
| 348 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc && m1.ch1 == m2.ch1) | |
| 349 return m1.ch2 < m2.ch2; | |
| 350 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc) | |
| 351 return m1.ch1 < m2.ch1; | |
| 352 if (m1.ch0 == m2.ch0) | |
| 353 return m1.sc < m2.sc; | |
| 354 return m1.ch0 < m2.ch0; | |
| 355 } | |
| 356 } map3[] = { | |
| 357 {0x0023, 0x33, 0x007E, 0x0000, 0xDE}, // XK_numbersign+BKSL+XK_asciitilde+NoS ymbol: VKEY_OEM_7 | |
| 358 {0x0027, 0x14, 0x003F, 0x0000, 0xDB}, // XK_quoteright+AE11+XK_question+NoSym bol: VKEY_OEM_4 | |
| 359 {0x0027, 0x14, 0x003F, 0x00DD, 0xDB}, // XK_quoteright+AE11+XK_question+XK_Ya cute: VKEY_OEM_4 | |
| 360 {0x0027, 0x15, 0x002A, 0x0000, 0xBB}, // XK_quoteright+AE12+XK_asterisk+NoSym bol: VKEY_OEM_PLUS | |
| 361 {0x0027, 0x30, 0x0040, 0x0000, 0xC0}, // XK_quoteright+AC11+XK_at+NoSymbol: V KEY_OEM_3 | |
| 362 {0x0027, 0x33, 0x002A, 0x0000, 0xBF}, // XK_quoteright+BKSL+XK_asterisk+NoSym bol: VKEY_OEM_2 | |
| 363 {0x0027, 0x33, 0x002A, 0x00BD, 0xDC}, // XK_quoteright+BKSL+XK_asterisk+XK_on ehalf: VKEY_OEM_5 | |
| 364 {0x0027, 0x33, 0x002A, 0x01A3, 0xBF}, // XK_quoteright+BKSL+XK_asterisk+XK_Ls troke: VKEY_OEM_2 | |
| 365 {0x0027, 0x34, 0x0022, 0x0000, 0x5A}, // XK_quoteright+AB01+XK_quotedbl+NoSym bol: VKEY_Z | |
| 366 {0x0027, 0x34, 0x0022, 0x01D8, 0xDE}, // XK_quoteright+AB01+XK_quotedbl+XK_Rc aron: VKEY_OEM_7 | |
| 367 {0x002B, 0x14, 0x003F, 0x0000, 0xBB}, // XK_plus+AE11+XK_question+NoSymbol: V KEY_OEM_PLUS | |
| 368 {0x002B, 0x14, 0x003F, 0x005C, 0xBD}, // XK_plus+AE11+XK_question+XK_backslas h: VKEY_OEM_MINUS | |
| 369 {0x002B, 0x14, 0x003F, 0x01F5, 0xBB}, // XK_plus+AE11+XK_question+XK_odoublea cute: VKEY_OEM_PLUS | |
| 370 {0x002D, 0x15, 0x005F, 0x0000, 0xBD}, // XK_minus+AE12+XK_underscore+NoSymbol : VKEY_OEM_MINUS | |
| 371 {0x002D, 0x15, 0x005F, 0x03B3, 0xDB}, // XK_minus+AE12+XK_underscore+XK_rcedi lla: VKEY_OEM_4 | |
| 372 {0x002D, 0x3D, 0x005F, 0x0000, 0xBD}, // XK_minus+AB10+XK_underscore+NoSymbol : VKEY_OEM_MINUS | |
| 373 {0x002D, 0x3D, 0x005F, 0x002A, 0xBD}, // XK_minus+AB10+XK_underscore+XK_aster isk: VKEY_OEM_MINUS | |
| 374 {0x002D, 0x3D, 0x005F, 0x002F, 0xBF}, // XK_minus+AB10+XK_underscore+XK_slash : VKEY_OEM_2 | |
| 375 {0x002D, 0x3D, 0x005F, 0x006E, 0xBD}, // XK_minus+AB10+XK_underscore+XK_n: VK EY_OEM_MINUS | |
| 376 {0x003D, 0x14, 0x0025, 0x0000, 0xBB}, // XK_equal+AE11+XK_percent+NoSymbol: V KEY_OEM_PLUS | |
| 377 {0x003D, 0x14, 0x0025, 0x002D, 0xBD}, // XK_equal+AE11+XK_percent+XK_minus: V KEY_OEM_MINUS | |
| 378 {0x005C, 0x31, 0x007C, 0x0031, 0xDC}, // XK_backslash+TLDE+XK_bar+XK_1: VKEY_ OEM_5 | |
| 379 {0x005C, 0x31, 0x007C, 0x03D1, 0xC0}, // XK_backslash+TLDE+XK_bar+XK_Ncedilla : VKEY_OEM_3 | |
| 380 {0x0060, 0x31, 0x007E, 0x0000, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+NoSy mbol: VKEY_OEM_3 | |
| 381 {0x0060, 0x31, 0x007E, 0x0031, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_1 : VKEY_OEM_3 | |
| 382 {0x0060, 0x31, 0x007E, 0x003B, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_s emicolon: VKEY_OEM_3 | |
| 383 {0x0060, 0x31, 0x007E, 0x0060, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_q uoteleft: VKEY_OEM_3 | |
| 384 {0x0060, 0x31, 0x007E, 0x00BF, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_q uestiondown: VKEY_OEM_3 | |
| 385 {0x0060, 0x31, 0x007E, 0x01F5, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_o doubleacute: VKEY_OEM_3 | |
| 386 {0x00E4, 0x30, 0x00C4, 0x0000, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+NoS ymbol: VKEY_OEM_7 | |
| 387 {0x00E4, 0x30, 0x00C4, 0x01A6, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+XK_ Sacute: VKEY_OEM_7 | |
| 388 {0x00E4, 0x30, 0x00C4, 0x01F8, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+XK_ rcaron: VKEY_OEM_7 | |
| 389 {0x00E7, 0x2F, 0x00C7, 0x0000, 0xBA}, // XK_ccedilla+AC10+XK_Ccedilla+NoSymbo l: VKEY_OEM_1 | |
| 390 {0x00E7, 0x2F, 0x00C7, 0x00DE, 0xC0}, // XK_ccedilla+AC10+XK_Ccedilla+XK_Thor n: VKEY_OEM_3 | |
| 391 {0x00F6, 0x2F, 0x00D6, 0x0000, 0xC0}, // XK_odiaeresis+AC10+XK_Odiaeresis+NoS ymbol: VKEY_OEM_3 | |
| 392 {0x00F6, 0x2F, 0x00D6, 0x01DE, 0xC0}, // XK_odiaeresis+AC10+XK_Odiaeresis+XK_ Tcedilla: VKEY_OEM_3 | |
| 393 {0x00FC, 0x14, 0x00DC, 0x0000, 0xBF}, // XK_udiaeresis+AE11+XK_Udiaeresis+NoS ymbol: VKEY_OEM_2 | |
| 394 {0x00FC, 0x22, 0x00DC, 0x0000, 0xBA}, // XK_udiaeresis+AD11+XK_Udiaeresis+NoS ymbol: VKEY_OEM_1 | |
| 395 {0x00FC, 0x22, 0x00DC, 0x01A3, 0xC0}, // XK_udiaeresis+AD11+XK_Udiaeresis+XK_ Lstroke: VKEY_OEM_3 | |
| 396 {0x01EA, 0x3D, 0x01CA, 0x0000, 0xBD}, // XK_eogonek+AB10+XK_Eogonek+NoSymbol: VKEY_OEM_MINUS | |
| 397 {0x01EA, 0x3D, 0x01CA, 0x006E, 0xBF}, // XK_eogonek+AB10+XK_Eogonek+XK_n: VKE Y_OEM_2 | |
| 398 {0x03E7, 0x22, 0x03C7, 0x0000, 0xDB}, // XK_iogonek+AD11+XK_Iogonek+NoSymbol: VKEY_OEM_4 | |
| 399 {0x03F9, 0x2F, 0x03D9, 0x0000, 0xC0}, // XK_uogonek+AC10+XK_Uogonek+NoSymbol: VKEY_OEM_3 | |
| 400 {0x03F9, 0x2F, 0x03D9, 0x01DE, 0xBA}, // XK_uogonek+AC10+XK_Uogonek+XK_Tcedil la: VKEY_OEM_1 | |
|
sadrul
2014/07/04 05:58:38
80+ cols here
Shu Chen
2014/07/04 09:49:44
Done.
| |
| 401 }; | |
| 402 | |
| 403 template<class T_MAP> | |
| 404 KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) | |
| 405 { | |
|
sadrul
2014/07/04 05:58:38
{ in the previous line
Shu Chen
2014/07/04 09:49:44
Done.
| |
| 406 T_MAP comp = {0}; | |
| 407 const T_MAP* p = std::lower_bound(map, map + size, key, comp); | |
| 408 if (p != map + size && !comp(*p, key) && !comp(key, *p)) | |
| 409 return static_cast<KeyboardCode>(p->vk); | |
| 410 return VKEY_UNKNOWN; | |
| 411 } | |
| 412 | |
| 413 } // namespace | |
| 414 | |
| 22 // Get an ui::KeyboardCode from an X keyevent | 415 // Get an ui::KeyboardCode from an X keyevent |
| 23 KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { | 416 KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { |
| 417 // Gets correct VKEY code from XEvent is performed as the following steps: | |
| 418 // 1. Gets the keysym without modifier states. | |
| 419 // 2. For [a-z] & [0-9] cases, returns the VKEY code accordingly. | |
| 420 // 3. Find keysym in map0. | |
| 421 // 4. If not found, fallback to find keysym + hardware_code in map1. | |
| 422 // 5. If not found, fallback to find keysym + keysym_shift + hardware_code | |
| 423 // in map2. | |
| 424 // 6. If not found, fallback to find keysym + keysym_shift + keysym_altgr + | |
| 425 // hardware_code in map3. | |
| 426 // 7. If not found, fallback to find in KeyboardCodeFromXKeysym(), which | |
| 427 // mainly for non-letter keys. | |
| 428 // 8. If not found, fallback to find with the hardware code in US layout. | |
| 429 | |
| 430 KeySym keysym = NoSymbol; | |
| 431 XKeyEvent xkey = xev->xkey; | |
| 432 xkey.state &= ~(ShiftMask | Mod1Mask); | |
| 24 // XLookupKeysym does not take into consideration the state of the lock/shift | 433 // XLookupKeysym does not take into consideration the state of the lock/shift |
| 25 // etc. keys. So it is necessary to use XLookupString instead. | 434 // etc. keys. So it is necessary to use XLookupString instead. |
| 26 KeySym keysym; | 435 XLookupString(&xkey, NULL, 0, &keysym, NULL); |
| 27 XLookupString(&xev->xkey, NULL, 0, &keysym, NULL); | 436 |
| 28 KeyboardCode keycode = KeyboardCodeFromXKeysym(keysym); | 437 // [a-z] cases. |
| 29 if (keycode == VKEY_UNKNOWN) { | 438 if (keysym >= XK_a && keysym <= XK_z) |
| 30 keysym = DefaultXKeysymFromHardwareKeycode(xev->xkey.keycode); | 439 return static_cast<KeyboardCode>(VKEY_A + keysym - XK_a); |
| 31 keycode = KeyboardCodeFromXKeysym(keysym); | 440 |
| 441 // [0-9] cases. | |
| 442 if (keysym >= XK_0 && keysym <= XK_9) | |
| 443 return static_cast<KeyboardCode>(VKEY_0 + keysym - XK_0); | |
| 444 | |
| 445 KeyboardCode keycode = VKEY_UNKNOWN; | |
| 446 | |
| 447 if (!IsKeypadKey(keysym) && !IsPrivateKeypadKey(keysym) && | |
| 448 !IsCursorKey(keysym) && !IsPFKey(keysym) && !IsFunctionKey(keysym) && | |
| 449 !IsModifierKey(keysym)) { | |
| 450 MAP0 key0 = {keysym & 0xFFFF, 0}; | |
| 451 keycode = FindVK(key0, map0, arraysize(map0)); | |
| 452 if (keycode != VKEY_UNKNOWN) | |
| 453 return keycode; | |
| 454 | |
| 455 MAP1 key1 = {keysym & 0xFFFF, xkey.keycode, 0}; | |
| 456 keycode = FindVK(key1, map1, arraysize(map1)); | |
| 457 if (keycode != VKEY_UNKNOWN) | |
| 458 return keycode; | |
| 459 | |
| 460 KeySym keysym_shift = NoSymbol; | |
| 461 xkey.state |= ShiftMask; | |
| 462 XLookupString(&xkey, NULL, 0, &keysym_shift, NULL); | |
| 463 MAP2 key2 = {keysym & 0xFFFF, xkey.keycode, keysym_shift & 0xFFFF, 0}; | |
| 464 keycode = FindVK(key2, map2, arraysize(map2)); | |
| 465 if (keycode != VKEY_UNKNOWN) | |
| 466 return keycode; | |
| 467 | |
| 468 KeySym keysym_altgr = NoSymbol; | |
| 469 xkey.state &= ~ShiftMask; | |
| 470 xkey.state |= Mod1Mask; | |
| 471 XLookupString(&xkey, NULL, 0, &keysym_altgr, NULL); | |
| 472 MAP3 key3 = { | |
| 473 keysym & 0xFFFF, | |
| 474 xkey.keycode, | |
| 475 keysym_shift & 0xFFFF, | |
| 476 keysym_altgr & 0xFFFF, | |
| 477 0 | |
| 478 }; | |
| 479 keycode = FindVK(key3, map3, arraysize(map3)); | |
| 480 if (keycode != VKEY_UNKNOWN) | |
| 481 return keycode; | |
| 482 | |
| 483 // On Linux some keys has AltGr char but not on Windows. | |
| 484 // So if cannot find VKEY with (ch0+sc+ch1+ch2) in map3, tries to fallback | |
| 485 // to just find VKEY with (ch0+sc+ch1). This is the best we could do. | |
| 486 MAP3 key4 = { | |
| 487 keysym & 0xFFFF, | |
| 488 xkey.keycode, | |
| 489 keysym_shift & 0xFFFF, | |
| 490 0xFFFF, | |
| 491 0 | |
| 492 }; | |
| 493 const MAP3* p = std::lower_bound( | |
| 494 map3, map3 + arraysize(map3), key4, MAP3()); | |
| 495 if (p != map3 + arraysize(map3) && p->ch0 == key4.ch0 && | |
| 496 p->sc == key4.sc && p->ch1 == key4.ch1) | |
| 497 return static_cast<KeyboardCode>(p->vk); | |
| 32 } | 498 } |
| 33 | 499 |
| 500 keycode = KeyboardCodeFromXKeysym(keysym); | |
| 501 if (keycode == VKEY_UNKNOWN) | |
| 502 keycode = DefaultKeyboardCodeFromHardwareKeycode(xkey.keycode); | |
| 503 | |
| 34 return keycode; | 504 return keycode; |
| 35 } | 505 } |
| 36 | 506 |
| 37 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { | 507 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { |
| 38 // TODO(sad): Have |keysym| go through the X map list? | 508 // TODO(sad): Have |keysym| go through the X map list? |
| 39 | 509 |
| 40 switch (keysym) { | 510 switch (keysym) { |
| 41 case XK_BackSpace: | 511 case XK_BackSpace: |
| 42 return VKEY_BACK; | 512 return VKEY_BACK; |
| 43 case XK_Delete: | 513 case XK_Delete: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 case XK_Hangul_Hanja: | 563 case XK_Hangul_Hanja: |
| 94 return VKEY_HANJA; | 564 return VKEY_HANJA; |
| 95 case XK_Kanji: | 565 case XK_Kanji: |
| 96 return VKEY_KANJI; | 566 return VKEY_KANJI; |
| 97 case XK_Henkan: | 567 case XK_Henkan: |
| 98 return VKEY_CONVERT; | 568 return VKEY_CONVERT; |
| 99 case XK_Muhenkan: | 569 case XK_Muhenkan: |
| 100 return VKEY_NONCONVERT; | 570 return VKEY_NONCONVERT; |
| 101 case XK_Zenkaku_Hankaku: | 571 case XK_Zenkaku_Hankaku: |
| 102 return VKEY_DBE_DBCSCHAR; | 572 return VKEY_DBE_DBCSCHAR; |
| 103 case XK_A: | |
| 104 case XK_a: | |
| 105 return VKEY_A; | |
| 106 case XK_B: | |
| 107 case XK_b: | |
| 108 return VKEY_B; | |
| 109 case XK_C: | |
| 110 case XK_c: | |
| 111 return VKEY_C; | |
| 112 case XK_D: | |
| 113 case XK_d: | |
| 114 return VKEY_D; | |
| 115 case XK_E: | |
| 116 case XK_e: | |
| 117 return VKEY_E; | |
| 118 case XK_F: | |
| 119 case XK_f: | |
| 120 return VKEY_F; | |
| 121 case XK_G: | |
| 122 case XK_g: | |
| 123 return VKEY_G; | |
| 124 case XK_H: | |
| 125 case XK_h: | |
| 126 return VKEY_H; | |
| 127 case XK_I: | |
| 128 case XK_i: | |
| 129 return VKEY_I; | |
| 130 case XK_J: | |
| 131 case XK_j: | |
| 132 return VKEY_J; | |
| 133 case XK_K: | |
| 134 case XK_k: | |
| 135 return VKEY_K; | |
| 136 case XK_L: | |
| 137 case XK_l: | |
| 138 return VKEY_L; | |
| 139 case XK_M: | |
| 140 case XK_m: | |
| 141 return VKEY_M; | |
| 142 case XK_N: | |
| 143 case XK_n: | |
| 144 return VKEY_N; | |
| 145 case XK_O: | |
| 146 case XK_o: | |
| 147 return VKEY_O; | |
| 148 case XK_P: | |
| 149 case XK_p: | |
| 150 return VKEY_P; | |
| 151 case XK_Q: | |
| 152 case XK_q: | |
| 153 return VKEY_Q; | |
| 154 case XK_R: | |
| 155 case XK_r: | |
| 156 return VKEY_R; | |
| 157 case XK_S: | |
| 158 case XK_s: | |
| 159 return VKEY_S; | |
| 160 case XK_T: | |
| 161 case XK_t: | |
| 162 return VKEY_T; | |
| 163 case XK_U: | |
| 164 case XK_u: | |
| 165 return VKEY_U; | |
| 166 case XK_V: | |
| 167 case XK_v: | |
| 168 return VKEY_V; | |
| 169 case XK_W: | |
| 170 case XK_w: | |
| 171 return VKEY_W; | |
| 172 case XK_X: | |
| 173 case XK_x: | |
| 174 return VKEY_X; | |
| 175 case XK_Y: | |
| 176 case XK_y: | |
| 177 return VKEY_Y; | |
| 178 case XK_Z: | |
| 179 case XK_z: | |
| 180 return VKEY_Z; | |
| 181 | |
| 182 case XK_0: | |
| 183 case XK_1: | |
| 184 case XK_2: | |
| 185 case XK_3: | |
| 186 case XK_4: | |
| 187 case XK_5: | |
| 188 case XK_6: | |
| 189 case XK_7: | |
| 190 case XK_8: | |
| 191 case XK_9: | |
| 192 return static_cast<KeyboardCode>(VKEY_0 + (keysym - XK_0)); | |
| 193 | |
| 194 case XK_parenright: | |
| 195 return VKEY_0; | |
| 196 case XK_exclam: | |
| 197 return VKEY_1; | |
| 198 case XK_at: | |
| 199 return VKEY_2; | |
| 200 case XK_numbersign: | |
| 201 return VKEY_3; | |
| 202 case XK_dollar: | |
| 203 return VKEY_4; | |
| 204 case XK_percent: | |
| 205 return VKEY_5; | |
| 206 case XK_asciicircum: | |
| 207 return VKEY_6; | |
| 208 case XK_ampersand: | |
| 209 return VKEY_7; | |
| 210 case XK_asterisk: | |
| 211 return VKEY_8; | |
| 212 case XK_parenleft: | |
| 213 return VKEY_9; | |
| 214 | 573 |
| 215 case XK_KP_0: | 574 case XK_KP_0: |
| 216 case XK_KP_1: | 575 case XK_KP_1: |
| 217 case XK_KP_2: | 576 case XK_KP_2: |
| 218 case XK_KP_3: | 577 case XK_KP_3: |
| 219 case XK_KP_4: | 578 case XK_KP_4: |
| 220 case XK_KP_5: | 579 case XK_KP_5: |
| 221 case XK_KP_6: | 580 case XK_KP_6: |
| 222 case XK_KP_7: | 581 case XK_KP_7: |
| 223 case XK_KP_8: | 582 case XK_KP_8: |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 int bytes_written = XLookupString(&xev->xkey, buf, 6, NULL, NULL); | 796 int bytes_written = XLookupString(&xev->xkey, buf, 6, NULL, NULL); |
| 438 DCHECK_LE(bytes_written, 6); | 797 DCHECK_LE(bytes_written, 6); |
| 439 | 798 |
| 440 if (bytes_written <= 0) | 799 if (bytes_written <= 0) |
| 441 return 0; | 800 return 0; |
| 442 const base::string16& result = base::WideToUTF16( | 801 const base::string16& result = base::WideToUTF16( |
| 443 base::SysNativeMBToWide(base::StringPiece(buf, bytes_written))); | 802 base::SysNativeMBToWide(base::StringPiece(buf, bytes_written))); |
| 444 return result.length() == 1 ? result[0] : 0; | 803 return result.length() == 1 ? result[0] : 0; |
| 445 } | 804 } |
| 446 | 805 |
| 447 unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) { | 806 KeyboardCode DefaultKeyboardCodeFromHardwareKeycode( |
| 807 unsigned int hardware_code) { | |
| 448 // This function assumes that X11 is using evdev-based keycodes. | 808 // This function assumes that X11 is using evdev-based keycodes. |
| 449 static const unsigned int kHardwareKeycodeMap[] = { | 809 static const KeyboardCode kHardwareKeycodeMap[] = { |
| 450 // This table covers the core 105-key keyboard. | 810 // Please refer to below links for the table content: |
| 451 0, // 0x00: | 811 // http://www.w3.org/TR/DOM-Level-3-Events-code/#keyboard-101 |
| 452 0, // 0x01: | 812 // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode |
| 453 0, // 0x02: | 813 // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-9231 43f3456c/translate.pdf |
| 454 0, // 0x03: | 814 VKEY_UNKNOWN, // 0x00: |
| 455 0, // 0x04: | 815 VKEY_UNKNOWN, // 0x01: |
| 456 0, // 0x05: | 816 VKEY_UNKNOWN, // 0x02: |
| 457 0, // 0x06: | 817 VKEY_UNKNOWN, // 0x03: |
| 458 0, // XKB evdev (XKB - 8) X KeySym | 818 VKEY_UNKNOWN, // 0x04: |
| 459 0, // === =============== ====== | 819 VKEY_UNKNOWN, // 0x05: |
| 460 XK_Escape, // 0x09: KEY_ESC Escape | 820 VKEY_UNKNOWN, // 0x06: |
| 461 XK_1, // 0x0A: KEY_1 1 | 821 VKEY_UNKNOWN, // XKB evdev (XKB - 8) X KeySym |
| 462 XK_2, // 0x0B: KEY_2 2 | 822 VKEY_UNKNOWN, // === =============== ====== |
| 463 XK_3, // 0x0C: KEY_3 3 | 823 VKEY_ESCAPE, // 0x09: KEY_ESC Escape |
| 464 XK_4, // 0x0D: KEY_4 4 | 824 VKEY_1, // 0x0A: KEY_1 1 |
| 465 XK_5, // 0x0E: KEY_5 5 | 825 VKEY_2, // 0x0B: KEY_2 2 |
| 466 XK_6, // 0x0F: KEY_6 6 | 826 VKEY_3, // 0x0C: KEY_3 3 |
| 467 XK_7, // 0x10: KEY_7 7 | 827 VKEY_4, // 0x0D: KEY_4 4 |
| 468 XK_8, // 0x11: KEY_8 8 | 828 VKEY_5, // 0x0E: KEY_5 5 |
| 469 XK_9, // 0x12: KEY_9 9 | 829 VKEY_6, // 0x0F: KEY_6 6 |
| 470 XK_0, // 0x13: KEY_0 0 | 830 VKEY_7, // 0x10: KEY_7 7 |
| 471 XK_minus, // 0x14: KEY_MINUS minus | 831 VKEY_8, // 0x11: KEY_8 8 |
| 472 XK_equal, // 0x15: KEY_EQUAL equal | 832 VKEY_9, // 0x12: KEY_9 9 |
| 473 XK_BackSpace, // 0x16: KEY_BACKSPACE BackSpace | 833 VKEY_0, // 0x13: KEY_0 0 |
| 474 XK_Tab, // 0x17: KEY_TAB Tab | 834 VKEY_OEM_MINUS, // 0x14: KEY_MINUS minus |
| 475 XK_q, // 0x18: KEY_Q q | 835 VKEY_OEM_PLUS, // 0x15: KEY_EQUAL equal |
| 476 XK_w, // 0x19: KEY_W w | 836 VKEY_BACK, // 0x16: KEY_BACKSPACE BackSpace |
| 477 XK_e, // 0x1A: KEY_E e | 837 VKEY_TAB, // 0x17: KEY_TAB Tab |
| 478 XK_r, // 0x1B: KEY_R r | 838 VKEY_Q, // 0x18: KEY_Q q |
| 479 XK_t, // 0x1C: KEY_T t | 839 VKEY_W, // 0x19: KEY_W w |
| 480 XK_y, // 0x1D: KEY_Y y | 840 VKEY_E, // 0x1A: KEY_E e |
| 481 XK_u, // 0x1E: KEY_U u | 841 VKEY_R, // 0x1B: KEY_R r |
| 482 XK_i, // 0x1F: KEY_I i | 842 VKEY_T, // 0x1C: KEY_T t |
| 483 XK_o, // 0x20: KEY_O o | 843 VKEY_Y, // 0x1D: KEY_Y y |
| 484 XK_p, // 0x21: KEY_P p | 844 VKEY_U, // 0x1E: KEY_U u |
| 485 XK_bracketleft, // 0x22: KEY_LEFTBRACE bracketleft | 845 VKEY_I, // 0x1F: KEY_I i |
| 486 XK_bracketright, // 0x23: KEY_RIGHTBRACE bracketright | 846 VKEY_O, // 0x20: KEY_O o |
| 487 XK_Return, // 0x24: KEY_ENTER Return | 847 VKEY_P, // 0x21: KEY_P p |
| 488 XK_Control_L, // 0x25: KEY_LEFTCTRL Control_L | 848 VKEY_OEM_4, // 0x22: KEY_LEFTBRACE bracketleft |
| 489 XK_a, // 0x26: KEY_A a | 849 VKEY_OEM_6, // 0x23: KEY_RIGHTBRACE bracketright |
| 490 XK_s, // 0x27: KEY_S s | 850 VKEY_RETURN, // 0x24: KEY_ENTER Return |
| 491 XK_d, // 0x28: KEY_D d | 851 VKEY_LCONTROL, // 0x25: KEY_LEFTCTRL Control_L |
| 492 XK_f, // 0x29: KEY_F f | 852 VKEY_A, // 0x26: KEY_A a |
| 493 XK_g, // 0x2A: KEY_G g | 853 VKEY_S, // 0x27: KEY_S s |
| 494 XK_h, // 0x2B: KEY_H h | 854 VKEY_D, // 0x28: KEY_D d |
| 495 XK_j, // 0x2C: KEY_J j | 855 VKEY_F, // 0x29: KEY_F f |
| 496 XK_k, // 0x2D: KEY_K k | 856 VKEY_G, // 0x2A: KEY_G g |
| 497 XK_l, // 0x2E: KEY_L l | 857 VKEY_H, // 0x2B: KEY_H h |
| 498 XK_semicolon, // 0x2F: KEY_SEMICOLON semicolon | 858 VKEY_J, // 0x2C: KEY_J j |
| 499 XK_apostrophe, // 0x30: KEY_APOSTROPHE apostrophe | 859 VKEY_K, // 0x2D: KEY_K k |
| 500 XK_grave, // 0x31: KEY_GRAVE grave | 860 VKEY_L, // 0x2E: KEY_L l |
| 501 XK_Shift_L, // 0x32: KEY_LEFTSHIFT Shift_L | 861 VKEY_OEM_1, // 0x2F: KEY_SEMICOLON semicolon |
| 502 XK_backslash, // 0x33: KEY_BACKSLASH backslash | 862 VKEY_OEM_7, // 0x30: KEY_APOSTROPHE apostrophe |
| 503 XK_z, // 0x34: KEY_Z z | 863 VKEY_OEM_3, // 0x31: KEY_GRAVE grave |
| 504 XK_x, // 0x35: KEY_X x | 864 VKEY_LSHIFT, // 0x32: KEY_LEFTSHIFT Shift_L |
| 505 XK_c, // 0x36: KEY_C c | 865 VKEY_OEM_5, // 0x33: KEY_BACKSLASH backslash |
| 506 XK_v, // 0x37: KEY_V v | 866 VKEY_Z, // 0x34: KEY_Z z |
| 507 XK_b, // 0x38: KEY_B b | 867 VKEY_X, // 0x35: KEY_X x |
| 508 XK_n, // 0x39: KEY_N n | 868 VKEY_C, // 0x36: KEY_C c |
| 509 XK_m, // 0x3A: KEY_M m | 869 VKEY_V, // 0x37: KEY_V v |
| 510 XK_comma, // 0x3B: KEY_COMMA comma | 870 VKEY_B, // 0x38: KEY_B b |
| 511 XK_period, // 0x3C: KEY_DOT period | 871 VKEY_N, // 0x39: KEY_N n |
| 512 XK_slash, // 0x3D: KEY_SLASH slash | 872 VKEY_M, // 0x3A: KEY_M m |
| 513 XK_Shift_R, // 0x3E: KEY_RIGHTSHIFT Shift_R | 873 VKEY_OEM_COMMA, // 0x3B: KEY_COMMA comma |
| 514 0, // 0x3F: KEY_KPASTERISK KP_Multiply | 874 VKEY_OEM_PERIOD, // 0x3C: KEY_DOT period |
| 515 XK_Alt_L, // 0x40: KEY_LEFTALT Alt_L | 875 VKEY_OEM_2, // 0x3D: KEY_SLASH slash |
| 516 XK_space, // 0x41: KEY_SPACE space | 876 VKEY_RSHIFT, // 0x3E: KEY_RIGHTSHIFT Shift_R |
| 517 XK_Caps_Lock, // 0x42: KEY_CAPSLOCK Caps_Lock | 877 VKEY_MULTIPLY, // 0x3F: KEY_KPASTERISK KP_Multiply |
| 518 XK_F1, // 0x43: KEY_F1 F1 | 878 VKEY_LMENU, // 0x40: KEY_LEFTALT Alt_L |
| 519 XK_F2, // 0x44: KEY_F2 F2 | 879 VKEY_SPACE, // 0x41: KEY_SPACE space |
| 520 XK_F3, // 0x45: KEY_F3 F3 | 880 VKEY_CAPITAL, // 0x42: KEY_CAPSLOCK Caps_Lock |
| 521 XK_F4, // 0x46: KEY_F4 F4 | 881 VKEY_F1, // 0x43: KEY_F1 F1 |
| 522 XK_F5, // 0x47: KEY_F5 F5 | 882 VKEY_F2, // 0x44: KEY_F2 F2 |
| 523 XK_F6, // 0x48: KEY_F6 F6 | 883 VKEY_F3, // 0x45: KEY_F3 F3 |
| 524 XK_F7, // 0x49: KEY_F7 F7 | 884 VKEY_F4, // 0x46: KEY_F4 F4 |
| 525 XK_F8, // 0x4A: KEY_F8 F8 | 885 VKEY_F5, // 0x47: KEY_F5 F5 |
| 526 XK_F9, // 0x4B: KEY_F9 F9 | 886 VKEY_F6, // 0x48: KEY_F6 F6 |
| 527 XK_F10, // 0x4C: KEY_F10 F10 | 887 VKEY_F7, // 0x49: KEY_F7 F7 |
| 528 XK_Num_Lock, // 0x4D: KEY_NUMLOCK Num_Lock | 888 VKEY_F8, // 0x4A: KEY_F8 F8 |
| 529 XK_Scroll_Lock, // 0x4E: KEY_SCROLLLOCK Scroll_Lock | 889 VKEY_F9, // 0x4B: KEY_F9 F9 |
| 530 XK_KP_7, // 0x4F: KEY_KP7 KP_7 | 890 VKEY_F10, // 0x4C: KEY_F10 F10 |
| 531 XK_KP_8, // 0x50: KEY_KP8 KP_8 | 891 VKEY_NUMLOCK, // 0x4D: KEY_NUMLOCK Num_Lock |
| 532 XK_KP_9, // 0x51: KEY_KP9 KP_9 | 892 VKEY_SCROLL, // 0x4E: KEY_SCROLLLOCK Scroll_Lock |
| 533 XK_KP_Subtract, // 0x52: KEY_KPMINUS KP_Subtract | 893 VKEY_NUMPAD7, // 0x4F: KEY_KP7 KP_7 |
| 534 XK_KP_4, // 0x53: KEY_KP4 KP_4 | 894 VKEY_NUMPAD8, // 0x50: KEY_KP8 KP_8 |
| 535 XK_KP_5, // 0x54: KEY_KP5 KP_5 | 895 VKEY_NUMPAD9, // 0x51: KEY_KP9 KP_9 |
| 536 XK_KP_6, // 0x55: KEY_KP6 KP_6 | 896 VKEY_SUBTRACT, // 0x52: KEY_KPMINUS KP_Subtract |
| 537 XK_KP_Add, // 0x56: KEY_KPPLUS KP_Add | 897 VKEY_NUMPAD4, // 0x53: KEY_KP4 KP_4 |
| 538 XK_KP_1, // 0x57: KEY_KP1 KP_1 | 898 VKEY_NUMPAD5, // 0x54: KEY_KP5 KP_5 |
| 539 XK_KP_2, // 0x58: KEY_KP2 KP_2 | 899 VKEY_NUMPAD6, // 0x55: KEY_KP6 KP_6 |
| 540 XK_KP_3, // 0x59: KEY_KP3 KP_3 | 900 VKEY_ADD, // 0x56: KEY_KPPLUS KP_Add |
| 541 XK_KP_0, // 0x5A: KEY_KP0 KP_0 | 901 VKEY_NUMPAD1, // 0x57: KEY_KP1 KP_1 |
| 542 XK_KP_Decimal, // 0x5B: KEY_KPDOT KP_Decimal | 902 VKEY_NUMPAD2, // 0x58: KEY_KP2 KP_2 |
| 543 0, // 0x5C: | 903 VKEY_NUMPAD3, // 0x59: KEY_KP3 KP_3 |
| 544 XK_Zenkaku_Hankaku, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku | 904 VKEY_NUMPAD0, // 0x5A: KEY_KP0 KP_0 |
| 545 XK_backslash, // 0x5E: KEY_102ND backslash | 905 VKEY_DECIMAL, // 0x5B: KEY_KPDOT KP_Decimal |
| 546 XK_F11, // 0x5F: KEY_F11 F11 | 906 VKEY_UNKNOWN, // 0x5C: |
| 547 XK_F12, // 0x60: KEY_F12 F12 | 907 VKEY_DBE_DBCSCHAR, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku |
| 548 XK_Romaji, // 0x61: KEY_RO Romaji | 908 VKEY_OEM_5, // 0x5E: KEY_102ND backslash |
| 549 XK_Katakana, // 0x62: KEY_KATAKANA Katakana | 909 VKEY_F11, // 0x5F: KEY_F11 F11 |
| 550 XK_Hiragana, // 0x63: KEY_HIRAGANA Hiragana | 910 VKEY_F12, // 0x60: KEY_F12 F12 |
| 551 XK_Henkan, // 0x64: KEY_HENKAN Henkan | 911 VKEY_OEM_102, // 0x61: KEY_RO Romaji |
| 552 XK_Hiragana_Katakana, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana | 912 VKEY_UNSUPPORTED, // 0x62: KEY_KATAKANA Katakana |
| 553 XK_Muhenkan, // 0x66: KEY_MUHENKAN Muhenkan | 913 VKEY_UNSUPPORTED, // 0x63: KEY_HIRAGANA Hiragana |
| 554 XK_KP_Separator, // 0x67: KEY_KPJPCOMMA KP_Separator | 914 VKEY_CONVERT, // 0x64: KEY_HENKAN Henkan |
| 555 XK_KP_Enter, // 0x68: KEY_KPENTER KP_Enter | 915 VKEY_UNSUPPORTED, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana |
| 556 XK_Control_R, // 0x69: KEY_RIGHTCTRL Control_R | 916 VKEY_NONCONVERT, // 0x66: KEY_MUHENKAN Muhenkan |
| 557 XK_KP_Divide, // 0x6A: KEY_KPSLASH KP_Divide | 917 VKEY_SEPARATOR, // 0x67: KEY_KPJPCOMMA KP_Separator |
| 558 XK_Print, // 0x6B: KEY_SYSRQ Print | 918 VKEY_RETURN, // 0x68: KEY_KPENTER KP_Enter |
| 559 XK_Alt_R, // 0x6C: KEY_RIGHTALT Alt_R | 919 VKEY_RCONTROL, // 0x69: KEY_RIGHTCTRL Control_R |
| 560 XK_Linefeed, // 0x6D: KEY_LINEFEED Linefeed | 920 VKEY_DIVIDE, // 0x6A: KEY_KPSLASH KP_Divide |
| 561 XK_Home, // 0x6E: KEY_HOME Home | 921 VKEY_PRINT, // 0x6B: KEY_SYSRQ Print |
| 562 XK_Up, // 0x6F: KEY_UP Up | 922 VKEY_RMENU, // 0x6C: KEY_RIGHTALT Alt_R |
| 563 XK_Page_Up, // 0x70: KEY_PAGEUP Page_Up | 923 VKEY_RETURN, // 0x6D: KEY_LINEFEED Linefeed |
| 564 XK_Left, // 0x71: KEY_LEFT Left | 924 VKEY_HOME, // 0x6E: KEY_HOME Home |
| 565 XK_Right, // 0x72: KEY_RIGHT Right | 925 VKEY_UP, // 0x6F: KEY_UP Up |
| 566 XK_End, // 0x73: KEY_END End | 926 VKEY_PRIOR, // 0x70: KEY_PAGEUP Page_Up |
| 567 XK_Down, // 0x74: KEY_DOWN Down | 927 VKEY_LEFT, // 0x71: KEY_LEFT Left |
| 568 XK_Page_Down, // 0x75: KEY_PAGEDOWN Page_Down | 928 VKEY_RIGHT, // 0x72: KEY_RIGHT Right |
| 569 XK_Insert, // 0x76: KEY_INSERT Insert | 929 VKEY_END, // 0x73: KEY_END End |
| 570 XK_Delete, // 0x77: KEY_DELETE Delete | 930 VKEY_DOWN, // 0x74: KEY_DOWN Down |
| 571 0, // 0x78: KEY_MACRO | 931 VKEY_NEXT, // 0x75: KEY_PAGEDOWN Page_Down |
| 572 XF86XK_AudioMute, // 0x79: KEY_MUTE XF86AudioMute | 932 VKEY_INSERT, // 0x76: KEY_INSERT Insert |
| 573 XF86XK_AudioLowerVolume, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume | 933 VKEY_DELETE, // 0x77: KEY_DELETE Delete |
| 574 XF86XK_AudioRaiseVolume, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume | 934 VKEY_UNSUPPORTED, // 0x78: KEY_MACRO |
| 575 XF86XK_PowerOff, // 0x7C: KEY_POWER XF86PowerOff | 935 VKEY_VOLUME_MUTE, // 0x79: KEY_MUTE XF86AudioMute |
| 576 XK_KP_Equal, // 0x7D: KEY_KPEQUAL KP_Equal | 936 VKEY_VOLUME_DOWN, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume |
| 577 XK_plusminus, // 0x7E: KEY_KPPLUSMINUS plusminus | 937 VKEY_VOLUME_UP, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume |
| 578 XK_Pause, // 0x7F: KEY_PAUSE Pause | 938 VKEY_POWER, // 0x7C: KEY_POWER XF86PowerOff |
| 579 XF86XK_LaunchA, // 0x80: KEY_SCALE XF86LaunchA | 939 VKEY_OEM_PLUS, // 0x7D: KEY_KPEQUAL KP_Equal |
| 580 XK_KP_Decimal, // 0x81: KEY_KPCOMMA KP_Decimal | 940 VKEY_UNSUPPORTED, // 0x7E: KEY_KPPLUSMINUS plusminus |
| 581 XK_Hangul, // 0x82: KEY_HANGUEL Hangul | 941 VKEY_PAUSE, // 0x7F: KEY_PAUSE Pause |
| 582 XK_Hangul_Hanja, // 0x83: KEY_HANJA Hangul_Hanja | 942 VKEY_MEDIA_LAUNCH_APP1, // 0x80: KEY_SCALE XF86LaunchA |
| 583 XK_yen, // 0x84: KEY_YEN yen | 943 VKEY_DECIMAL, // 0x81: KEY_KPCOMMA KP_Decimal |
| 584 XK_Super_L, // 0x85: KEY_LEFTMETA Super_L | 944 VKEY_HANGUL, // 0x82: KEY_HANGUEL Hangul |
| 585 XK_Super_R, // 0x86: KEY_RIGHTMETA Super_R | 945 VKEY_HANJA, // 0x83: KEY_HANJA Hangul_Hanja |
| 586 XK_Menu, // 0x87: KEY_COMPOSE Menu | 946 VKEY_OEM_5, // 0x84: KEY_YEN yen |
| 947 VKEY_LWIN, // 0x85: KEY_LEFTMETA Super_L | |
| 948 VKEY_RWIN, // 0x86: KEY_RIGHTMETA Super_R | |
| 949 VKEY_COMPOSE, // 0x87: KEY_COMPOSE Menu | |
| 587 }; | 950 }; |
| 588 | 951 |
| 589 if (hardware_code >= arraysize(kHardwareKeycodeMap)) { | 952 if (hardware_code >= arraysize(kHardwareKeycodeMap)) { |
| 590 // Additional keycodes used by the Chrome OS top row special function keys. | 953 // Additional keycodes used by the Chrome OS top row special function keys. |
| 591 switch (hardware_code) { | 954 switch (hardware_code) { |
| 592 case 0xA6: // KEY_BACK | 955 case 0xA6: // KEY_BACK |
| 593 return XF86XK_Back; | 956 return VKEY_BACK; |
| 594 case 0xA7: // KEY_FORWARD | 957 case 0xA7: // KEY_FORWARD |
| 595 return XF86XK_Forward; | 958 return VKEY_BROWSER_FORWARD; |
| 596 case 0xB5: // KEY_REFRESH | 959 case 0xB5: // KEY_REFRESH |
| 597 return XF86XK_Reload; | 960 return VKEY_BROWSER_REFRESH; |
| 598 case 0xD4: // KEY_DASHBOARD | 961 case 0xD4: // KEY_DASHBOARD |
| 599 return XF86XK_LaunchB; | 962 return VKEY_MEDIA_LAUNCH_APP2; |
| 600 case 0xE8: // KEY_BRIGHTNESSDOWN | 963 case 0xE8: // KEY_BRIGHTNESSDOWN |
| 601 return XF86XK_MonBrightnessDown; | 964 return VKEY_BRIGHTNESS_DOWN; |
| 602 case 0xE9: // KEY_BRIGHTNESSUP | 965 case 0xE9: // KEY_BRIGHTNESSUP |
| 603 return XF86XK_MonBrightnessUp; | 966 return VKEY_BRIGHTNESS_UP; |
| 604 } | 967 } |
| 605 return 0; | 968 return VKEY_UNKNOWN; |
| 606 } | 969 } |
| 607 return kHardwareKeycodeMap[hardware_code]; | 970 return kHardwareKeycodeMap[hardware_code]; |
| 608 } | 971 } |
| 609 | 972 |
| 610 // TODO(jcampan): this method might be incomplete. | 973 // TODO(jcampan): this method might be incomplete. |
| 611 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { | 974 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { |
| 612 switch (keycode) { | 975 switch (keycode) { |
| 613 case VKEY_NUMPAD0: | 976 case VKEY_NUMPAD0: |
| 614 return XK_KP_0; | 977 return XK_KP_0; |
| 615 case VKEY_NUMPAD1: | 978 case VKEY_NUMPAD1: |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 870 case VKEY_KBD_BRIGHTNESS_UP: | 1233 case VKEY_KBD_BRIGHTNESS_UP: |
| 871 return XF86XK_KbdBrightnessUp; | 1234 return XF86XK_KbdBrightnessUp; |
| 872 | 1235 |
| 873 default: | 1236 default: |
| 874 LOG(WARNING) << "Unknown keycode:" << keycode; | 1237 LOG(WARNING) << "Unknown keycode:" << keycode; |
| 875 return 0; | 1238 return 0; |
| 876 } | 1239 } |
| 877 } | 1240 } |
| 878 | 1241 |
| 879 } // namespace ui | 1242 } // namespace ui |
| OLD | NEW |