accelerator_controller.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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) 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ash/accelerators/accelerator_commands.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_table.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/accelerators/debug_commands.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/caps_lock_delegate.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/debug.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" 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ash/media_delegate.h" 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/multi_profile_uma.h" 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/new_window_delegate.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/rotator/screen_rotation.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/brightness_control_delegate.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/web_notification/web_notification_tray.h" 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/touch/touch_hud_debug.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/volume_control_delegate.h" 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/wm/overview/window_selector_controller.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator_manager.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/debug_utils.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/oak/oak.h" 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/debug_utils.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/session_state_delegate.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/keyboard_brightness_controller.h" 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using internal::DisplayInfo; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DebugShortcutsEnabled() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch( 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshDebugShortcuts); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void HandleCycleBackwardMRU(const ui::Accelerator& accelerator) { 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_TAB) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_TAB); 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->HandleCycleWindow( 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowSelector::BACKWARD); 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleCycleWindow( 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowCycleController::BACKWARD, accelerator.IsAltDown()); 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void HandleCycleForwardMRU(const ui::Accelerator& accelerator) { 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_TAB) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_TAB); 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->HandleCycleWindow( 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowSelector::FORWARD); 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleCycleWindow( 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowCycleController::FORWARD, accelerator.IsAltDown()); 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void HandleCycleLinear(const ui::Accelerator& accelerator) { 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(jamescook): When overview becomes the default the AcceleratorAction 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should be renamed from CYCLE_LINEAR to TOGGLE_OVERVIEW. 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_OVERVIEW_F5); 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->ToggleOverview(); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_MEDIA_LAUNCH_APP1) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_F5); 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleLinearCycleWindow(); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HandleAccessibleFocusCycle(bool reverse) { 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!Shell::GetInstance()->accessibility_delegate()-> 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IsSpokenFeedbackEnabled()) { 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!active_window) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget* widget = 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!widget) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::FocusManager* focus_manager = widget->GetFocusManager(); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!focus_manager) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::View* view = focus_manager->GetFocusedView(); 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!view) 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!strcmp(view->GetClassName(), views::WebView::kViewClassName)) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focus_manager->AdvanceFocus(reverse); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void HandleSilenceSpokenFeedback() { 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccessibilityDelegate* delegate = 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!delegate->IsSpokenFeedbackEnabled()) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->SilenceSpokenFeedback(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleLock() { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->session_state_delegate()->LockScreen(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool HandleFileManager() { 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->OpenFileManager(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleCrosh() { 1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->OpenCrosh(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleSpokenFeedback() { 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate()-> 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToggleSpokenFeedback(A11Y_NOTIFICATION_SHOW); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool SwitchToNextUser() { 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ash::SessionStateDelegate* delegate = 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (delegate->NumberOfLoggedInUsers() <= 1) 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MultiProfileUMA::RecordSwitchActiveUser( 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR); 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) delegate->SwitchActiveUserToNext(); 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotatePaneFocus(Shell::Direction direction) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (direction) { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Shell::FORWARD: 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::FORWARD); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case Shell::BACKWARD: 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::BACKWARD); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rotate the active window. 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleRotateActiveWindow() { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = wm::GetActiveWindow(); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_window) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rotation animation bases its target transform on the current 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Since there could be an animation in progress 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right now, queue this animation so when it starts it picks up a neutral 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Use replace so we only enqueue one at a time. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()-> 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_preemption_strategy(ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()->StartAnimation( 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ui::LayerAnimationSequence( 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ash::ScreenRotation(360, active_window->layer()))); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetNextRotation(gfx::Display::Rotation current) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (current) { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_0: 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_90; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_90: 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_180; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_180: 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_270; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_270: 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown rotation:" << current; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleScaleUI(bool up) { 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager* display_manager = 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager(); 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float next_scale = 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager::GetNextUIScale(display_info, up); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display_id, next_scale); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HandleScaleReset() { 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager* display_manager = 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager(); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display_id, 1.0f); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rotates the screen. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotateScreen() { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display = Shell::GetScreen()->GetDisplayNearestPoint(point); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DisplayInfo& display_info = 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager()->SetDisplayRotation( 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display.id(), GetNextRotation(display_info.rotation())); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleRootWindowFullScreen() { 2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetPrimaryRootWindow()->GetDispatcher()->ToggleFullScreen(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Magnify the screen 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMagnifyScreen(int delta_index) { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ash::Shell::GetInstance()->magnification_controller()->IsEnabled()) { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(yoshiki): Move the following logic to MagnificationController. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale = 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()->GetScale(); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Calculate rounded logarithm (base kMagnificationScaleFactor) of scale. 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int scale_index = 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::floor(std::log(scale) / std::log(kMagnificationScaleFactor) + 0.5); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()-> 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetScale(std::pow(kMagnificationScaleFactor, new_scale_index), true); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ash::Shell::GetInstance()-> 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partial_magnification_controller()->is_enabled()) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->partial_magnification_controller()-> 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetScale(scale); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaNextTrack() { 3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaNextTrack(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPlayPause() { 3220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaPlayPause(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPrevTrack() { 3270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaPrevTrack(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintLayerHierarchy() { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < root_windows.size(); ++i) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::PrintLayerHierarchy(root_windows[i]->layer(), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_windows[i]->GetLastMouseLocationInRoot()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintViewHierarchy() { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_window) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* browser_widget = 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_widget) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::PrintViewHierarchy(browser_widget->GetRootView()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintWindowHierarchy(aura::Window* window, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream* out) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indent_str(indent, ' '); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name(window->name()); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (name.empty()) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = "\"\""; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << indent_str << name << " (" << window << ")" 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " type=" << window->type() 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (wm::IsActiveWindow(window) ? " [active] " : " ") 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (window->IsVisible() ? " visible " : " ") 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << window->bounds().ToString() 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << '\n'; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window->children().size(); ++i) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(window->children()[i], indent + 3, out); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintWindowHierarchy() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowControllerList controllers = 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindowControllers(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < controllers.size(); ++i) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream out; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out << "RootWindow " << i << ":\n"; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(controllers[i]->root_window(), 0, &out); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Error so logs can be collected from end-users. 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << out.str(); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandlePrintUIHierarchies() { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is a separate command so the user only has to hit one key to generate 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all the logs. Developers use the individual dumps repeatedly, so keep 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // those as separate commands to avoid spamming their logs. 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintLayerHierarchy(); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintWindowHierarchy(); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintViewHierarchy(); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorControllerContext, public: 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorControllerContext::AcceleratorControllerContext() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_.set_type(ui::ET_UNKNOWN); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_.set_type(ui::ET_UNKNOWN); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorControllerContext::UpdateContext( 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_ = current_accelerator_; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_ = accelerator; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, public: 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::AcceleratorController() 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : accelerator_manager_(new ui::AcceleratorManager) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::~AcceleratorController() { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Init() { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLoginOrLockScreenLength; ++i) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.insert( 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLockScreenLength; ++i) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert(kActionsAllowedAtLockScreen[i]); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtModalWindowLength; ++i) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.insert(kActionsAllowedAtModalWindow[i]); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kReservedActionsLength; ++i) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserved_actions_.insert(kReservedActions[i]); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kNonrepeatableActionsLength; ++i) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nonrepeatable_actions_.insert(kNonrepeatableActions[i]); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kActionsAllowedInAppModeLength; ++i) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.insert(kActionsAllowedInAppMode[i]); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(NDEBUG) 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RegisterAccelerators(kDesktopAcceleratorData, kDesktopAcceleratorDataLength); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (DebugShortcutsEnabled()) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength); 44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < kReservedDebugActionsLength; ++i) 44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) reserved_actions_.insert(kReservedDebugActions[i]); 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_.reset( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new KeyboardBrightnessController()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Register(const ui::Accelerator& accelerator, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Register(accelerator, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorManager::kNormalPriority, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Unregister(const ui::Accelerator& accelerator, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Unregister(accelerator, target); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->UnregisterAll(target); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::Process(const ui::Accelerator& accelerator) { 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator)); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process(accelerator); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsRegistered( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->GetCurrentTarget(accelerator) != NULL; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsReservedAccelerator( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator remapped_accelerator = ime_control_delegate_.get() ? 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator) : accelerator; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator iter = 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(remapped_accelerator); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == accelerators_.end()) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // not an accelerator. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reserved_actions_.find(iter->second) != reserved_actions_.end(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::PerformAction(int action, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!shell->session_state_delegate()->IsActiveUserSessionStarted() && 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.find(action) == 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.end()) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shell->session_state_delegate()->IsScreenLocked() && 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.find(action) == 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.end()) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->IsSystemModalWindowOpen() && 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.find(action) == 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.end()) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we return true. This indicates the shortcut is handled 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will not be passed to the modal window. This is important 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for things like Alt+Tab that would cause an undesired effect 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the modal window by cycling through its window elements. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->delegate()->IsRunningInForcedAppMode() && 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.find(action) == 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.end()) { 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyboardCode key_code = accelerator.key_code(); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PerformAction() is performed from gesture controllers and passes 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty Accelerator() instance as the second argument. Such events 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should never be suspended. 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool gesture_event = key_code == ui::VKEY_UNKNOWN; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore accelerators invoked as repeated (while holding a key for a long 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, if their handling is nonrepeatable. 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nonrepeatable_actions_.find(action) != nonrepeatable_actions_.end() && 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.repeated() && !gesture_event) { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of the previous accelerator. Used by NEXT_IME and DISABLE_CAPS_LOCK. 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::EventType previous_event_type = 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().type(); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::KeyboardCode previous_key_code = 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_.previous_accelerator().key_code(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You *MUST* return true when some action is performed. Otherwise, this 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function might be called *twice*, via BrowserView::PreHandleKeyboardEvent 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and BrowserView::HandleKeyboardEvent, for a single accelerator press. 54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If your accelerator invokes more than one line of code, please either 54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // implement it in your module's controller code (like TOGGLE_MIRROR_MODE 55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // below) or pull it into a HandleFoo() function above. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (action) { 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_NEXT: 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(false); 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_PREVIOUS: 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(true); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_MRU: 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HandleCycleBackwardMRU(accelerator); 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_MRU: 56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HandleCycleForwardMRU(accelerator); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case CYCLE_LINEAR: 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HandleCycleLinear(accelerator); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADD_REMOVE_DISPLAY: 56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->display_manager()->AddRemoveDisplay(); 56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case TOGGLE_MIRROR_MODE: 57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->display_controller()->ToggleMirrorMode(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_SCREEN: 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_L) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_LOCK_SCREEN_L); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleLock(); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case OPEN_FILE_MANAGER: 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return HandleFileManager(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_CROSH: 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCrosh(); 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SILENCE_SPOKEN_FEEDBACK: 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HandleSilenceSpokenFeedback(); 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWAP_PRIMARY_DISPLAY: 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 58668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SWITCH_TO_NEXT_USER: 58768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return SwitchToNextUser(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_SPOKEN_FEEDBACK: 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleSpokenFeedback(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_WIFI: 59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->NotifyRequestToggleWifi(); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOUCH_HUD_CLEAR: { 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController* controller = 595d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (controller->touch_hud_debug()) { 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller->touch_hud_debug()->Clear(); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOUCH_HUD_MODE_CHANGE: { 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::RootWindowController* controller = 604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (controller->touch_hud_debug()) { 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller->touch_hud_debug()->ChangeToNextMode(); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case TOUCH_HUD_PROJECTION_TOGGLE: { 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool enabled = Shell::GetInstance()->is_touch_hud_projection_enabled(); 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->SetTouchHudProjectionEnabled(!enabled); 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DISABLE_GPU_WATCHDOG: 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->DisableGpuWatchdog(); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FEEDBACK_PAGE: 6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EXIT: 62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // UMA metrics are recorded in the handler. 62590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) exit_warning_handler_.HandleAccelerator(); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) case NEW_INCOGNITO_WINDOW: { 6280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool incognito_allowed = 6290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Shell::GetInstance()->delegate()->IsIncognitoAllowed(); 6300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (incognito_allowed) 6310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewWindow( 6320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) true /* is_incognito */); 6330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return incognito_allowed; 6340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_TAB: 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_T) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEWTAB_T); 6381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewTab(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: 6411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewWindow( 6421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) false /* is_incognito */); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RESTORE_TAB: 6451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->RestoreTab(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_SCREENSHOT: 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screenshot_delegate_.get() && 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->CanTakeScreenshot()) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->HandleTakeScreenshotForAllRootWindows(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_PARTIAL_SCREENSHOT: 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screenshot_delegate_) { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::PartialScreenshotView::StartPartialScreenshot( 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_.get()); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event because 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this key combination is reserved for partial screenshot. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_APP_LIST: 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Search key (LWIN) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // being pressed and released, then ignore the release of the 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Search key. 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN && 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (previous_event_type == ui::ET_KEY_RELEASED || 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_LWIN)) 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_SEARCH_LWIN); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When spoken feedback is enabled, we should neither toggle the list nor 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consume the key since Search+Shift is one of the shortcuts the a11y 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // feature uses. crbug.com/132296 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); 6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (Shell::GetInstance()->accessibility_delegate()-> 6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IsSpokenFeedbackEnabled()) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->ToggleAppList(NULL); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DISABLE_CAPS_LOCK: 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (previous_key_code != ui::VKEY_LSHIFT && 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_SHIFT && 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_RSHIFT)) { 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Shift key being pressed 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and released, then ignore the release of the Shift key. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->SetCapsLockEnabled(false); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_CAPS_LOCK: 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_code == ui::VKEY_LWIN) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If something else was pressed between the Search key (LWIN) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // being pressed and released, then ignore the release of the 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Search key. 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Releasing Alt first breaks this: crbug.com/166495 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_LWIN) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->ToggleCapsLock(); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_DOWN: 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessDown(accelerator); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_UP: 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessUp(accelerator); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_DOWN: 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessDown(accelerator); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_UP: 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessUp(accelerator); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_MUTE: { 7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeMute(accelerator); 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_DOWN: { 7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 7321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 7331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeDown(accelerator); 7341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_UP: { 7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeUp(accelerator); 7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_LAUNCHER: 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->focus_cycler()->FocusWidget( 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_NEXT_PANE: 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::FORWARD); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_PREVIOUS_PANE: 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::BACKWARD); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_KEYBOARD_OVERLAY: 7481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_OAK: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshEnableOak)) { 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SHOW_SYSTEM_TRAY_BUBBLE: { 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController* controller = 759d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 760424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!controller->GetSystemTray()->HasSystemBubble()) { 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); 762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 763424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SHOW_MESSAGE_CENTER_BUBBLE: { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController* controller = 768d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::StatusAreaWidget* status_area_widget = 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->shelf()->status_area_widget(); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status_area_widget) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebNotificationTray* notification_tray = 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget->web_notification_tray(); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (notification_tray->visible()) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_tray->ShowMessageCenterBubble(); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_TASK_MANAGER: 7801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEXT_IME: 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This check is necessary e.g. not to process the Shift+Alt+ 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is released. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED && 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Workaround for crbug.com/139556. CJK IME users tend to press 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enter (or Space) and Shift+Alt almost at the same time to commit 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an IME string and then switch from the IME to the English layout. 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This workaround allows the user to trigger NEXT_IME even if the 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user presses Shift+Alt before releasing Enter. 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_RETURN && 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_key_code != ui::VKEY_SPACE) { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We totally ignore this accelerator. 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mazda): Fix crbug.com/158217 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleNextIme(); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PREVIOUS_IME: 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 805a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return ime_control_delegate_->HandlePreviousIme(accelerator); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PRINT_UI_HIERARCHIES: 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandlePrintUIHierarchies(); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWITCH_IME: 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleSwitchIme(accelerator); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_0: 814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(0); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_1: 817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(1); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_2: 820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(2); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_3: 823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(3); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_4: 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(4); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_5: 829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(5); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_6: 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(6); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_7: 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(7); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_LAST_APP: 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(-1); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_LEFT: 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_RIGHT: { 8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wm::WindowState* window_state = wm::GetActiveWindowState(); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable window docking shortcut key for full screen window due to 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/135487. 8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!window_state || 8464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_state->window()->type() != aura::client::WINDOW_TYPE_NORMAL || 8474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_state->IsFullscreen()) { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::SnapSizer::SnapWindow(window_state, 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::RIGHT_EDGE); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WINDOW_MINIMIZE: 85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return accelerators::ToggleMinimized(); 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case TOGGLE_FULLSCREEN: { 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->delegate()->RecordUserMetricsAction( 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_ACCEL_FULLSCREEN_F4); 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) accelerators::ToggleFullscreen(); 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_MAXIMIZED: { 8678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) accelerators::ToggleMaximized(); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_POSITION_CENTER: { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) { 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::CenterWindow(window); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_UP: 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(true /* up */); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_DOWN: 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(false /* down */); 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SCALE_UI_RESET: 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleScaleReset(); 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ROTATE_WINDOW: 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleRotateActiveWindow(); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ROTATE_SCREEN: 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotateScreen(); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_DESKTOP_BACKGROUND_MODE: 88968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return debug::CycleDesktopBackgroundMode(); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_ROOT_WINDOW_FULL_SCREEN: 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleRootWindowFullScreen(); 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_DEVICE_SCALE_FACTOR: 89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->display_manager()->ToggleDisplayScaleFactor(); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS: 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowDebugBorders(); 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_FPS_COUNTER: 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowFpsCounter(); 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_PAINT_RECTS: 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowPaintRects(); 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_IN: 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(1); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_OUT: 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(-1); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_NEXT_TRACK: 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaNextTrack(); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PLAY_PAUSE: 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPlayPause(); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PREV_TRACK: 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPrevTrack(); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_PRESSED: // fallthrough 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_RELEASED: 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 9174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!base::SysInfo::IsRunningOnChromeOS()) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no powerd in linux desktop, so call the 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PowerButtonController here. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPowerButtonEvent(action == POWER_PRESSED, base::TimeTicks()); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't do anything with these at present on the device, 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (power button events are reported to us from powerm via 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // D-BUS), but we consume them to prevent them from getting 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to apps -- see http://crbug.com/146609. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_PRESSED: 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_RELEASED: 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnLockButtonEvent(action == LOCK_PRESSED, base::TimeTicks()); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_LAYER_HIERARCHY: 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintLayerHierarchy(); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_VIEW_HIERARCHY: 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintViewHierarchy(); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_WINDOW_HIERARCHY: 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintWindowHierarchy(); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unhandled action " << action; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetBrightnessControlDelegate( 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install brightness control delegate only when internal 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display exists. 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Shell::GetInstance()->display_manager()->HasInternalDisplay() || 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch( 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kAshEnableBrightnessControl)) { 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness_control_delegate_ = brightness_control_delegate.Pass(); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetImeControlDelegate( 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ImeControlDelegate> ime_control_delegate) { 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ime_control_delegate_ = ime_control_delegate.Pass(); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetScreenshotDelegate( 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScreenshotDelegate> screenshot_delegate) { 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screenshot_delegate_ = screenshot_delegate.Pass(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, ui::AcceleratorTarget implementation: 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::AcceleratorPressed( 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator it = 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(accelerator); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != accelerators_.end()); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PerformAction(static_cast<AcceleratorAction>(it->second), accelerator); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::RegisterAccelerators( 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AcceleratorData accelerators[], 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t accelerators_length) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < accelerators_length; ++i) { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator accelerator(accelerators[i].keycode, 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators[i].modifiers); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.set_type(accelerators[i].trigger_on_press ? 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Register(accelerator, this); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.insert( 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(accelerator, accelerators[i].action)); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetKeyboardBrightnessControlDelegate( 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<KeyboardBrightnessControlDelegate> 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate) { 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_ = 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate.Pass(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::CanHandleAccelerators() const { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1004