Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(724)

Side by Side Diff: remoting/host/event_executor_mac.cc

Issue 10894050: Remove support for Windows-style keycodes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Linux EventExecutor typo. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/host/event_executor_linux.cc ('k') | remoting/host/event_executor_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "remoting/host/event_executor.h" 5 #include "remoting/host/event_executor.h"
6 6
7 #include <ApplicationServices/ApplicationServices.h> 7 #include <ApplicationServices/ApplicationServices.h>
8 #include <Carbon/Carbon.h> 8 #include <Carbon/Carbon.h>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 // injection APIs. 82 // injection APIs.
83 // If the non-deprecated injection APIs were used instead, the equivalent of 83 // If the non-deprecated injection APIs were used instead, the equivalent of
84 // this line would not be needed, as OS X defaults to _not_ suppressing local 84 // this line would not be needed, as OS X defaults to _not_ suppressing local
85 // inputs in that case. 85 // inputs in that case.
86 #pragma clang diagnostic push 86 #pragma clang diagnostic push
87 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 87 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
88 CGSetLocalEventsSuppressionInterval(0.0); 88 CGSetLocalEventsSuppressionInterval(0.0);
89 #pragma clang diagnostic pop 89 #pragma clang diagnostic pop
90 } 90 }
91 91
92 // Hard-coded mapping from Virtual Key codes to Mac KeySyms.
93 // This mapping is only valid if both client and host are using a
94 // US English keyboard layout.
95 // Because we're passing VK codes on the wire, with no Scancode,
96 // "extended" flag, etc, things like distinguishing left & right
97 // Shift keys doesn't work.
98 //
99 // TODO(wez): Replace this with something more closely tied to what
100 // WebInputEventFactory does on Linux/GTK, and which respects the
101 // host's keyboard layout.
102 //
103 // TODO(garykac): Remove this table once we switch to using USB
104 // keycodes.
105 const int kUsVkeyToKeysym[256] = {
106 // 0x00 - 0x07
107 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
108 // 0x04 - 0x07
109 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
110 // 0x08 - 0x0B
111 kVK_Delete, kVK_Tab, kInvalidKeycode, kInvalidKeycode,
112 // 0x0C - 0x0F
113 kInvalidKeycode, kVK_Return, kInvalidKeycode, kInvalidKeycode,
114
115 // 0x10 - 0x13
116 kVK_Shift, kVK_Control, kVK_Option, kInvalidKeycode,
117 // 0x14 - 0x17
118 kVK_CapsLock, kVK_JIS_Kana, /* VKEY_HANGUL */ kInvalidKeycode,
119 /* VKEY_JUNJA */ kInvalidKeycode,
120 // 0x18 - 0x1B
121 /* VKEY_FINAL */ kInvalidKeycode, /* VKEY_Kanji */ kInvalidKeycode,
122 kInvalidKeycode, kVK_Escape,
123 // 0x1C - 0x1F
124 /* VKEY_CONVERT */ kInvalidKeycode, /* VKEY_NONCONVERT */ kInvalidKeycode,
125 /* VKEY_ACCEPT */ kInvalidKeycode, /* VKEY_MODECHANGE */ kInvalidKeycode,
126
127 // 0x20 - 0x23
128 kVK_Space, kVK_PageUp, kVK_PageDown, kVK_End,
129 // 0x24 - 0x27
130 kVK_Home, kVK_LeftArrow, kVK_UpArrow, kVK_RightArrow,
131 // 0x28 - 0x2B
132 kVK_DownArrow, /* VKEY_SELECT */ kInvalidKeycode,
133 /* VKEY_PRINT */ kInvalidKeycode, /* VKEY_EXECUTE */ kInvalidKeycode,
134 // 0x2C - 0x2F
135 /* VKEY_SNAPSHOT */ kInvalidKeycode, /* XK_INSERT */ kInvalidKeycode,
136 kVK_ForwardDelete, kVK_Help,
137
138 // 0x30 - 0x33
139 kVK_ANSI_0, kVK_ANSI_1, kVK_ANSI_2, kVK_ANSI_3,
140 // 0x34 - 0x37
141 kVK_ANSI_4, kVK_ANSI_5, kVK_ANSI_6, kVK_ANSI_7,
142 // 0x38 - 0x3B
143 kVK_ANSI_8, kVK_ANSI_9, kInvalidKeycode, kInvalidKeycode,
144 // 0x3C - 0x3F
145 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
146
147 // 0x40 - 0x43
148 kInvalidKeycode, kVK_ANSI_A, kVK_ANSI_B, kVK_ANSI_C,
149 // 0x44 - 0x47
150 kVK_ANSI_D, kVK_ANSI_E, kVK_ANSI_F, kVK_ANSI_G,
151 // 0x48 - 0x4B
152 kVK_ANSI_H, kVK_ANSI_I, kVK_ANSI_J, kVK_ANSI_K,
153 // 0x4C - 0x4F
154 kVK_ANSI_L, kVK_ANSI_M, kVK_ANSI_N, kVK_ANSI_O,
155
156 // 0x50 - 0x53
157 kVK_ANSI_P, kVK_ANSI_Q, kVK_ANSI_R, kVK_ANSI_S,
158 // 0x54 - 0x57
159 kVK_ANSI_T, kVK_ANSI_U, kVK_ANSI_V, kVK_ANSI_W,
160 // 0x58 - 0x5B
161 kVK_ANSI_X, kVK_ANSI_Y, kVK_ANSI_Z, kVK_Command,
162 // 0x5C - 0x5F
163 kVK_Command, kVK_Command, kInvalidKeycode, /* VKEY_SLEEP */ kInvalidKeycode,
164
165 // 0x60 - 0x63
166 kVK_ANSI_Keypad0, kVK_ANSI_Keypad1, kVK_ANSI_Keypad2, kVK_ANSI_Keypad3,
167 // 0x64 - 0x67
168 kVK_ANSI_Keypad4, kVK_ANSI_Keypad5, kVK_ANSI_Keypad6, kVK_ANSI_Keypad7,
169 // 0x68 - 0x6B
170 kVK_ANSI_Keypad8, kVK_ANSI_Keypad9, kVK_ANSI_KeypadMultiply,
171 kVK_ANSI_KeypadPlus,
172 // 0x6C - 0x6F
173 /* VKEY_SEPARATOR */ kInvalidKeycode, kVK_ANSI_KeypadMinus,
174 kVK_ANSI_KeypadDecimal, kVK_ANSI_KeypadDivide,
175
176 // 0x70 - 0x73
177 kVK_F1, kVK_F2, kVK_F3, kVK_F4,
178 // 0x74 - 0x77
179 kVK_F5, kVK_F6, kVK_F7, kVK_F8,
180 // 0x78 - 0x7B
181 kVK_F9, kVK_F10, kVK_F11, kVK_F12,
182 // 0x7C - 0x7F
183 kVK_F13, kVK_F14, kVK_F15, kVK_F16,
184
185 // 0x80 - 0x83
186 kVK_F17, kVK_F18, kVK_F19, kVK_F20,
187 // 0x84 - 0x87
188 /* VKEY_F21 */ kInvalidKeycode, /* VKEY_F22 */ kInvalidKeycode,
189 /* VKEY_F23 */ kInvalidKeycode, /* XKEY_F24 */ kInvalidKeycode,
190 // 0x88 - 0x8B
191 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
192 // 0x8C - 0x8F
193 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
194
195 // 0x90 - 0x93
196 /* VKEY_NUMLOCK */ kInvalidKeycode, /* VKEY_SCROLL */ kInvalidKeycode,
197 kInvalidKeycode, kInvalidKeycode,
198 // 0x94 - 0x97
199 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
200 // 0x98 - 0x9B
201 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
202 // 0x9C - 0x9F
203 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
204
205 // 0xA0 - 0xA3
206 kVK_Shift, kVK_RightShift, kVK_Control, kVK_RightControl,
207 // 0xA4 - 0xA7
208 kVK_Option, kVK_RightOption,
209 /* XF86kVK_Back */ kInvalidKeycode, /* XF86kVK_Forward */ kInvalidKeycode,
210 // 0xA8 - 0xAB
211 /* XF86kVK_Refresh */ kInvalidKeycode, /* XF86kVK_Stop */ kInvalidKeycode,
212 /* XF86kVK_Search */ kInvalidKeycode,
213 /* XF86kVK_Favorites */ kInvalidKeycode,
214 // 0xAC - 0xAF
215 /* XF86kVK_HomePage */ kInvalidKeycode, kVK_Mute, kVK_VolumeDown,
216 kVK_VolumeUp,
217
218 // 0xB0 - 0xB3
219 /* XF86kVK_AudioNext */ kInvalidKeycode,
220 /* XF86kVK_AudioPrev */ kInvalidKeycode,
221 /* XF86kVK_AudioStop */ kInvalidKeycode,
222 /* XF86kVK_AudioPause */ kInvalidKeycode,
223 // 0xB4 - 0xB7
224 /* XF86kVK_Mail */ kInvalidKeycode, /* XF86kVK_AudioMedia */ kInvalidKeycode,
225 /* XF86kVK_Launch0 */ kInvalidKeycode, /* XF86kVK_Launch1 */ kInvalidKeycode,
226 // 0xB8 - 0xBB
227 kInvalidKeycode, kInvalidKeycode, kVK_ANSI_Semicolon, kVK_ANSI_Equal,
228 // 0xBC - 0xBF
229 kVK_ANSI_Comma, kVK_ANSI_Minus, kVK_ANSI_Period, kVK_ANSI_Slash,
230
231 // 0xC0 - 0xC3
232 kVK_ANSI_Grave, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
233 // 0xC4 - 0xC7
234 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
235 // 0xC8 - 0xCB
236 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
237 // 0xCC - 0xCF
238 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
239
240 // 0xD0 - 0xD3
241 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
242 // 0xD4 - 0xD7
243 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
244 // 0xD8 - 0xDB
245 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kVK_ANSI_LeftBracket,
246 // 0xDC - 0xDF
247 kVK_ANSI_Backslash, kVK_ANSI_RightBracket, kVK_ANSI_Quote,
248 /* VKEY_OEM_8 */ kInvalidKeycode,
249
250 // 0xE0 - 0xE3
251 kInvalidKeycode, kInvalidKeycode, /* VKEY_OEM_102 */ kInvalidKeycode,
252 kInvalidKeycode,
253 // 0xE4 - 0xE7
254 kInvalidKeycode, /* VKEY_PROCESSKEY */ kInvalidKeycode, kInvalidKeycode,
255 /* VKEY_PACKET */ kInvalidKeycode,
256 // 0xE8 - 0xEB
257 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
258 // 0xEC - 0xEF
259 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
260
261 // 0xF0 - 0xF3
262 kInvalidKeycode, kInvalidKeycode, kInvalidKeycode, kInvalidKeycode,
263 // 0xF4 - 0xF7
264 kInvalidKeycode, kInvalidKeycode, /* VKEY_ATTN */ kInvalidKeycode,
265 /* VKEY_CRSEL */ kInvalidKeycode,
266 // 0xF8 - 0xFB
267 /* VKEY_EXSEL */ kInvalidKeycode, /* VKEY_EREOF */ kInvalidKeycode,
268 /* VKEY_PLAY */ kInvalidKeycode, /* VKEY_ZOOM */ kInvalidKeycode,
269 // 0xFC - 0xFF
270 /* VKEY_NONAME */ kInvalidKeycode, /* VKEY_PA1 */ kInvalidKeycode,
271 /* VKEY_OEM_CLEAR */ kInvalidKeycode, kInvalidKeycode
272 };
273
274 void EventExecutorMac::InjectClipboardEvent(const ClipboardEvent& event) { 92 void EventExecutorMac::InjectClipboardEvent(const ClipboardEvent& event) {
275 if (!task_runner_->BelongsToCurrentThread()) { 93 if (!task_runner_->BelongsToCurrentThread()) {
276 task_runner_->PostTask( 94 task_runner_->PostTask(
277 FROM_HERE, 95 FROM_HERE,
278 base::Bind(&EventExecutorMac::InjectClipboardEvent, 96 base::Bind(&EventExecutorMac::InjectClipboardEvent,
279 base::Unretained(this), 97 base::Unretained(this),
280 event)); 98 event));
281 return; 99 return;
282 } 100 }
283 101
284 clipboard_->InjectClipboardEvent(event); 102 clipboard_->InjectClipboardEvent(event);
285 } 103 }
286 104
287 void EventExecutorMac::InjectKeyEvent(const KeyEvent& event) { 105 void EventExecutorMac::InjectKeyEvent(const KeyEvent& event) {
288 // HostEventDispatcher should filter events missing the pressed field. 106 // HostEventDispatcher should filter events missing the pressed field.
289 DCHECK(event.has_pressed()); 107 DCHECK(event.has_pressed());
108 DCHECK(event.has_usb_keycode());
290 109
291 int keycode = kInvalidKeycode; 110 int keycode = UsbKeycodeToNativeKeycode(event.usb_keycode());
292 if (event.has_usb_keycode()) { 111
293 keycode = UsbKeycodeToNativeKeycode(event.usb_keycode()); 112 VLOG(3) << "Converting USB keycode: " << std::hex << event.usb_keycode()
294 VLOG(3) << "Converting USB keycode: " << std::hex << event.usb_keycode() 113 << " to keycode: " << keycode << std::dec;
295 << " to keycode: " << keycode << std::dec;
296 } else if (event.has_keycode()) {
297 int win_keycode = event.keycode();
298 if (win_keycode >= 0 && win_keycode < 256) {
299 keycode = kUsVkeyToKeysym[win_keycode];
300 }
301 VLOG(3) << "Converting VKEY: " << std::hex << event.keycode()
302 << " to keycode: " << keycode << std::dec;
303 }
304 114
305 // If we couldn't determine the Mac virtual key code then ignore the event. 115 // If we couldn't determine the Mac virtual key code then ignore the event.
306 if (keycode == kInvalidKeycode) 116 if (keycode == kInvalidKeycode)
307 return; 117 return;
308 118
309 // We use the deprecated event injection API because the new one doesn't 119 // We use the deprecated event injection API because the new one doesn't
310 // work with switched-out sessions (curtain mode). 120 // work with switched-out sessions (curtain mode).
311 #pragma clang diagnostic push 121 #pragma clang diagnostic push
312 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 122 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
313 CGError error = CGPostKeyboardEvent(0, keycode, event.pressed()); 123 CGError error = CGPostKeyboardEvent(0, keycode, event.pressed());
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 242
433 } // namespace 243 } // namespace
434 244
435 scoped_ptr<EventExecutor> EventExecutor::Create( 245 scoped_ptr<EventExecutor> EventExecutor::Create(
436 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 246 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
437 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { 247 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
438 return scoped_ptr<EventExecutor>(new EventExecutorMac(main_task_runner)); 248 return scoped_ptr<EventExecutor>(new EventExecutorMac(main_task_runner));
439 } 249 }
440 250
441 } // namespace remoting 251 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/event_executor_linux.cc ('k') | remoting/host/event_executor_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698