accelerator_controller.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <iostream> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_table.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/caps_lock_delegate.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/debug.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/desktop_background/user_wallpaper_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/focus_cycler.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ime_control_delegate.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_delegate.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_model.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/magnifier/magnification_controller.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/partial_magnification_controller.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/rotator/screen_rotation.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/brightness/brightness_control_delegate.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/web_notification/web_notification_tray.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/touch/touch_observer_hud.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/volume_control_delegate.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator_manager.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/debug_utils.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/oak/oak.h" 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/debug_utils.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/keyboard_brightness_controller.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/chromeos/chromeos_version.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using internal::DisplayInfo; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DebugShortcutsEnabled() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshDebugShortcuts); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleCycleWindowMRU(WindowCycleController::Direction direction, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_alt_down) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()-> 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_cycle_controller()->HandleCycleWindow(direction, is_alt_down); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always report we handled the key, even if the window didn't change. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandleCycleWindowLinear(CycleDirection direction) { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()-> 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_cycle_controller()->HandleLinearCycleWindow(); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HandleAccessibleFocusCycle(bool reverse) { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled()) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!active_window) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget* widget = 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!widget) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::FocusManager* focus_manager = widget->GetFocusManager(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!focus_manager) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::View* view = focus_manager->GetFocusedView(); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view->GetClassName() == views::WebView::kViewClassName) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focus_manager->AdvanceFocus(reverse); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void HandleSilenceSpokenFeedback() { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled()) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->delegate()->SilenceSpokenFeedback(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleLock() { 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->session_state_delegate()->LockScreen(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleFileManager(bool as_dialog) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->OpenFileManager(as_dialog); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleCrosh() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->OpenCrosh(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleSpokenFeedback() { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->delegate()-> 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToggleSpokenFeedback(A11Y_NOTIFICATION_SHOW); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotatePaneFocus(Shell::Direction direction) { 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (direction) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Shell::FORWARD: 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::FORWARD); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Shell::BACKWARD: 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::BACKWARD); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rotate the active window. 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleRotateActiveWindow() { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = wm::GetActiveWindow(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_window) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rotation animation bases its target transform on the current 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Since there could be an animation in progress 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right now, queue this animation so when it starts it picks up a neutral 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Use replace so we only enqueue one at a time. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()-> 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_preemption_strategy(ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()->StartAnimation( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ui::LayerAnimationSequence( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ash::ScreenRotation(360, active_window->layer()))); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetNextRotation(gfx::Display::Rotation current) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (current) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_0: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_90; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_90: 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_180; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_180: 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_270; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_270: 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown rotation:" << current; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleScaleUI(bool up) { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager* display_manager = 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager(); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float next_scale = 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager::GetNextUIScale(display_info, up); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display_id, next_scale); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HandleScaleReset() { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager* display_manager = 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager(); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display_id, 1.0f); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rotates the screen. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotateScreen() { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display = Shell::GetScreen()->GetDisplayNearestPoint(point); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DisplayInfo& display_info = 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager()->SetDisplayRotation( 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display.id(), GetNextRotation(display_info.rotation())); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleDesktopBackgroundMode() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBackgroundController* desktop_background_controller = 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->desktop_background_controller(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (desktop_background_controller->desktop_background_mode() == 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBackgroundController::BACKGROUND_IMAGE) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_background_controller->SetDesktopBackgroundSolidColorMode( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorBLACK); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->user_wallpaper_delegate()-> 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeWallpaper(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleRootWindowFullScreen() { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow()->ToggleFullScreen(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Magnify the screen 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMagnifyScreen(int delta_index) { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ash::Shell::GetInstance()->magnification_controller()->IsEnabled()) { 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(yoshiki): Move the following logic to MagnificationController. 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale = 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()->GetScale(); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Calculate rounded logarithm (base kMagnificationScaleFactor) of scale. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int scale_index = 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::floor(std::log(scale) / std::log(kMagnificationScaleFactor) + 0.5); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()-> 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetScale(std::pow(kMagnificationScaleFactor, new_scale_index), true); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ash::Shell::GetInstance()-> 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partial_magnification_controller()->is_enabled()) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->partial_magnification_controller()-> 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetScale(scale); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaNextTrack() { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaNextTrack(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPlayPause() { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaPlayPause(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPrevTrack() { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaPrevTrack(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintLayerHierarchy() { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < root_windows.size(); ++i) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::PrintLayerHierarchy(root_windows[i]->layer(), 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_windows[i]->GetLastMouseLocationInRoot()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintViewHierarchy() { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_window) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* browser_widget = 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_widget) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::PrintViewHierarchy(browser_widget->GetRootView()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintWindowHierarchy(aura::Window* window, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream* out) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indent_str(indent, ' '); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name(window->name()); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (name.empty()) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = "\"\""; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << indent_str << name << " (" << window << ")" 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " type=" << window->type() 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (wm::IsActiveWindow(window) ? " [active] " : " ") 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (window->IsVisible() ? " visible " : " ") 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << window->bounds().ToString() 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << '\n'; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window->children().size(); ++i) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(window->children()[i], indent + 3, out); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintWindowHierarchy() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowControllerList controllers = 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindowControllers(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < controllers.size(); ++i) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream out; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out << "RootWindow " << i << ":\n"; 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(controllers[i]->root_window(), 0, &out); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Error so logs can be collected from end-users. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << out.str(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandlePrintUIHierarchies() { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is a separate command so the user only has to hit one key to generate 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all the logs. Developers use the individual dumps repeatedly, so keep 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // those as separate commands to avoid spamming their logs. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintLayerHierarchy(); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintWindowHierarchy(); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintViewHierarchy(); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorControllerContext, public: 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorControllerContext::AcceleratorControllerContext() { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_.set_type(ui::ET_UNKNOWN); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_.set_type(ui::ET_UNKNOWN); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorControllerContext::UpdateContext( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_ = current_accelerator_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_ = accelerator; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, public: 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::AcceleratorController() 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : accelerator_manager_(new ui::AcceleratorManager) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::~AcceleratorController() { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Init() { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLoginOrLockScreenLength; ++i) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.insert( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLockScreenLength; ++i) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert(kActionsAllowedAtLockScreen[i]); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtModalWindowLength; ++i) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.insert(kActionsAllowedAtModalWindow[i]); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kReservedActionsLength; ++i) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserved_actions_.insert(kReservedActions[i]); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kNonrepeatableActionsLength; ++i) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nonrepeatable_actions_.insert(kNonrepeatableActions[i]); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kActionsAllowedInAppModeLength; ++i) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.insert(kActionsAllowedInAppMode[i]); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(NDEBUG) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RegisterAccelerators(kDesktopAcceleratorData, kDesktopAcceleratorDataLength); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DebugShortcutsEnabled()) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_.reset( 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new KeyboardBrightnessController()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Register(const ui::Accelerator& accelerator, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Register(accelerator, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorManager::kNormalPriority, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Unregister(const ui::Accelerator& accelerator, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Unregister(accelerator, target); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->UnregisterAll(target); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::Process(const ui::Accelerator& accelerator) { 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process(accelerator); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsRegistered( 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->GetCurrentTarget(accelerator) != NULL; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsReservedAccelerator( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator remapped_accelerator = ime_control_delegate_.get() ? 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator) : accelerator; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator iter = 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(remapped_accelerator); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == accelerators_.end()) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // not an accelerator. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reserved_actions_.find(iter->second) != reserved_actions_.end(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::PerformAction(int action, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!shell->session_state_delegate()->IsActiveUserSessionStarted() && 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.find(action) == 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.end()) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shell->session_state_delegate()->IsScreenLocked() && 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.find(action) == 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.end()) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->IsSystemModalWindowOpen() && 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.find(action) == 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.end()) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we return true. This indicates the shortcut is handled 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will not be passed to the modal window. This is important 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for things like Alt+Tab that would cause an undesired effect 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the modal window by cycling through its window elements. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->delegate()->IsRunningInForcedAppMode() && 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.find(action) == 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.end()) { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyboardCode key_code = accelerator.key_code(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PerformAction() is performed from gesture controllers and passes 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty Accelerator() instance as the second argument. Such events 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should never be suspended. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool gesture_event = key_code == ui::VKEY_UNKNOWN; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore accelerators invoked as repeated (while holding a key for a long 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, if their handling is nonrepeatable. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nonrepeatable_actions_.find(action) != nonrepeatable_actions_.end() && 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.repeated() && !gesture_event) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of the previous accelerator. Used by NEXT_IME and DISABLE_CAPS_LOCK. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::EventType previous_event_type = 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().type(); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::KeyboardCode previous_key_code = 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_.previous_accelerator().key_code(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You *MUST* return true when some action is performed. Otherwise, this 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function might be called *twice*, via BrowserView::PreHandleKeyboardEvent 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and BrowserView::HandleKeyboardEvent, for a single accelerator press. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (action) { 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_NEXT: 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(false); 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_PREVIOUS: 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(true); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_MRU: 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_TAB) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_TAB); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::BACKWARD, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.IsAltDown()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_MRU: 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_TAB) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_TAB); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::FORWARD, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.IsAltDown()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_LINEAR: 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP1) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_F5); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleCycleWindowLinear(CYCLE_BACKWARD); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_LINEAR: 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP1) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_F5); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleCycleWindowLinear(CYCLE_FORWARD); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_DISPLAY_MODE: 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_controller()->CycleDisplayMode(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_SCREEN: 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_L) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_LOCK_SCREEN_L); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleLock(); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case OPEN_FILE_DIALOG: 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleFileManager(true /* as_dialog */); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case OPEN_FILE_MANAGER: 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleFileManager(false /* as_dialog */); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_CROSH: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCrosh(); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SILENCE_SPOKEN_FEEDBACK: 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HandleSilenceSpokenFeedback(); 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWAP_PRIMARY_DISPLAY: 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_SPOKEN_FEEDBACK: 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleSpokenFeedback(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_WIFI: 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->ToggleWifi(); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOUCH_HUD_CLEAR: { 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController* controller = 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController::ForActiveRootWindow(); 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (controller->touch_observer_hud()) { 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->touch_observer_hud()->Clear(); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOUCH_HUD_MODE_CHANGE: { 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController* controller = 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController::ForActiveRootWindow(); 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (controller->touch_observer_hud()) { 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->touch_observer_hud()->ChangeToNextMode(); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DISABLE_GPU_WATCHDOG: 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->DisableGpuWatchdog(); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FEEDBACK_PAGE: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->delegate()->OpenFeedbackPage(); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EXIT: 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->Exit(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_INCOGNITO_WINDOW: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewWindow(true /* is_incognito */); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_TAB: 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_T) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEWTAB_T); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewTab(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewWindow(false /* is_incognito */); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RESTORE_TAB: 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->RestoreTab(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_SCREENSHOT: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screenshot_delegate_.get() && 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->CanTakeScreenshot()) { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->HandleTakeScreenshotForAllRootWindows(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_PARTIAL_SCREENSHOT: 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screenshot_delegate_) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::PartialScreenshotView::StartPartialScreenshot( 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_.get()); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event because 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this key combination is reserved for partial screenshot. 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_APP_LIST: 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Search key (LWIN) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // being pressed and released, then ignore the release of the 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Search key. 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN && 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (previous_event_type == ui::ET_KEY_RELEASED || 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_LWIN)) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_SEARCH_LWIN); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When spoken feedback is enabled, we should neither toggle the list nor 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consume the key since Search+Shift is one of the shortcuts the a11y 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // feature uses. crbug.com/132296 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled()) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->ToggleAppList(NULL); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DISABLE_CAPS_LOCK: 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (previous_key_code != ui::VKEY_LSHIFT && 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_SHIFT && 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_RSHIFT)) { 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Shift key being pressed 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and released, then ignore the release of the Shift key. 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->SetCapsLockEnabled(false); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_CAPS_LOCK: 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN) { 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Search key (LWIN) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // being pressed and released, then ignore the release of the 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Search key. 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Releasing Alt first breaks this: crbug.com/166495 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_LWIN) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->ToggleCapsLock(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_DOWN: 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessDown(accelerator); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_UP: 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessUp(accelerator); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_DOWN: 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessDown(accelerator); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_UP: 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessUp(accelerator); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_MUTE: 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shell->system_tray_delegate()->GetVolumeControlDelegate()-> 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeMute(accelerator); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_DOWN: 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shell->system_tray_delegate()->GetVolumeControlDelegate()-> 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeDown(accelerator); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_UP: 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shell->system_tray_delegate()->GetVolumeControlDelegate()-> 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeUp(accelerator); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_LAUNCHER: 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->focus_cycler()->FocusWidget( 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_NEXT_PANE: 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::FORWARD); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_PREVIOUS_PANE: 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::BACKWARD); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_KEYBOARD_OVERLAY: 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->delegate()->ShowKeyboardOverlay(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_OAK: 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshEnableOak)) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SHOW_SYSTEM_TRAY_BUBBLE: { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController* controller = 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::IsLauncherPerDisplayEnabled() ? 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController::ForActiveRootWindow() : 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetPrimaryRootWindowController(); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!controller->GetSystemTray()->HasSystemBubble()) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SHOW_MESSAGE_CENTER_BUBBLE: { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController* controller = 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::IsLauncherPerDisplayEnabled() ? 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController::ForActiveRootWindow() : 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetPrimaryRootWindowController(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::StatusAreaWidget* status_area_widget = 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->shelf()->status_area_widget(); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status_area_widget) { 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebNotificationTray* notification_tray = 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget->web_notification_tray(); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (notification_tray->visible()) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_tray->ShowMessageCenterBubble(); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_TASK_MANAGER: 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->ShowTaskManager(); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEXT_IME: 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This check is necessary e.g. not to process the Shift+Alt+ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is released. 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED && 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Workaround for crbug.com/139556. CJK IME users tend to press 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enter (or Space) and Shift+Alt almost at the same time to commit 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an IME string and then switch from the IME to the English layout. 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This workaround allows the user to trigger NEXT_IME even if the 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user presses Shift+Alt before releasing Enter. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_RETURN && 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_SPACE) { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We totally ignore this accelerator. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mazda): Fix crbug.com/158217 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleNextIme(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PREVIOUS_IME: 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandlePreviousIme(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PRINT_UI_HIERARCHIES: 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandlePrintUIHierarchies(); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWITCH_IME: 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleSwitchIme(accelerator); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_0: 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(0); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_1: 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(1); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_2: 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(2); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_3: 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(3); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_4: 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(4); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_5: 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(5); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_6: 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(6); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_7: 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(7); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_LAST_WIN: 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->SwitchToWindow(-1); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_LEFT: 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_RIGHT: { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable window docking shortcut key for full screen window due to 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/135487. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window || 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->type() != aura::client::WINDOW_TYPE_NORMAL || 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::IsWindowFullscreen(window)) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::SnapWindow(window, 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::RIGHT_EDGE); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_MINIMIZE: { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to restore the window that would be cycled through next from 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the launcher when there is no active window. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::FORWARD, false); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable the shortcut for minimizing full screen window due to 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crbug.com/131709, which is a crashing issue related to minimizing 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // full screen pepper window. 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!wm::IsWindowFullscreen(window) && wm::CanMinimizeWindow(window)) { 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->delegate()->RecordUserMetricsAction( 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::UMA_MINIMIZE_PER_KEY); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MinimizeWindow(window); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOGGLE_FULLSCREEN: { 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction( 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_ACCEL_FULLSCREEN_F4); 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->delegate()->ToggleFullscreen(); 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_MAXIMIZED: { 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction( 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_ACCEL_MAXIMIZE_RESTORE_F4); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->ToggleMaximized(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_POSITION_CENTER: { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::CenterWindow(window); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_UP: 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(true /* up */); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_DOWN: 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(false /* down */); 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SCALE_UI_RESET: 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleScaleReset(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ROTATE_WINDOW: 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleRotateActiveWindow(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ROTATE_SCREEN: 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotateScreen(); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_DESKTOP_BACKGROUND_MODE: 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleDesktopBackgroundMode(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_ROOT_WINDOW_FULL_SCREEN: 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleRootWindowFullScreen(); 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_DEVICE_SCALE_FACTOR: 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager::ToggleDisplayScaleFactor(); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS: 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowDebugBorders(); 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_FPS_COUNTER: 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowFpsCounter(); 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_PAINT_RECTS: 867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowPaintRects(); 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_IN: 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(1); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_OUT: 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(-1); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_NEXT_TRACK: 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaNextTrack(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PLAY_PAUSE: 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPlayPause(); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PREV_TRACK: 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPrevTrack(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_PRESSED: // fallthrough 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_RELEASED: 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::chromeos::IsRunningOnChromeOS()) { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no powerd in linux desktop, so call the 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PowerButtonController here. 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPowerButtonEvent(action == POWER_PRESSED, base::TimeTicks()); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't do anything with these at present on the device, 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (power button events are reported to us from powerm via 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // D-BUS), but we consume them to prevent them from getting 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to apps -- see http://crbug.com/146609. 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_PRESSED: 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_RELEASED: 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnLockButtonEvent(action == LOCK_PRESSED, base::TimeTicks()); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_LAYER_HIERARCHY: 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintLayerHierarchy(); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_VIEW_HIERARCHY: 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintViewHierarchy(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_WINDOW_HIERARCHY: 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintWindowHierarchy(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unhandled action " << action; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetBrightnessControlDelegate( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install brightness control delegate only when internal 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display exists. 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Shell::GetInstance()->display_manager()->HasInternalDisplay() || 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch( 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kAshEnableBrightnessControl)) { 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness_control_delegate_ = brightness_control_delegate.Pass(); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetImeControlDelegate( 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ImeControlDelegate> ime_control_delegate) { 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ime_control_delegate_ = ime_control_delegate.Pass(); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetScreenshotDelegate( 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScreenshotDelegate> screenshot_delegate) { 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screenshot_delegate_ = screenshot_delegate.Pass(); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, ui::AcceleratorTarget implementation: 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::AcceleratorPressed( 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator it = 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(accelerator); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != accelerators_.end()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PerformAction(static_cast<AcceleratorAction>(it->second), accelerator); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::RegisterAccelerators( 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AcceleratorData accelerators[], 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t accelerators_length) { 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < accelerators_length; ++i) { 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator accelerator(accelerators[i].keycode, 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators[i].modifiers); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.set_type(accelerators[i].trigger_on_press ? 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Register(accelerator, this); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.insert( 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(accelerator, accelerators[i].action)); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetKeyboardBrightnessControlDelegate( 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<KeyboardBrightnessControlDelegate> 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_ = 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate.Pass(); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::CanHandleAccelerators() const { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 971