accelerator_controller.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_table.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/caps_lock_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/multi_display_manager.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/focus_cycler.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ime_control_delegate.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_delegate.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher_model.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/magnifier/magnification_controller.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/rotator/screen_rotation.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/brightness/brightness_control_delegate.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/volume_control_delegate.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator_manager.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/debug_utils.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/oak/oak.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/debug_utils.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/output_configurator_animation.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/keyboard_brightness_controller.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/chromeos/chromeos_version.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/display/output_configurator.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factor of magnification scale. For example, when this value is 1.189, scale 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value will be changed x1.000, x1.189, x1.414, x1.681, x2.000, ... 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: this value is 2.0 ^ (1 / 4). 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kMagnificationFactor = 1.18920712f; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DebugShortcutsEnabled() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshDebugShortcuts); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleCycleWindowMRU(WindowCycleController::Direction direction, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_alt_down) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()-> 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_cycle_controller()->HandleCycleWindow(direction, is_alt_down); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always report we handled the key, even if the window didn't change. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandleCycleWindowLinear(CycleDirection direction) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Launcher::ForPrimaryDisplay()->CycleWindowLinear(direction); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleLock() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->LockScreen(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleFileManager(bool as_dialog) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->OpenFileManager(as_dialog); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleCrosh() { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->OpenCrosh(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleSpokenFeedback() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->ToggleSpokenFeedback(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandleCycleDisplayMode() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::chromeos::IsRunningOnChromeOS()) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::MultiDisplayManager::CycleDisplay(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (shell->output_configurator()->connected_output_count() > 1) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::OutputConfiguratorAnimation* animation = 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->output_configurator_animation(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) animation->StartFadeOutAnimation(base::Bind( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IgnoreResult(&chromeos::OutputConfigurator::CycleDisplayMode), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(shell->output_configurator()))); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HandleSwapPrimaryDisplay() { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Shell::GetScreen()->GetNumDisplays() > 1) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller()->SetPrimaryDisplay( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenAsh::GetSecondaryDisplay()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotatePaneFocus(Shell::Direction direction) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Shell::GetInstance()->delegate()->RotatePaneFocus(direction)) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No browser window is available. Focus the launcher. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (direction) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Shell::FORWARD: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::FORWARD); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Shell::BACKWARD: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::BACKWARD); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rotates the default window container. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotateWindows() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowControllerList controllers = 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindowControllers(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < controllers.size(); ++i) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* target = controllers[i]->GetContainer( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::kShellWindowId_DefaultContainer); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rotation animation bases its target transform on the current 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Since there could be an animation in progress 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right now, queue this animation so when it starts it picks up a neutral 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Use replace so we only enqueue one at a time. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->layer()->GetAnimator()-> 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_preemption_strategy(ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::LayerAnimationSequence> screen_rotation( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::LayerAnimationSequence(new ash::ScreenRotation(360))); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->layer()->GetAnimator()->StartAnimation( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_rotation.release()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rotates the screen. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotateScreen() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int i = 0; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta = 0; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (i) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: delta = 90; break; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: delta = 90; break; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: delta = 90; break; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: delta = 90; break; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: delta = -90; break; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: delta = -90; break; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 6: delta = -90; break; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 7: delta = -90; break; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 8: delta = -90; break; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 9: delta = 180; break; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 10: delta = 180; break; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 11: delta = 90; break; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 12: delta = 180; break; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 13: delta = 180; break; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = (i + 1) % 14; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < root_windows.size(); ++i) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window = root_windows[i]; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window->layer()->GetAnimator()-> 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_preemption_strategy(ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::LayerAnimationSequence> screen_rotation( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::LayerAnimationSequence(new ash::ScreenRotation(delta))); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_rotation->AddObserver(root_window); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window->layer()->GetAnimator()-> 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartAnimation(screen_rotation.release()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleDesktopBackgroundMode() { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBackgroundController* desktop_background_controller = 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->desktop_background_controller(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (desktop_background_controller->desktop_background_mode() == 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBackgroundController::BACKGROUND_IMAGE) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_background_controller->SetDesktopBackgroundSolidColorMode( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorBLACK); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->user_wallpaper_delegate()-> 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitializeWallpaper(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleRootWindowFullScreen() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow()->ToggleFullScreen(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Magnify the screen 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMagnifyScreen(int delta_index) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yoshiki): Create the class like MagnifierStepScaleController, and 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // move the following scale control to it. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale = 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()->GetScale(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate rounded logarithm (base kMagnificationFactor) of scale. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int scale_index = 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::floor(std::log(scale) / std::log(kMagnificationFactor) + 0.5); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()-> 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetScale(std::pow(kMagnificationFactor, new_scale_index), true); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaNextTrack() { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaNextTrack(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPlayPause() { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaPlayPause(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleMediaPrevTrack() { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->HandleMediaPrevTrack(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintLayerHierarchy() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < root_windows.size(); ++i) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::PrintLayerHierarchy(root_windows[i]->layer(), 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_windows[i]->GetLastMouseLocationInRoot()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintViewHierarchy() { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* default_container = 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindowController()->GetContainer( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::kShellWindowId_DefaultContainer); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_container->children().empty()) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* browser_frame = default_container->children()[0]; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* browser_widget = 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::GetWidgetForNativeWindow(browser_frame); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::PrintViewHierarchy(browser_widget->GetRootView()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintWindowHierarchy(aura::Window* window, int indent) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indent_str(indent, ' '); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(INFO) << indent_str << window->name() << " type " << window->type() 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << (wm::IsActiveWindow(window) ? "active" : ""); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window->children().size(); ++i) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintWindowHierarchy(window->children()[i], indent + 3); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintWindowHierarchy() { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(INFO) << "Window hierarchy:"; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowControllerList controllers = 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindowControllers(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < controllers.size(); ++i) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(INFO) << "RootWindow " << i << ":"; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* container = controllers[i]->GetContainer( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::kShellWindowId_DefaultContainer); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintWindowHierarchy(container, 0); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(NDEBUG) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorControllerContext, public: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorControllerContext::AcceleratorControllerContext() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_.set_type(ui::ET_UNKNOWN); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_.set_type(ui::ET_UNKNOWN); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorControllerContext::UpdateContext( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_ = current_accelerator_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_ = accelerator; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, public: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::AcceleratorController() 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : accelerator_manager_(new ui::AcceleratorManager) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::~AcceleratorController() { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Init() { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLoginOrLockScreenLength; ++i) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.insert( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLockScreenLength; ++i) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert(kActionsAllowedAtLockScreen[i]); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtModalWindowLength; ++i) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.insert(kActionsAllowedAtModalWindow[i]); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kReservedActionsLength; ++i) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserved_actions_.insert(kReservedActions[i]); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kNonrepeatableActionsLength; ++i) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nonrepeatable_actions_.insert(kNonrepeatableActions[i]); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DebugShortcutsEnabled()) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_.reset( 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new KeyboardBrightnessController()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Register(const ui::Accelerator& accelerator, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Register(accelerator, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorManager::kNormalPriority, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Unregister(const ui::Accelerator& accelerator, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Unregister(accelerator, target); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->UnregisterAll(target); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::Process(const ui::Accelerator& accelerator) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ime_control_delegate_.get()) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process(accelerator); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsRegistered( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->GetCurrentTarget(accelerator) != NULL; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsReservedAccelerator( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator remapped_accelerator = ime_control_delegate_.get() ? 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator) : accelerator; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator iter = 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(remapped_accelerator); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == accelerators_.end()) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // not an accelerator. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reserved_actions_.find(iter->second) != reserved_actions_.end(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::PerformAction(int action, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool at_login_screen = false; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) at_login_screen = !shell->delegate()->IsSessionStarted(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (at_login_screen && 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.find(action) == 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.end()) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell->IsScreenLocked() && 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.find(action) == 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.end()) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell->IsModalWindowOpen() && 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.find(action) == 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.end()) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we return true. This indicates the shortcut is handled 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will not be passed to the modal window. This is important 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for things like Alt+Tab that would cause an undesired effect 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the modal window by cycling through its window elements. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyboardCode key_code = accelerator.key_code(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PerformAction() is performed from gesture controllers and passes 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty Accelerator() instance as the second argument. Such events 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should never be suspended. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool gesture_event = key_code == ui::VKEY_UNKNOWN; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore accelerators invoked as repeated (while holding a key for a long 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, if their handling is nonrepeatable. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nonrepeatable_actions_.find(action) != nonrepeatable_actions_.end() && 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.repeated() && !gesture_event) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of the previous accelerator. Used by NEXT_IME and DISABLE_CAPS_LOCK. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::EventType previous_event_type = 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().type(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You *MUST* return true when some action is performed. Otherwise, this 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function might be called *twice*, via BrowserView::PreHandleKeyboardEvent 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and BrowserView::HandleKeyboardEvent, for a single accelerator press. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (action) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_MRU: 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_TAB && shell->delegate()) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_TAB); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::BACKWARD, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.IsAltDown()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_MRU: 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_TAB && shell->delegate()) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_TAB); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::FORWARD, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.IsAltDown()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_LINEAR: 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_F5 && shell->delegate()) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_F5); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleCycleWindowLinear(CYCLE_BACKWARD); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_LINEAR: 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_F5 && shell->delegate()) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_F5); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleCycleWindowLinear(CYCLE_FORWARD); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_DISPLAY_MODE: 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleCycleDisplayMode(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_SCREEN: 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleLock(); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FILE_MANAGER_DIALOG: 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleFileManager(true /* as_dialog */); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FILE_MANAGER_TAB: 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleFileManager(false /* as_dialog */); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_CROSH: 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCrosh(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWAP_PRIMARY_DISPLAY: 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSwapPrimaryDisplay(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_SPOKEN_FEEDBACK: 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleSpokenFeedback(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_WIFI: 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Shell::GetInstance()->tray_delegate()) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->tray_delegate()->ToggleWifi(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FEEDBACK_PAGE: 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->delegate()->OpenFeedbackPage(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EXIT: 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->Exit(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_INCOGNITO_WINDOW: 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewWindow(true /* is_incognito */); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_TAB: 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_T && shell->delegate()) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEWTAB_T); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewTab(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->NewWindow(false /* is_incognito */); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RESTORE_TAB: 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->RestoreTab(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_SCREENSHOT: 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screenshot_delegate_.get() && 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->CanTakeScreenshot()) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_->HandleTakeScreenshotForAllRootWindows(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_PARTIAL_SCREENSHOT: 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screenshot_delegate_.get()) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::PartialScreenshotView::StartPartialScreenshot( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_.get()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true to prevent propagation of the key event because 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this key combination is reserved for partial screenshot. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_APP_LIST: 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_LWIN && shell->delegate()) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_SEARCH_LWIN); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When spoken feedback is enabled, we should neither toggle the list nor 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consume the key since Search+Shift is one of the shortcuts the a11y 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // feature uses. crbug.com/132296 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled()) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->ToggleAppList(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DISABLE_CAPS_LOCK: 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See: case NEXT_IME. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We totally ignore this accelerator. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->SetCapsLockEnabled(false); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_CAPS_LOCK: 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->caps_lock_delegate()->ToggleCapsLock(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_DOWN: 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (brightness_control_delegate_.get()) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessDown(accelerator); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_UP: 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (brightness_control_delegate_.get()) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessUp(accelerator); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_DOWN: 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (keyboard_brightness_control_delegate_.get()) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessDown(accelerator); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_UP: 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (keyboard_brightness_control_delegate_.get()) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessUp(accelerator); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_MUTE: 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->tray_delegate()->GetVolumeControlDelegate()-> 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeMute(accelerator); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_DOWN: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->tray_delegate()->GetVolumeControlDelegate()-> 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeDown(accelerator); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case VOLUME_UP: 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->tray_delegate()->GetVolumeControlDelegate()-> 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleVolumeUp(accelerator); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_LAUNCHER: 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->focus_cycler()->FocusWidget( 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Launcher::ForPrimaryDisplay()->widget()); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_NEXT_PANE: 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::FORWARD); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_PREVIOUS_PANE: 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::BACKWARD); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_SYSTEM_TRAY: { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::StatusAreaWidget* status_area = 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->status_area_widget(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status_area) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell->focus_cycler()->FocusWidget( 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_area->system_tray()->GetWidget()); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_KEYBOARD_OVERLAY: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->delegate()->ShowKeyboardOverlay(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_OAK: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshEnableOak)) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oak::ShowOakWindow(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_TASK_MANAGER: 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->delegate()->ShowTaskManager(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEXT_IME: 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This check is necessary e.g. not to process the Shift+Alt+ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is released. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED && 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Workaround for crbug.com/139556. CJK IME users tend to press 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enter (or Space) and Shift+Alt almost at the same time to commit 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an IME string and then switch from the IME to the English layout. 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This workaround allows the user to trigger NEXT_IME even if the 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user presses Shift+Alt before releasing Enter. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().key_code() != ui::VKEY_RETURN && 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().key_code() != ui::VKEY_SPACE) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We totally ignore this accelerator. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mazda): Fix crbug.com/158217 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ime_control_delegate_.get()) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleNextIme(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PREVIOUS_IME: 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ime_control_delegate_.get()) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandlePreviousIme(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWITCH_IME: 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ime_control_delegate_.get()) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ime_control_delegate_->HandleSwitchIme(accelerator); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_0: 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(0); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_1: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(1); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_2: 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(2); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_3: 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(3); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_4: 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(4); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_5: 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(5); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_6: 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(6); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_WIN_7: 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(7); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SELECT_LAST_WIN: 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwitchToWindow(-1); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_LEFT: 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_RIGHT: { 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable window docking shortcut key for full screen window due to 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/135487. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window || 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->type() != aura::client::WINDOW_TYPE_NORMAL || 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::IsWindowFullscreen(window)) { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer sizer(window, 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(), 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::RIGHT_EDGE, 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (wm::IsWindowFullscreen(window) || 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::IsWindowMaximized(window)) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before we can set the bounds we need to restore the window. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restoring the window will set the window to its restored bounds. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid an unnecessary bounds changes (which may have side effects) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we set the restore bounds to the bounds we want, restore the window, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then reset the restore bounds. This way no unnecessary bounds 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes occurs and the original restore bounds is remembered. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect restore = *GetRestoreBoundsInScreen(window); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBoundsInParent(window, sizer.GetSnapBounds(window->bounds())); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(window); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBoundsInScreen(window, restore); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->SetBounds(sizer.GetSnapBounds(window->bounds())); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_MINIMIZE: { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to restore the window that would be cycled through next from 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the launcher when there is no active window. 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCycleWindowMRU(WindowCycleController::FORWARD, false); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable the shortcut for minimizing full screen window due to 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crbug.com/131709, which is a crashing issue related to minimizing 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // full screen pepper window. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!wm::IsWindowFullscreen(window)) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MinimizeWindow(window); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_MAXIMIZED: { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_code == ui::VKEY_F4 && shell->delegate()) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->RecordUserMetricsAction( 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_ACCEL_MAXIMIZE_RESTORE_F4); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->delegate()->ToggleMaximized(); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_POSITION_CENTER: { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::CenterWindow(window); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ROTATE_WINDOWS: 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotateWindows(); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ROTATE_SCREEN: 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotateScreen(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_DESKTOP_BACKGROUND_MODE: 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleDesktopBackgroundMode(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_ROOT_WINDOW_FULL_SCREEN: 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleRootWindowFullScreen(); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DISPLAY_TOGGLE_SCALE: 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::MultiDisplayManager::ToggleDisplayScale(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_IN: 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(1); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_OUT: 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(-1); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_NEXT_TRACK: 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaNextTrack(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PLAY_PAUSE: 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPlayPause(); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PREV_TRACK: 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPrevTrack(); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_PRESSED: // fallthrough 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_RELEASED: 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::chromeos::IsRunningOnChromeOS()) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no powerd in linux desktop, so call the 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PowerButtonController here. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPowerButtonEvent(action == POWER_PRESSED, base::TimeTicks()); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't do anything with these at present on the device, 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (power button evets are reported to us from powerm via 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // D-BUS), but we consume them to prevent them from getting 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to apps -- see http://crbug.com/146609. 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_PRESSED: 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_RELEASED: 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::chromeos::IsRunningOnChromeOS()) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no powerd in linux desktop, so call the 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PowerButtonController here. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnLockButtonEvent(action == LOCK_PRESSED, base::TimeTicks()); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LOCK_PRESSED/RELEASED in debug only action that is meant for 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing lock behavior on linux desktop. If we ever reached 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here (when you run a debug build on the device), pass it onto 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apps. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_LAYER_HIERARCHY: 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintLayerHierarchy(); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_VIEW_HIERARCHY: 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintViewHierarchy(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_WINDOW_HIERARCHY: 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintWindowHierarchy(); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unhandled action " << action; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetBrightnessControlDelegate( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::MultiDisplayManager* display_manager = 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<internal::MultiDisplayManager*>( 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::GetInstance()->display_manager()); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install brightness control delegate only when internal 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display exists. 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (display_manager->HasInternalDisplay()) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness_control_delegate_.swap(brightness_control_delegate); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetImeControlDelegate( 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ImeControlDelegate> ime_control_delegate) { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_.swap(ime_control_delegate); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetScreenshotDelegate( 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScreenshotDelegate> screenshot_delegate) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screenshot_delegate_.swap(screenshot_delegate); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, ui::AcceleratorTarget implementation: 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::AcceleratorPressed( 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator it = 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(accelerator); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != accelerators_.end()); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PerformAction(static_cast<AcceleratorAction>(it->second), accelerator); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SwitchToWindow(int window) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Launcher* launcher = Launcher::ForPrimaryDisplay(); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LauncherItems& items = launcher->model()->items(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_count = launcher->model()->item_count(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int indexes_left = window >= 0 ? window : item_count; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found_index = -1; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterating until we have hit the index we are interested in which 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is true once indexes_left becomes negative. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < item_count && indexes_left >= 0; i++) { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (items[i].type != TYPE_APP_LIST && 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items[i].type != TYPE_BROWSER_SHORTCUT) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found_index = i; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indexes_left--; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are two ways how found_index can be valid: a.) the nth item was 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // found (which is true when indexes_left is -1) or b.) the last item was 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requested (which is true when index was passed in as a negative number). 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found_index >= 0 && (indexes_left == -1 || window < 0) && 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (items[found_index].status == ash::STATUS_RUNNING || 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items[found_index].status == ash::STATUS_CLOSED)) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then set this one as active. 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launcher->ActivateLauncherItem(found_index); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::RegisterAccelerators( 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AcceleratorData accelerators[], 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t accelerators_length) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < accelerators_length; ++i) { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator accelerator(accelerators[i].keycode, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators[i].modifiers); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.set_type(accelerators[i].trigger_on_press ? 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Register(accelerator, this); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.insert( 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(accelerator, accelerators[i].action)); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetKeyboardBrightnessControlDelegate( 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<KeyboardBrightnessControlDelegate> 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate) { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_ = 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate.Pass(); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::CanHandleAccelerators() const { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 884