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