Chromium Code Reviews| 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; | |
|
oshima
2014/08/08 07:06:08
nit: move this after line 226 (closer to where thi
Shu Chen
2014/08/08 07:10:57
That will result in wrong behavior. Please notice
oshima
2014/08/08 09:32:11
oh, sorry I missed that. please ignore.
| |
| 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 // Remove the shift state before getting key char. | |
| 237 // Because X11/XKB sometimes returns unexpected key char for | |
| 238 // Shift+NumpadKey. e.g. Shift+Numpad_4 returns 'D', etc. | |
| 239 numpad_xevent.xkey.state &= ~ShiftMask; | |
| 240 numpad_xevent.xkey.state |= Mod2Mask; // Always set NumLock mask. | |
|
oshima
2014/08/08 07:06:08
nit: two spaces between ; and //
Shu Chen
2014/08/08 07:10:57
Done.
| |
| 241 if (!(flags & ui::EF_SHIFT_DOWN)) | |
| 242 numpad_xevent.xkey.keycode = original_x11_keycode; | |
| 243 rewritten_key_event->set_character( | |
| 244 ui::GetCharacterFromXEvent(&numpad_xevent)); | |
| 245 } | |
| 225 } | 246 } |
| 226 #endif | 247 #endif |
| 227 if (!rewritten_key_event) | 248 if (!rewritten_key_event) |
| 228 rewritten_key_event = new ui::KeyEvent(key_event); | 249 rewritten_key_event = new ui::KeyEvent(key_event); |
| 229 rewritten_key_event->set_flags(flags); | 250 rewritten_key_event->set_flags(flags); |
| 230 rewritten_key_event->set_key_code(key_code); | 251 rewritten_key_event->set_key_code(key_code); |
| 231 #if defined(USE_X11) | 252 #if defined(USE_X11) |
| 232 ui::UpdateX11EventForFlags(rewritten_key_event); | 253 ui::UpdateX11EventForFlags(rewritten_key_event); |
| 233 rewritten_key_event->NormalizeFlags(); | 254 rewritten_key_event->NormalizeFlags(); |
| 234 #endif | 255 #endif |
| (...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 840 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name); | 861 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name); |
| 841 } | 862 } |
| 842 | 863 |
| 843 XIFreeDeviceInfo(device_info); | 864 XIFreeDeviceInfo(device_info); |
| 844 #else | 865 #else |
| 845 KeyboardDeviceAddedInternal(device_id, "keyboard"); | 866 KeyboardDeviceAddedInternal(device_id, "keyboard"); |
| 846 #endif | 867 #endif |
| 847 } | 868 } |
| 848 | 869 |
| 849 } // namespace chromeos | 870 } // namespace chromeos |
| OLD | NEW |