Home | History | Annotate | Download | only in accelerators
      1 // Copyright (c) 2012 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 "ash/accelerators/accelerator_filter.h"
      6 
      7 #include "ash/accelerators/accelerator_controller.h"
      8 #include "ash/shell.h"
      9 #include "ash/wm/window_util.h"
     10 #include "ui/aura/root_window.h"
     11 #include "ui/base/accelerators/accelerator.h"
     12 #include "ui/base/accelerators/accelerator_manager.h"
     13 #include "ui/base/events/event.h"
     14 
     15 namespace ash {
     16 namespace {
     17 
     18 const int kModifierFlagMask = (ui::EF_SHIFT_DOWN |
     19                                ui::EF_CONTROL_DOWN |
     20                                ui::EF_ALT_DOWN);
     21 
     22 // Returns true if the |accelerator| should be processed now, inside Ash's env
     23 // event filter.
     24 bool ShouldProcessAcceleratorsNow(const ui::Accelerator& accelerator,
     25                                   aura::Window* target) {
     26   if (!target)
     27     return true;
     28 
     29   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
     30   if (std::find(root_windows.begin(), root_windows.end(), target) !=
     31       root_windows.end())
     32     return true;
     33 
     34   // A full screen window should be able to handle all key events including the
     35   // reserved ones.
     36   if (wm::IsWindowFullscreen(target)) {
     37     // TODO(yusukes): On Chrome OS, only browser and flash windows can be full
     38     // screen. Launching an app in "open full-screen" mode is not supported yet.
     39     // That makes the IsWindowFullscreen() check above almost meaningless
     40     // because a browser and flash window do handle Ash accelerators anyway
     41     // before they're passed to a page or flash content.
     42     return false;
     43   }
     44 
     45   if (Shell::GetInstance()->GetAppListTargetVisibility())
     46     return true;
     47 
     48   // Unless |target| is in the full screen state, handle reserved accelerators
     49   // such as Alt+Tab now.
     50   return Shell::GetInstance()->accelerator_controller()->IsReservedAccelerator(
     51       accelerator);
     52 }
     53 
     54 }  // namespace
     55 
     56 namespace internal {
     57 
     58 ////////////////////////////////////////////////////////////////////////////////
     59 // AcceleratorFilter, public:
     60 
     61 AcceleratorFilter::AcceleratorFilter() {
     62 }
     63 
     64 AcceleratorFilter::~AcceleratorFilter() {
     65 }
     66 
     67 ////////////////////////////////////////////////////////////////////////////////
     68 // AcceleratorFilter, EventFilter implementation:
     69 
     70 void AcceleratorFilter::OnKeyEvent(ui::KeyEvent* event) {
     71   const ui::EventType type = event->type();
     72   if (type != ui::ET_KEY_PRESSED && type != ui::ET_KEY_RELEASED)
     73     return;
     74   if (event->is_char())
     75     return;
     76 
     77   ui::Accelerator accelerator(event->key_code(),
     78                               event->flags() & kModifierFlagMask);
     79   accelerator.set_type(type);
     80 
     81   // Fill out context object so AcceleratorController will know what
     82   // was the previous accelerator or if the current accelerator is repeated.
     83   Shell::GetInstance()->accelerator_controller()->context()->
     84       UpdateContext(accelerator);
     85 
     86   aura::Window* target = static_cast<aura::Window*>(event->target());
     87   if (!ShouldProcessAcceleratorsNow(accelerator, target))
     88     return;
     89   if (Shell::GetInstance()->accelerator_controller()->Process(accelerator))
     90     event->StopPropagation();
     91 }
     92 
     93 }  // namespace internal
     94 }  // namespace ash
     95