Home | History | Annotate | Download | only in events
      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 
     13 namespace chromeos {
     14 
     15 namespace {
     16 
     17 const 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.
     21 bool 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 
     33 KeyboardDrivenEventRewriter::KeyboardDrivenEventRewriter() {}
     34 
     35 KeyboardDrivenEventRewriter::~KeyboardDrivenEventRewriter() {}
     36 
     37 ui::EventRewriteStatus KeyboardDrivenEventRewriter::RewriteForTesting(
     38     const ui::Event& event,
     39     scoped_ptr<ui::Event>* rewritten_event) {
     40   return Rewrite(event, rewritten_event);
     41 }
     42 
     43 ui::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 
     52 ui::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 
     59 ui::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