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/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