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