OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/keyboard_code_conversion.h" |
| 6 |
| 7 #include <string.h> |
| 8 |
| 9 #include "base/keyboard_codes.h" |
| 10 |
| 11 namespace base { |
| 12 |
| 13 namespace { |
| 14 |
| 15 typedef struct KeyIdentifier { |
| 16 const char* key_name; |
| 17 const char character; |
| 18 const char* unicode_codepoint; |
| 19 const KeyboardCode key_code; |
| 20 } KeyIdentifier; |
| 21 |
| 22 // Taken from Section 6.3.3 here: |
| 23 // http://www.w3.org/TR/DOM-Level-3-Events/#keyset-keyidentifiers |
| 24 // TODO(bryeung): keycodes could be wrong: I took the keydown code only |
| 25 static const KeyIdentifier kKeyIdentifiers[] = { |
| 26 { "Accept", '\0', "", VKEY_ACCEPT }, |
| 27 { "Add", '\0', "", VKEY_ADD }, |
| 28 { "Again", '\0', "", VKEY_UNKNOWN }, |
| 29 { "AllCandidates", '\0', "", VKEY_UNKNOWN }, |
| 30 { "Alphanumeric", '\0', "", VKEY_UNKNOWN }, |
| 31 { "Alt", '\0', "", VKEY_MENU }, |
| 32 { "AltGraph", '\0', "", VKEY_UNKNOWN }, |
| 33 { "Apps", '\0', "", VKEY_APPS }, |
| 34 { "Attn", '\0', "", VKEY_ATTN }, |
| 35 { "BrowserBack", '\0', "", VKEY_BROWSER_BACK }, |
| 36 { "BrowserFavorites", '\0', "", VKEY_BROWSER_FAVORITES }, |
| 37 { "BrowserForward", '\0', "", VKEY_BROWSER_FAVORITES }, |
| 38 { "BrowserHome", '\0', "", VKEY_BROWSER_HOME }, |
| 39 { "BrowserRefresh", '\0', "", VKEY_BROWSER_REFRESH }, |
| 40 { "BrowserSearch", '\0', "", VKEY_BROWSER_SEARCH }, |
| 41 { "BrowserStop", '\0', "", VKEY_BROWSER_STOP }, |
| 42 { "CapsLock", '\0', "", VKEY_CAPITAL }, |
| 43 { "Clear", '\0', "", VKEY_OEM_CLEAR }, |
| 44 { "CodeInput", '\0', "", VKEY_UNKNOWN }, |
| 45 { "Compose", '\0', "", VKEY_UNKNOWN }, |
| 46 { "Control", '\0', "", VKEY_CONTROL }, |
| 47 { "Crsel", '\0', "", VKEY_CRSEL }, |
| 48 { "Convert", '\0', "", VKEY_CONVERT }, |
| 49 { "Copy", '\0', "", VKEY_UNKNOWN }, |
| 50 { "Cut", '\0', "", VKEY_UNKNOWN }, |
| 51 { "Decimal", '\0', "", VKEY_DECIMAL }, |
| 52 { "Divide", '\0', "", VKEY_DIVIDE }, |
| 53 { "Down", '\0', "", VKEY_DOWN }, |
| 54 { "DownLeft", '\0', "", VKEY_UNKNOWN }, |
| 55 { "DownRight", '\0', "", VKEY_UNKNOWN }, |
| 56 { "End", '\0', "", VKEY_END }, |
| 57 { "Enter", '\0', "", VKEY_RETURN }, |
| 58 { "EraseEof", '\0', "", VKEY_EREOF }, |
| 59 { "Execute", '\0', "", VKEY_EXECUTE }, |
| 60 { "Exsel", '\0', "", VKEY_EXSEL }, |
| 61 { "Fn", '\0', "", VKEY_UNKNOWN }, |
| 62 { "F1", '\0', "", VKEY_F1 }, |
| 63 { "F2", '\0', "", VKEY_F2 }, |
| 64 { "F3", '\0', "", VKEY_F3 }, |
| 65 { "F4", '\0', "", VKEY_F4 }, |
| 66 { "F5", '\0', "", VKEY_F5 }, |
| 67 { "F6", '\0', "", VKEY_F6 }, |
| 68 { "F7", '\0', "", VKEY_F7 }, |
| 69 { "F8", '\0', "", VKEY_F8 }, |
| 70 { "F9", '\0', "", VKEY_F9 }, |
| 71 { "F10", '\0', "", VKEY_F10 }, |
| 72 { "F11", '\0', "", VKEY_F11 }, |
| 73 { "F12", '\0', "", VKEY_F12 }, |
| 74 { "F13", '\0', "", VKEY_F13 }, |
| 75 { "F14", '\0', "", VKEY_F14 }, |
| 76 { "F15", '\0', "", VKEY_F15 }, |
| 77 { "F16", '\0', "", VKEY_F16 }, |
| 78 { "F17", '\0', "", VKEY_F17 }, |
| 79 { "F18", '\0', "", VKEY_F18 }, |
| 80 { "F19", '\0', "", VKEY_F19 }, |
| 81 { "F20", '\0', "", VKEY_F20 }, |
| 82 { "F21", '\0', "", VKEY_F21 }, |
| 83 { "F22", '\0', "", VKEY_F22 }, |
| 84 { "F23", '\0', "", VKEY_F23 }, |
| 85 { "F24", '\0', "", VKEY_F24 }, |
| 86 { "FinalMode", '\0', "", VKEY_FINAL }, |
| 87 { "Find", '\0', "", VKEY_UNKNOWN }, |
| 88 { "FullWidth", '\0', "", VKEY_UNKNOWN }, |
| 89 { "HalfWidth", '\0', "", VKEY_UNKNOWN }, |
| 90 { "HangulMode", '\0', "", VKEY_HANGUL }, |
| 91 { "HanjaMode", '\0', "", VKEY_HANJA }, |
| 92 { "Help", '\0', "", VKEY_HELP }, |
| 93 { "Hiragana", '\0', "", VKEY_UNKNOWN }, |
| 94 { "Home", '\0', "", VKEY_HOME }, |
| 95 { "Insert", '\0', "", VKEY_INSERT }, |
| 96 { "JapaneseHiragana", '\0', "", VKEY_UNKNOWN }, |
| 97 { "JapaneseKatakana", '\0', "", VKEY_UNKNOWN }, |
| 98 { "JapaneseRomaji", '\0', "", VKEY_UNKNOWN }, |
| 99 { "JunjaMode", '\0', "", VKEY_JUNJA }, |
| 100 { "KanaMode", '\0', "", VKEY_KANA }, |
| 101 { "KanjiMode", '\0', "", VKEY_KANJI }, |
| 102 { "Katakana", '\0', "", VKEY_UNKNOWN }, |
| 103 { "LaunchApplication1", '\0', "", VKEY_MEDIA_LAUNCH_APP1 }, |
| 104 { "LaunchApplication2", '\0', "", VKEY_MEDIA_LAUNCH_APP2 }, |
| 105 { "LaunchMail", '\0', "", VKEY_MEDIA_LAUNCH_MAIL }, |
| 106 { "Left", '\0', "", VKEY_LEFT }, |
| 107 { "Menu", '\0', "", VKEY_MENU }, |
| 108 { "Meta", '\0', "", VKEY_UNKNOWN }, |
| 109 { "MediaNextTrack", '\0', "", VKEY_MEDIA_NEXT_TRACK }, |
| 110 { "MediaPlayPause", '\0', "", VKEY_MEDIA_PLAY_PAUSE }, |
| 111 { "MediaPreviousTrack", '\0', "", VKEY_MEDIA_PREV_TRACK }, |
| 112 { "MediaStop", '\0', "", VKEY_MEDIA_STOP }, |
| 113 { "ModeChange", '\0', "", VKEY_MODECHANGE }, |
| 114 { "Multiply", '\0', "", VKEY_MULTIPLY }, |
| 115 { "NextCandidate", '\0', "", VKEY_UNKNOWN }, |
| 116 { "Nonconvert", '\0', "", VKEY_NONCONVERT }, |
| 117 { "NumLock", '\0', "", VKEY_NUMLOCK }, |
| 118 { "PageDown", '\0', "", VKEY_NEXT }, |
| 119 { "PageUp", '\0', "", VKEY_PRIOR }, |
| 120 { "Paste", '\0', "", VKEY_UNKNOWN }, |
| 121 { "Pause", '\0', "", VKEY_PAUSE }, |
| 122 { "Play", '\0', "", VKEY_PLAY }, |
| 123 { "PreviousCandidate", '\0', "", VKEY_UNKNOWN }, |
| 124 { "PrintScreen", '\0', "", VKEY_SNAPSHOT }, |
| 125 { "Process", '\0', "", VKEY_PROCESSKEY }, |
| 126 { "Props", '\0', "", VKEY_UNKNOWN }, |
| 127 { "Right", '\0', "", VKEY_RIGHT }, |
| 128 { "RomanCharacters", '\0', "", VKEY_UNKNOWN }, |
| 129 { "Scroll", '\0', "", VKEY_SCROLL }, |
| 130 { "Select", '\0', "", VKEY_SELECT }, |
| 131 { "SelectMedia", '\0', "", VKEY_MEDIA_LAUNCH_MEDIA_SELECT }, |
| 132 { "Separator", '\0', "", VKEY_SEPARATOR }, |
| 133 { "Shift", '\0', "", VKEY_SHIFT }, |
| 134 { "Soft1", '\0', "", VKEY_UNKNOWN }, |
| 135 { "Soft2", '\0', "", VKEY_UNKNOWN }, |
| 136 { "Soft3", '\0', "", VKEY_UNKNOWN }, |
| 137 { "Soft4", '\0', "", VKEY_UNKNOWN }, |
| 138 { "Stop", '\0', "", VKEY_UNKNOWN }, |
| 139 { "Subtract", '\0', "", VKEY_SUBTRACT }, |
| 140 { "Up", '\0', "", VKEY_UP }, |
| 141 { "UpLeft", '\0', "", VKEY_UNKNOWN }, |
| 142 { "UpRight", '\0', "", VKEY_UNKNOWN }, |
| 143 { "Undo", '\0', "", VKEY_UNKNOWN }, |
| 144 { "VolumeDown", '\0', "", VKEY_VOLUME_DOWN }, |
| 145 { "VolumeMute", '\0', "", VKEY_VOLUME_MUTE }, |
| 146 { "VolumeUp", '\0', "", VKEY_VOLUME_UP }, |
| 147 { "Win", '\0', "", VKEY_LWIN }, |
| 148 { "Zoom", '\0', "", VKEY_ZOOM }, |
| 149 { "Backspace", '\0', "U+0008", VKEY_BACK }, |
| 150 { "Tab", '\0', "U+0009", VKEY_TAB }, |
| 151 { "Cancel", '\0', "U+0018", VKEY_UNKNOWN }, |
| 152 { "Esc", '\0', "U+001B", VKEY_ESCAPE }, |
| 153 { "Spacebar", ' ', "U+0020", VKEY_SPACE }, |
| 154 { "Exclamation", '!', "U+0021", VKEY_1 }, |
| 155 { "DoubleQuote", '\"', "U+0022", VKEY_OEM_7 }, |
| 156 { "Hash", '\0', "U+0023", VKEY_3 }, |
| 157 { "Dollar", '$', "U+0024", VKEY_4 }, |
| 158 { "Ampersand", '&', "U+0026", VKEY_5 }, |
| 159 { "Apostrophe", '\'', "U+0027", VKEY_OEM_7 }, |
| 160 { "LeftParen", '(', "U+0028", VKEY_9 }, |
| 161 { "RightParen", ')', "U+0029", VKEY_0 }, |
| 162 { "Asterisk", '*', "U+002A", VKEY_8 }, |
| 163 { "Plus", '+', "U+002B", VKEY_OEM_PLUS }, |
| 164 { "Percent", '+', "U+0025", VKEY_5 }, |
| 165 { "Comma", ',', "U+002C", VKEY_OEM_COMMA }, |
| 166 { "HyphenMinus", '-', "U+002D", VKEY_OEM_MINUS }, |
| 167 { "Period", '.', "U+002E", VKEY_OEM_PERIOD }, |
| 168 { "Solidus", '/', "U+002F", VKEY_OEM_2 }, |
| 169 { "", '0', "U+0030", VKEY_0 }, |
| 170 { "", '1', "U+0031", VKEY_1 }, |
| 171 { "", '2', "U+0032", VKEY_2 }, |
| 172 { "", '3', "U+0033", VKEY_3 }, |
| 173 { "", '4', "U+0034", VKEY_4 }, |
| 174 { "", '5', "U+0035", VKEY_5 }, |
| 175 { "", '6', "U+0036", VKEY_6 }, |
| 176 { "", '7', "U+0037", VKEY_7 }, |
| 177 { "", '8', "U+0038", VKEY_8 }, |
| 178 { "", '9', "U+0039", VKEY_9 }, |
| 179 { "Colon", ':', "U+003A", VKEY_OEM_1 }, |
| 180 { "Semicolon", ';', "U+003B", VKEY_OEM_1 }, |
| 181 { "LessThan", '<', "U+003C", VKEY_OEM_COMMA }, |
| 182 { "Equals", '=', "U+003D", VKEY_OEM_PLUS }, |
| 183 { "GreaterThan", '>', "U+003E", VKEY_OEM_PERIOD }, |
| 184 { "QuestionMark", '?', "U+003F", VKEY_OEM_2 }, |
| 185 { "At", '@', "U+0040", VKEY_2 }, |
| 186 { "", 'A', "U+0041", VKEY_A }, |
| 187 { "", 'B', "U+0042", VKEY_B }, |
| 188 { "", 'C', "U+0043", VKEY_C }, |
| 189 { "", 'D', "U+0044", VKEY_D }, |
| 190 { "", 'E', "U+0045", VKEY_E }, |
| 191 { "", 'F', "U+0046", VKEY_F }, |
| 192 { "", 'G', "U+0047", VKEY_G }, |
| 193 { "", 'H', "U+0048", VKEY_H }, |
| 194 { "", 'I', "U+0049", VKEY_I }, |
| 195 { "", 'J', "U+004A", VKEY_J }, |
| 196 { "", 'K', "U+004B", VKEY_K }, |
| 197 { "", 'L', "U+004C", VKEY_L }, |
| 198 { "", 'M', "U+004D", VKEY_M }, |
| 199 { "", 'N', "U+004E", VKEY_N }, |
| 200 { "", 'O', "U+004F", VKEY_O }, |
| 201 { "", 'P', "U+0050", VKEY_P }, |
| 202 { "", 'Q', "U+0051", VKEY_Q }, |
| 203 { "", 'R', "U+0052", VKEY_R }, |
| 204 { "", 'S', "U+0053", VKEY_S }, |
| 205 { "", 'T', "U+0054", VKEY_T }, |
| 206 { "", 'U', "U+0055", VKEY_U }, |
| 207 { "", 'V', "U+0056", VKEY_V }, |
| 208 { "", 'W', "U+0057", VKEY_W }, |
| 209 { "", 'X', "U+0058", VKEY_X }, |
| 210 { "", 'Y', "U+0059", VKEY_Y }, |
| 211 { "", 'Z', "U+005A", VKEY_Z }, |
| 212 { "", 'a', "U+0061", VKEY_A }, |
| 213 { "", 'b', "U+0062", VKEY_B }, |
| 214 { "", 'c', "U+0063", VKEY_C }, |
| 215 { "", 'd', "U+0064", VKEY_D }, |
| 216 { "", 'e', "U+0065", VKEY_E }, |
| 217 { "", 'f', "U+0066", VKEY_F }, |
| 218 { "", 'g', "U+0067", VKEY_G }, |
| 219 { "", 'h', "U+0068", VKEY_H }, |
| 220 { "", 'i', "U+0069", VKEY_I }, |
| 221 { "", 'j', "U+006A", VKEY_J }, |
| 222 { "", 'k', "U+006B", VKEY_K }, |
| 223 { "", 'l', "U+006C", VKEY_L }, |
| 224 { "", 'm', "U+006D", VKEY_M }, |
| 225 { "", 'n', "U+006E", VKEY_N }, |
| 226 { "", 'o', "U+006F", VKEY_O }, |
| 227 { "", 'p', "U+0070", VKEY_P }, |
| 228 { "", 'q', "U+0071", VKEY_Q }, |
| 229 { "", 'r', "U+0072", VKEY_R }, |
| 230 { "", 's', "U+0073", VKEY_S }, |
| 231 { "", 't', "U+0074", VKEY_T }, |
| 232 { "", 'u', "U+0075", VKEY_U }, |
| 233 { "", 'v', "U+0076", VKEY_V }, |
| 234 { "", 'w', "U+0077", VKEY_W }, |
| 235 { "", 'x', "U+0078", VKEY_X }, |
| 236 { "", 'y', "U+0079", VKEY_Y }, |
| 237 { "", 'z', "U+007A", VKEY_Z }, |
| 238 { "LeftSquareBracket", '[', "U+005B", VKEY_OEM_4 }, |
| 239 { "Backslash", '\\', "U+005C", VKEY_OEM_5 }, |
| 240 { "RightSquareBracket", ']', "U+005D", VKEY_OEM_6 }, |
| 241 { "Circumflex", '^', "U+005E", VKEY_OEM_6 }, |
| 242 { "Underscore", '_', "U+005F", VKEY_OEM_MINUS }, |
| 243 { "Grave", '`', "U+0060", VKEY_OEM_3 }, |
| 244 { "LeftCurlyBracket", '{', "U+007B", VKEY_OEM_4 }, |
| 245 { "Pipe", '|', "U+007C", VKEY_OEM_5 }, |
| 246 { "RightCurlyBracket", '}', "U+007D", VKEY_OEM_6 }, |
| 247 { "Del", '\0', "U+007F", VKEY_DELETE }, |
| 248 { "InvertedExclamation", '\0', "U+00A1", VKEY_UNKNOWN }, |
| 249 { "DeadGrave", '\0', "U+0300", VKEY_UNKNOWN }, |
| 250 { "DeadEacute", '\0', "U+0301", VKEY_UNKNOWN }, |
| 251 { "DeadCircumflex", '\0', "U+0302", VKEY_UNKNOWN }, |
| 252 { "DeadTilde", '\0', "U+0303", VKEY_UNKNOWN }, |
| 253 { "DeadMacron", '\0', "U+0304", VKEY_UNKNOWN }, |
| 254 { "DeadBreve", '\0', "U+0306", VKEY_UNKNOWN }, |
| 255 { "DeadAboveDot", '\0', "U+0307", VKEY_UNKNOWN }, |
| 256 { "DeadUmlaut", '\0', "U+0308", VKEY_UNKNOWN }, |
| 257 { "DeadAboveRing", '\0', "U+030A", VKEY_UNKNOWN }, |
| 258 { "DeadDoubleacute", '\0', "U+030B", VKEY_UNKNOWN }, |
| 259 { "DeadCaron", '\0', "U+030C", VKEY_UNKNOWN }, |
| 260 { "DeadCedilla", '\0', "U+0327", VKEY_UNKNOWN }, |
| 261 { "DeadOgonek", '\0', "U+0328", VKEY_UNKNOWN }, |
| 262 { "DeadIota", '\0', "U+0345", VKEY_UNKNOWN }, |
| 263 { "Euro", '\0', "U+20AC", VKEY_UNKNOWN }, |
| 264 { "DeadVoicedSound", '\0', "U+3099", VKEY_UNKNOWN }, |
| 265 { "DeadSemivoicedSound", '\0', "U+309A", VKEY_UNKNOWN } |
| 266 }; |
| 267 |
| 268 static const int kNumKeyIdentifiers = |
| 269 sizeof(kKeyIdentifiers)/sizeof(KeyIdentifier); |
| 270 |
| 271 static const KeyIdentifier* GetKeyIdentifierData(const std::string& id) { |
| 272 for (int i = 0; i < kNumKeyIdentifiers; ++i) { |
| 273 const KeyIdentifier& key = kKeyIdentifiers[i]; |
| 274 if ((key.key_name[0] != '\0' && strcmp(id.c_str(), key.key_name) == 0) || |
| 275 (id.length() == 1 && id[0] == key.character) || |
| 276 (key.unicode_codepoint[0] != '\0' && |
| 277 strcmp(id.c_str(), key.unicode_codepoint) == 0)) { |
| 278 return &key; |
| 279 } |
| 280 } |
| 281 |
| 282 return NULL; |
| 283 } |
| 284 |
| 285 } // namespace |
| 286 |
| 287 |
| 288 KeyboardCode KeyCodeFromKeyIdentifier(const std::string& key_identifier) { |
| 289 const KeyIdentifier* id = GetKeyIdentifierData(key_identifier); |
| 290 if (!id) { |
| 291 return VKEY_UNKNOWN; |
| 292 } |
| 293 return id->key_code; |
| 294 } |
| 295 |
| 296 } // namespace base |
OLD | NEW |