OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/chromeos/events/event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/event_rewriter.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "ash/sticky_keys/sticky_keys_controller.h" | 9 #include "ash/sticky_keys/sticky_keys_controller.h" |
10 #include "ash/wm/window_state.h" | 10 #include "ash/wm/window_state.h" |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 XEvent* xev = key_event.native_event(); | 205 XEvent* xev = key_event.native_event(); |
206 if (xev) { | 206 if (xev) { |
207 XEvent xkeyevent; | 207 XEvent xkeyevent; |
208 // Convert all XI2-based key events into X11 core-based key events, | 208 // Convert all XI2-based key events into X11 core-based key events, |
209 // until consumers no longer depend on receiving X11 core events. | 209 // until consumers no longer depend on receiving X11 core events. |
210 if (xev->type == GenericEvent) | 210 if (xev->type == GenericEvent) |
211 ui::InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); | 211 ui::InitXKeyEventFromXIDeviceEvent(*xev, &xkeyevent); |
212 else | 212 else |
213 xkeyevent.xkey = xev->xkey; | 213 xkeyevent.xkey = xev->xkey; |
214 | 214 |
215 unsigned int original_x11_keycode = xkeyevent.xkey.keycode; | |
215 // Update native event to match rewritten |ui::Event|. | 216 // Update native event to match rewritten |ui::Event|. |
216 // The X11 keycode represents a physical key position, so it shouldn't | 217 // The X11 keycode represents a physical key position, so it shouldn't |
217 // change unless we have actually changed keys, not just modifiers. | 218 // change unless we have actually changed keys, not just modifiers. |
218 // This is one guard against problems like crbug.com/390263. | 219 // This is one guard against problems like crbug.com/390263. |
219 if (key_event.key_code() != key_code) { | 220 if (key_event.key_code() != key_code) { |
220 xkeyevent.xkey.keycode = | 221 xkeyevent.xkey.keycode = |
221 XKeyCodeForWindowsKeyCode(key_code, flags, gfx::GetXDisplay()); | 222 XKeyCodeForWindowsKeyCode(key_code, flags, gfx::GetXDisplay()); |
222 } | 223 } |
223 ui::KeyEvent x11_key_event(&xkeyevent); | 224 ui::KeyEvent x11_key_event(&xkeyevent); |
224 rewritten_key_event = new ui::KeyEvent(x11_key_event); | 225 rewritten_key_event = new ui::KeyEvent(x11_key_event); |
226 | |
227 // For numpad keys, the key char should always NOT be changed because | |
228 // XKeyCodeForWindowsKeyCode method cannot handle non-US keyboard layout. | |
229 // The correct key char can be got from original X11 keycode but not for the | |
230 // rewritten X11 keycode. | |
231 // For SHIFT+NumpadKey cases, use the rewritten X11 keycode (US layout). | |
232 // Please see crbug.com/335644. | |
233 if (key_code >= ui::VKEY_NUMPAD0 && key_code <= ui::VKEY_DIVIDE) { | |
234 XEvent numpad_xevent; | |
235 numpad_xevent.xkey = xkeyevent.xkey; | |
236 numpad_xevent.xkey.state &= ~ShiftMask; | |
Yusuke Sato
2014/08/08 06:00:32
Please explain (as code comment) why we need to re
Shu Chen
2014/08/08 06:35:13
Done.
| |
237 numpad_xevent.xkey.state |= Mod2Mask; | |
Yusuke Sato
2014/08/08 06:00:32
Mention that Mod2Mask is NumLock to make the code
Shu Chen
2014/08/08 06:35:13
Done.
| |
238 if (!(flags & ui::EF_SHIFT_DOWN)) | |
239 numpad_xevent.xkey.keycode = original_x11_keycode; | |
240 rewritten_key_event->set_character( | |
241 ui::GetCharacterFromXEvent(&numpad_xevent)); | |
242 } | |
225 } | 243 } |
226 #endif | 244 #endif |
227 if (!rewritten_key_event) | 245 if (!rewritten_key_event) |
228 rewritten_key_event = new ui::KeyEvent(key_event); | 246 rewritten_key_event = new ui::KeyEvent(key_event); |
229 rewritten_key_event->set_flags(flags); | 247 rewritten_key_event->set_flags(flags); |
230 rewritten_key_event->set_key_code(key_code); | 248 rewritten_key_event->set_key_code(key_code); |
231 #if defined(USE_X11) | 249 #if defined(USE_X11) |
232 ui::UpdateX11EventForFlags(rewritten_key_event); | 250 ui::UpdateX11EventForFlags(rewritten_key_event); |
233 rewritten_key_event->NormalizeFlags(); | 251 rewritten_key_event->NormalizeFlags(); |
234 #endif | 252 #endif |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
840 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name); | 858 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name); |
841 } | 859 } |
842 | 860 |
843 XIFreeDeviceInfo(device_info); | 861 XIFreeDeviceInfo(device_info); |
844 #else | 862 #else |
845 KeyboardDeviceAddedInternal(device_id, "keyboard"); | 863 KeyboardDeviceAddedInternal(device_id, "keyboard"); |
846 #endif | 864 #endif |
847 } | 865 } |
848 | 866 |
849 } // namespace chromeos | 867 } // namespace chromeos |
OLD | NEW |