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/events/event_rewriter.h" 8#include "chrome/browser/chromeos/system/input_device_settings.h" 9#include "components/user_manager/user_manager.h" 10#include "ui/events/event.h" 11#include "ui/events/event_utils.h" 12 13namespace chromeos { 14 15namespace { 16 17const int kModifierMask = ui::EF_SHIFT_DOWN; 18 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. 21bool ShouldStripModifiersForArrowKeysAndEnter() { 22 if (user_manager::UserManager::IsInitialized() && 23 !user_manager::UserManager::Get()->IsSessionStarted()) { 24 return system::InputDeviceSettings::Get() 25 ->ForceKeyboardDrivenUINavigation(); 26 } 27 28 return false; 29} 30 31} // namespace 32 33KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {} 34 35KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {} 36 37ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteForTesting( 38 const ui::Event& event, 39 scoped_ptr<ui::Event>* rewritten_event) { 40 return Rewrite(event, rewritten_event); 41} 42 43ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteEvent( 44 const ui::Event& event, 45 scoped_ptr<ui::Event>* rewritten_event) { 46 if (!ShouldStripModifiersForArrowKeysAndEnter()) 47 return ui::EVENT_REWRITE_CONTINUE; 48 49 return Rewrite(event, rewritten_event); 50} 51 52ui::EventRewriteStatus KeyboardDrivenEventRewriter::NextDispatchEvent( 53 const ui::Event& last_event, 54 scoped_ptr<ui::Event>* new_event) { 55 NOTREACHED(); 56 return ui::EVENT_REWRITE_CONTINUE; 57} 58 59ui::EventRewriteStatus KeyboardDrivenEventRewriter::Rewrite( 60 const ui::Event& event, 61 scoped_ptr<ui::Event>* rewritten_event) { 62 int flags = event.flags(); 63 if ((flags & kModifierMask) != kModifierMask) 64 return ui::EVENT_REWRITE_CONTINUE; 65 66 DCHECK(event.type() == ui::ET_KEY_PRESSED || 67 event.type() == ui::ET_KEY_RELEASED) 68 << "Unexpected event type " << event.type(); 69 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); 70 ui::KeyboardCode key_code = key_event.key_code(); 71 72 if (key_code != ui::VKEY_LEFT && 73 key_code != ui::VKEY_RIGHT && 74 key_code != ui::VKEY_UP && 75 key_code != ui::VKEY_DOWN && 76 key_code != ui::VKEY_RETURN && 77 key_code != ui::VKEY_F6) { 78 return ui::EVENT_REWRITE_CONTINUE; 79 } 80 81 chromeos::EventRewriter::BuildRewrittenKeyEvent( 82 key_event, 83 key_event.key_code(), 84 flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN), 85 rewritten_event); 86 return ui::EVENT_REWRITE_REWRITTEN; 87} 88 89} // namespace chromeos 90