| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/keyboard_driven_event_rewriter.h" | 5 #include "chrome/browser/chromeos/keyboard_driven_event_rewriter.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 | 8 |
| 9 #include "chrome/browser/chromeos/login/user_manager.h" | 9 #include "chrome/browser/chromeos/login/user_manager.h" |
| 10 #include "chrome/browser/chromeos/system/input_device_settings.h" | 10 #include "chrome/browser/chromeos/system/input_device_settings.h" |
| 11 #include "ui/events/event_utils.h" | 11 #include "ui/events/event.h" |
| 12 | 12 |
| 13 namespace chromeos { | 13 namespace chromeos { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 const int kModifierMask = ui::EF_SHIFT_DOWN; | 17 const int kModifierMask = ui::EF_SHIFT_DOWN; |
| 18 | 18 |
| 19 // Returns true if and only if it is on login screen (i.e. user is not logged | 19 // Returns true if and only if it is on login screen (i.e. user is not logged |
| 20 // in) and the keyboard driven flag in the OEM manifest is on. | 20 // in) and the keyboard driven flag in the OEM manifest is on. |
| 21 bool ShouldStripModifiersForArrowKeysAndEnter() { | 21 bool ShouldStripModifiersForArrowKeysAndEnter() { |
| 22 if (UserManager::IsInitialized() && | 22 if (UserManager::IsInitialized() && |
| 23 !UserManager::Get()->IsUserLoggedIn()) { | 23 !UserManager::Get()->IsUserLoggedIn()) { |
| 24 return system::InputDeviceSettings::Get() | 24 return system::InputDeviceSettings::Get() |
| 25 ->ForceKeyboardDrivenUINavigation(); | 25 ->ForceKeyboardDrivenUINavigation(); |
| 26 } | 26 } |
| 27 | 27 |
| 28 return false; | 28 return false; |
| 29 } | 29 } |
| 30 | 30 |
| 31 } // namespace | 31 } // namespace |
| 32 | 32 |
| 33 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} | 33 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} |
| 34 | 34 |
| 35 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} | 35 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} |
| 36 | 36 |
| 37 bool KeyboardDrivenEventRewriter::RewriteIfKeyboardDrivenOnLoginScreen( | 37 bool KeyboardDrivenEventRewriter::RewriteIfKeyboardDrivenOnLoginScreen( |
| 38 XEvent* event) { | 38 ui::KeyEvent* event) { |
| 39 if (!ShouldStripModifiersForArrowKeysAndEnter()) | 39 if (!ShouldStripModifiersForArrowKeysAndEnter()) |
| 40 return false; | 40 return false; |
| 41 | 41 |
| 42 return RewriteEvent(event); | 42 return RewriteEvent(event); |
| 43 } | 43 } |
| 44 | 44 |
| 45 bool KeyboardDrivenEventRewriter::RewriteForTesting(XEvent* event) { | 45 bool KeyboardDrivenEventRewriter::RewriteForTesting(ui::KeyEvent* event) { |
| 46 return RewriteEvent(event); | 46 return RewriteEvent(event); |
| 47 } | 47 } |
| 48 | 48 |
| 49 bool KeyboardDrivenEventRewriter::RewriteEvent(XEvent* event) { | 49 bool KeyboardDrivenEventRewriter::RewriteEvent(ui::KeyEvent* event) { |
| 50 int flags = ui::EventFlagsFromNative(event); | 50 if ((event->flags() & kModifierMask) != kModifierMask) |
| 51 if ((flags & kModifierMask) != kModifierMask) | |
| 52 return false; | 51 return false; |
| 53 ui::KeyboardCode key_code = ui::KeyboardCodeFromNative(event); | |
| 54 | 52 |
| 55 if (key_code != ui::VKEY_LEFT && | 53 if (event->key_code() != ui::VKEY_LEFT && |
| 56 key_code != ui::VKEY_RIGHT && | 54 event->key_code() != ui::VKEY_RIGHT && |
| 57 key_code != ui::VKEY_UP && | 55 event->key_code() != ui::VKEY_UP && |
| 58 key_code != ui::VKEY_DOWN && | 56 event->key_code() != ui::VKEY_DOWN && |
| 59 key_code != ui::VKEY_RETURN && | 57 event->key_code() != ui::VKEY_RETURN && |
| 60 key_code != ui::VKEY_F6) { | 58 event->key_code() != ui::VKEY_F6) { |
| 61 return false; | 59 return false; |
| 62 } | 60 } |
| 63 | 61 |
| 64 XKeyEvent* xkey = &(event->xkey); | 62 XEvent* xev = event->native_event(); |
| 63 XKeyEvent* xkey = &(xev->xkey); |
| 65 xkey->state &= ~(ControlMask | Mod1Mask | ShiftMask); | 64 xkey->state &= ~(ControlMask | Mod1Mask | ShiftMask); |
| 65 event->set_flags(event->flags() & ~kModifierMask); |
| 66 event->NormalizeFlags(); |
| 66 return true; | 67 return true; |
| 67 } | 68 } |
| 68 | 69 |
| 69 } // namespace chromeos | 70 } // namespace chromeos |
| OLD | NEW |