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 // 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. |
| 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 |