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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" 6 7 #include "chrome/browser/chromeos/login/users/user_manager.h" 8 #include "chrome/browser/chromeos/system/input_device_settings.h" 9 #include "ui/events/event.h" 10 #include "ui/events/event_utils.h" 11 12 namespace chromeos { 13 14 namespace { 15 16 const int kModifierMask = ui::EF_SHIFT_DOWN; 17 18 // Returns true if and only if it is on login screen (i.e. user is not logged 19 // in) and the keyboard driven flag in the OEM manifest is on. 20 bool ShouldStripModifiersForArrowKeysAndEnter() { 21 if (UserManager::IsInitialized() && 22 !UserManager::Get()->IsSessionStarted()) { 23 return system::InputDeviceSettings::Get() 24 ->ForceKeyboardDrivenUINavigation(); 25 } 26 27 return false; 28 } 29 30 } // namespace 31 32 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} 33 34 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} 35 36 ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteForTesting( 37 const ui::Event& event, 38 scoped_ptr<ui::Event>* rewritten_event) { 39 return Rewrite(event, rewritten_event); 40 } 41 42 ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteEvent( 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); 49 } 50 51 ui::EventRewriteStatus KeyboardDrivenEventRewriter::NextDispatchEvent( 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(); 62 if ((flags & kModifierMask) != kModifierMask) 63 return ui::EVENT_REWRITE_CONTINUE; 64 65 DCHECK(event.type() == ui::ET_KEY_PRESSED || 66 event.type() == ui::ET_KEY_RELEASED) 67 << "Unexpected event type " << event.type(); 68 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); 69 ui::KeyboardCode key_code = key_event.key_code(); 70 71 if (key_code != ui::VKEY_LEFT && 72 key_code != ui::VKEY_RIGHT && 73 key_code != ui::VKEY_UP && 74 key_code != ui::VKEY_DOWN && 75 key_code != ui::VKEY_RETURN && 76 key_code != ui::VKEY_F6) { 77 return ui::EVENT_REWRITE_CONTINUE; 78 } 79 80 rewritten_event->reset(new ui::KeyEvent(key_event)); 81 (*rewritten_event)->set_flags( 82 flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN)); 83 return ui::EVENT_REWRITE_REWRITTEN; 84 } 85 86 } // namespace chromeos 87