Chromium Code Reviews| 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/events/keyboard_driven_event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | |
| 8 | |
| 9 #include "chrome/browser/chromeos/login/user_manager.h" | 7 #include "chrome/browser/chromeos/login/user_manager.h" |
| 10 #include "chrome/browser/chromeos/system/input_device_settings.h" | 8 #include "chrome/browser/chromeos/system/input_device_settings.h" |
| 9 #include "ui/events/event.h" | |
| 11 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
| 12 | 11 |
| 13 namespace chromeos { | 12 namespace chromeos { |
| 14 | 13 |
| 15 namespace { | 14 namespace { |
| 16 | 15 |
| 17 const int kModifierMask = ui::EF_SHIFT_DOWN; | 16 const int kModifierMask = ui::EF_SHIFT_DOWN; |
| 18 | 17 |
| 19 // Returns true if and only if it is on login screen (i.e. user is not logged | 18 // 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. | 19 // in) and the keyboard driven flag in the OEM manifest is on. |
| 21 bool ShouldStripModifiersForArrowKeysAndEnter() { | 20 bool ShouldStripModifiersForArrowKeysAndEnter() { |
| 22 if (UserManager::IsInitialized() && | 21 if (UserManager::IsInitialized() && |
| 23 !UserManager::Get()->IsSessionStarted()) { | 22 !UserManager::Get()->IsSessionStarted()) { |
| 24 return system::InputDeviceSettings::Get() | 23 return system::InputDeviceSettings::Get() |
|
kpschoedel
2014/04/17 21:08:21
It looks like this part of the test is fixed per p
| |
| 25 ->ForceKeyboardDrivenUINavigation(); | 24 ->ForceKeyboardDrivenUINavigation(); |
| 26 } | 25 } |
| 27 | 26 |
| 28 return false; | 27 return false; |
| 29 } | 28 } |
| 30 | 29 |
| 31 } // namespace | 30 } // namespace |
| 32 | 31 |
| 33 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} | 32 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} |
| 34 | 33 |
| 35 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} | 34 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} |
| 36 | 35 |
| 37 bool KeyboardDrivenEventRewriter::RewriteIfKeyboardDrivenOnLoginScreen( | 36 ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteForTesting( |
| 38 XEvent* event) { | 37 const ui::Event& event, |
| 39 if (!ShouldStripModifiersForArrowKeysAndEnter()) | 38 scoped_ptr<ui::Event>* rewritten_event) { |
| 40 return false; | 39 return Rewrite(event, rewritten_event); |
| 41 | |
| 42 return RewriteEvent(event); | |
| 43 } | 40 } |
| 44 | 41 |
| 45 bool KeyboardDrivenEventRewriter::RewriteForTesting(XEvent* event) { | 42 ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteEvent( |
| 46 return RewriteEvent(event); | 43 const ui::Event& event, |
| 44 scoped_ptr<ui::Event>* rewritten_event) { | |
| 45 if (!ShouldStripModifiersForArrowKeysAndEnter()) | |
| 46 return ui::EVENT_REWRITE_CONTINUE; | |
| 47 | |
| 48 return Rewrite(event, rewritten_event); | |
| 47 } | 49 } |
| 48 | 50 |
| 49 bool KeyboardDrivenEventRewriter::RewriteEvent(XEvent* event) { | 51 ui::EventRewriteStatus KeyboardDrivenEventRewriter::NextDispatchEvent( |
| 50 int flags = ui::EventFlagsFromNative(event); | 52 const ui::Event& last_event, |
| 53 scoped_ptr<ui::Event>* new_event) { | |
| 54 NOTREACHED(); | |
| 55 return ui::EVENT_REWRITE_CONTINUE; | |
| 56 } | |
| 57 | |
| 58 ui::EventRewriteStatus KeyboardDrivenEventRewriter::Rewrite( | |
| 59 const ui::Event& event, | |
| 60 scoped_ptr<ui::Event>* rewritten_event) { | |
| 61 int flags = event.flags(); | |
| 51 if ((flags & kModifierMask) != kModifierMask) | 62 if ((flags & kModifierMask) != kModifierMask) |
| 52 return false; | 63 return ui::EVENT_REWRITE_CONTINUE; |
| 53 ui::KeyboardCode key_code = ui::KeyboardCodeFromNative(event); | 64 |
| 65 DCHECK(event.type() == ui::ET_KEY_PRESSED || | |
| 66 event.type() == ui::ET_KEY_RELEASED); | |
|
Daniel Erat
2014/04/18 02:50:06
nit: include the unexected event type in an error
| |
| 67 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); | |
| 68 ui::KeyboardCode key_code = key_event.key_code(); | |
| 54 | 69 |
| 55 if (key_code != ui::VKEY_LEFT && | 70 if (key_code != ui::VKEY_LEFT && |
| 56 key_code != ui::VKEY_RIGHT && | 71 key_code != ui::VKEY_RIGHT && |
| 57 key_code != ui::VKEY_UP && | 72 key_code != ui::VKEY_UP && |
| 58 key_code != ui::VKEY_DOWN && | 73 key_code != ui::VKEY_DOWN && |
| 59 key_code != ui::VKEY_RETURN && | 74 key_code != ui::VKEY_RETURN && |
| 60 key_code != ui::VKEY_F6) { | 75 key_code != ui::VKEY_F6) { |
| 61 return false; | 76 return ui::EVENT_REWRITE_CONTINUE; |
| 62 } | 77 } |
| 63 | 78 |
| 64 XKeyEvent* xkey = &(event->xkey); | 79 rewritten_event->reset(new ui::KeyEvent(key_event)); |
| 65 xkey->state &= ~(ControlMask | Mod1Mask | ShiftMask); | 80 rewritten_event->get()->set_flags( |
|
Daniel Erat
2014/04/18 02:50:06
does (*rewritten_event)->set_flags() work here?
| |
| 66 return true; | 81 flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN)); |
| 82 return ui::EVENT_REWRITE_REWRITTEN; | |
| 67 } | 83 } |
| 68 | 84 |
| 69 } // namespace chromeos | 85 } // namespace chromeos |
| OLD | NEW |