accelerator_controller.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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/magnifier/magnification_controller.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/partial_magnification_controller.h" 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ash/media_delegate.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/multi_profile_uma.h" 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/new_window_delegate.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/rotator/screen_rotation.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h" 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_delegate.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.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" 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/wm/mru_window_tracker.h" 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/wm/overview/window_selector_controller.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/user_metrics.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator_manager.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/debug_utils.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/oak/oak.h" 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/debug_utils.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/session_state_delegate.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/keyboard_brightness_controller.h" 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using internal::DisplayInfo; 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using content::UserMetricsAction; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DebugShortcutsEnabled() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAshDebugShortcuts); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleAccessibleFocusCycle(bool reverse) { 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (reverse) { 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Accessible_Focus_Previous")); 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Accessible_Focus_Next")); 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!Shell::GetInstance()->accessibility_delegate()-> 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IsSpokenFeedbackEnabled()) { 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!active_window) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::Widget* widget = 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!widget) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::FocusManager* focus_manager = widget->GetFocusManager(); 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!focus_manager) 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::View* view = focus_manager->GetFocusedView(); 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!view) 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!strcmp(view->GetClassName(), views::WebView::kViewClassName)) 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) focus_manager->AdvanceFocus(reverse); 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleCycleBackwardMRU(const ui::Accelerator& accelerator) { 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_TAB) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_PrevWindow_Tab")); 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->HandleCycleWindow( 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowSelector::BACKWARD); 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleCycleWindow( 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowCycleController::BACKWARD, accelerator.IsAltDown()); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleCycleForwardMRU(const ui::Accelerator& accelerator) { 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_TAB) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_NextWindow_Tab")); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->HandleCycleWindow( 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowSelector::FORWARD); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleCycleWindow( 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WindowCycleController::FORWARD, accelerator.IsAltDown()); 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleCycleLinear(const ui::Accelerator& accelerator) { 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(jamescook): When overview becomes the default the AcceleratorAction 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should be renamed from CYCLE_LINEAR to TOGGLE_OVERVIEW. 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (switches::UseOverviewMode()) { 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_Overview_F5")); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_selector_controller()->ToggleOverview(); 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (accelerator.key_code() == ui::VKEY_MEDIA_LAUNCH_APP1) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_NextWindow_F5")); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shell->window_cycle_controller()->HandleLinearCycleWindow(); 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleDisableCapsLock(ui::KeyboardCode key_code, 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::EventType previous_event_type, 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::KeyboardCode previous_key_code) { 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (previous_key_code != ui::VKEY_LSHIFT && 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_SHIFT && 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_RSHIFT)) { 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If something else was pressed between the Shift key being pressed 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and released, then ignore the release of the Shift key. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Disable_Caps_Lock")); 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shell->caps_lock_delegate()->SetCapsLockEnabled(false); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleFocusLauncher() { 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_Focus_Launcher")); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return shell->focus_cycler()->FocusWidget( 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()); 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleLaunchAppN(int n) { 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Launch_App")); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(n); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleLaunchLastApp() { 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Launch_Last_App")); 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(-1); 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Magnify the screen 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleMagnifyScreen(int delta_index) { 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ash::Shell::GetInstance()->magnification_controller()->IsEnabled()) { 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(yoshiki): Move the following logic to MagnificationController. 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float scale = 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()->GetScale(); 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Calculate rounded logarithm (base kMagnificationScaleFactor) of scale. 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int scale_index = 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::floor(std::log(scale) / std::log(kMagnificationScaleFactor) + 0.5); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->magnification_controller()-> 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScale(std::pow(kMagnificationScaleFactor, new_scale_index), true); 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (ash::Shell::GetInstance()-> 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) partial_magnification_controller()->is_enabled()) { 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->partial_magnification_controller()-> 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScale(scale); 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleMediaNextTrack() { 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaNextTrack(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleMediaPlayPause() { 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaPlayPause(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleMediaPrevTrack() { 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->media_delegate()->HandleMediaPrevTrack(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleNewIncognitoWindow() { 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_New_Incognito_Window")); 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool incognito_allowed = 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->delegate()->IsIncognitoAllowed(); 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (incognito_allowed) 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewWindow( 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) true /* is_incognito */); 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return incognito_allowed; 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleNewTab(ui::KeyboardCode key_code) { 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (key_code == ui::VKEY_T) 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_NewTab_T")); 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewTab(); 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleNewWindow() { 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_New_Window")); 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->NewWindow( 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) false /* is_incognito */); 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleNextIme(ImeControlDelegate* ime_control_delegate, 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::EventType previous_event_type, 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::KeyboardCode previous_key_code) { 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This check is necessary e.g. not to process the Shift+Alt+ 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is released. 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED && 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Workaround for crbug.com/139556. CJK IME users tend to press 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Enter (or Space) and Shift+Alt almost at the same time to commit 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // an IME string and then switch from the IME to the English layout. 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This workaround allows the user to trigger NEXT_IME even if the 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // user presses Shift+Alt before releasing Enter. 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_RETURN && 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_SPACE) { 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We totally ignore this accelerator. 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(mazda): Fix crbug.com/158217 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Next_Ime")); 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ime_control_delegate) 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ime_control_delegate->HandleNextIme(); 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleOpenFeedbackPage() { 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Open_Feedback_Page")); 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandlePositionCenter() { 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Window_Position_Center")); 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) aura::Window* window = wm::GetActiveWindow(); 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Docked windows do not support centering and ignore accelerator. 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (window && !wm::GetWindowState(window)->IsDocked()) { 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) wm::CenterWindow(window); 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandlePreviousIme(ImeControlDelegate* ime_control_delegate, 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ui::Accelerator& accelerator) { 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Previous_Ime")); 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ime_control_delegate) 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ime_control_delegate->HandlePreviousIme(accelerator); 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleRestoreTab() { 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_Restore_Tab")); 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->RestoreTab(); 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleRotatePaneFocus(Shell::Direction direction) { 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (direction) { 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(stevet): Not sure if this is the same as IDC_FOCUS_NEXT_PANE. 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case Shell::FORWARD: { 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Focus_Next_Pane")); 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::FORWARD); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case Shell::BACKWARD: { 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Focus_Previous_Pane")); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->focus_cycler()->RotateFocus(internal::FocusCycler::BACKWARD); 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rotate the active window. 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleRotateActiveWindow() { 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Rotate_Window")); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = wm::GetActiveWindow(); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active_window) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rotation animation bases its target transform on the current 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Since there could be an animation in progress 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right now, queue this animation so when it starts it picks up a neutral 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rotation and position. Use replace so we only enqueue one at a time. 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()-> 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_preemption_strategy(ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_window->layer()->GetAnimator()->StartAnimation( 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ui::LayerAnimationSequence( 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new ash::ScreenRotation(360, active_window->layer()))); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetNextRotation(gfx::Display::Rotation current) { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (current) { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_0: 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_90; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_90: 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_180; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_180: 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_270; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case gfx::Display::ROTATE_270: 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown rotation:" << current; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::ROTATE_0; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Rotates the screen. 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleRotateScreen() { 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Rotate_Window")); 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint(); 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Display display = Shell::GetScreen()->GetDisplayNearestPoint(point); 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const DisplayInfo& display_info = 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_manager()->SetDisplayRotation( 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) display.id(), GetNextRotation(display_info.rotation())); 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleScaleReset() { 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::DisplayManager* display_manager = 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_manager(); 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Scale_Ui_Reset")); 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) display_manager->SetDisplayUIScale(display_id, 1.0f); 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandleScaleUI(bool up) { 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager* display_manager = 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager(); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 display_id = display_manager->GetDisplayIdForUIScaling(); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_id == gfx::Display::kInvalidDisplayID) 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (up) { 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Scale_Ui_Up")); 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Scale_Ui_Down")); 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id); 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float next_scale = 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::DisplayManager::GetNextUIScale(display_info, up); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display_id, next_scale); 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleSwapPrimaryDisplay() { 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Swap_Primary_Display")); 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleShowKeyboardOverlay() { 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Show_Keyboard_Overlay")); 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void HandleShowMessageCenterBubble() { 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Show_Message_Center_Bubble")); 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController* controller = 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::StatusAreaWidget* status_area_widget = 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->shelf()->status_area_widget(); 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (status_area_widget) { 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebNotificationTray* notification_tray = 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status_area_widget->web_notification_tray(); 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (notification_tray->visible()) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notification_tray->ShowMessageCenterBubble(); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleShowOak() { 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switches::kAshEnableOak)) { 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow()); 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleShowSystemTrayBubble() { 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Show_System_Tray_Bubble")); 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController* controller = 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!controller->GetSystemTray()->HasSystemBubble()) { 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleShowTaskManager() { 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Show_Task_Manager")); 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void HandleSilenceSpokenFeedback() { 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Silence_Spoken_Feedback")); 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AccessibilityDelegate* delegate = 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate(); 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!delegate->IsSpokenFeedbackEnabled()) 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate->SilenceSpokenFeedback(); 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleSwitchIme(ImeControlDelegate* ime_control_delegate, 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ui::Accelerator& accelerator) { 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Switch_Ime")); 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ime_control_delegate) 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ime_control_delegate->HandleSwitchIme(accelerator); 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleTakePartialScreenshot(ScreenshotDelegate* screenshot_delegate) { 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Take_Partial_Screenshot")); 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (screenshot_delegate) { 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::PartialScreenshotView::StartPartialScreenshot( 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) screenshot_delegate); 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Return true to prevent propagation of the key event because 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // this key combination is reserved for partial screenshot. 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleTakeScreenshot(ScreenshotDelegate* screenshot_delegate) { 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Take_Screenshot")); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (screenshot_delegate && 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) screenshot_delegate->CanTakeScreenshot()) { 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) screenshot_delegate->HandleTakeScreenshotForAllRootWindows(); 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Return true to prevent propagation of the key event. 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleToggleAppList(ui::KeyboardCode key_code, 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::EventType previous_event_type, 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::KeyboardCode previous_key_code, 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ui::Accelerator& accelerator) { 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If something else was pressed between the Search key (LWIN) 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // being pressed and released, then ignore the release of the 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Search key. 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (key_code == ui::VKEY_LWIN && 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (previous_event_type == ui::ET_KEY_RELEASED || 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_LWIN)) 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (key_code == ui::VKEY_LWIN) 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(content::UserMetricsAction("Accel_Search_LWin")); 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When spoken feedback is enabled, we should neither toggle the list nor 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // consume the key since Search+Shift is one of the shortcuts the a11y 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // feature uses. crbug.com/132296 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (Shell::GetInstance()->accessibility_delegate()-> 541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IsSpokenFeedbackEnabled()) 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->ToggleAppList(NULL); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleToggleCapsLock(ui::KeyboardCode key_code, 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::EventType previous_event_type, 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::KeyboardCode previous_key_code) { 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (key_code == ui::VKEY_LWIN) { 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If something else was pressed between the Search key (LWIN) 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // being pressed and released, then ignore the release of the 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Search key. 555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(danakj): Releasing Alt first breaks this: crbug.com/166495 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (previous_event_type == ui::ET_KEY_RELEASED || 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) previous_key_code != ui::VKEY_LWIN) 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Toggle_Caps_Lock")); 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shell->caps_lock_delegate()->ToggleCapsLock(); 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleToggleFullscreen(ui::KeyboardCode key_code) { 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { 567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Fullscreen_F4")); 568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) accelerators::ToggleFullscreen(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleToggleRootWindowFullScreen() { 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetPrimaryRootWindow()->GetDispatcher()->host()->ToggleFullScreen(); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleWindowSnap(int action) { 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) wm::WindowState* window_state = wm::GetActiveWindowState(); 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Disable window snapping shortcut key for full screen window due to 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // http://crbug.com/135487. 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!window_state || 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_state->window()->type() != aura::client::WINDOW_TYPE_NORMAL || 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_state->IsFullscreen()) { 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (action == WINDOW_SNAP_LEFT) { 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Window_Snap_Left")); 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Window_Snap_Right")); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::SnapSizer::SnapWindow(window_state, 595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::SnapSizer::RIGHT_EDGE); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleWindowMinimize() { 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction( 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::UserMetricsAction("Accel_Toggle_Minimized_Minus")); 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return accelerators::ToggleMinimized(); 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_CHROMEOS) 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleAddRemoveDisplay() { 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Add_Remove_Display")); 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_manager()->AddRemoveDisplay(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleCrosh() { 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Open_Crosh")); 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->OpenCrosh(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleFileManager() { 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Open_File_Manager")); 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->new_window_delegate()->OpenFileManager(); 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleLock(ui::KeyboardCode key_code) { 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_LockScreen_L")); 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->session_state_delegate()->LockScreen(); 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleCycleUser(SessionStateDelegate::CycleUser cycle_user) { 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::SessionStateDelegate* delegate = 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::Shell::GetInstance()->session_state_delegate(); 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate->NumberOfLoggedInUsers() <= 1) 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MultiProfileUMA::RecordSwitchActiveUser( 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR); 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (cycle_user) { 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case SessionStateDelegate::CYCLE_TO_NEXT_USER: 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Switch_To_Next_User")); 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case SessionStateDelegate::CYCLE_TO_PREVIOUS_USER: 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Switch_To_Previous_User")); 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate->CycleActiveUser(cycle_user); 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleToggleMirrorMode() { 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Toggle_Mirror_Mode")); 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->display_controller()->ToggleMirrorMode(); 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleToggleSpokenFeedback() { 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Toggle_Spoken_Feedback")); 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->accessibility_delegate()-> 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ToggleSpokenFeedback(A11Y_NOTIFICATION_SHOW); 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleTouchHudClear() { 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController* controller = 670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (controller->touch_hud_debug()) { 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->touch_hud_debug()->Clear(); 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleTouchHudModeChange() { 679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController* controller = 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) internal::RootWindowController::ForTargetRootWindow(); 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (controller->touch_hud_debug()) { 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller->touch_hud_debug()->ChangeToNextMode(); 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool HandleTouchHudProjectToggle() { 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RecordAction(UserMetricsAction("Accel_Touch_Hud_Clear")); 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool enabled = Shell::GetInstance()->is_touch_hud_projection_enabled(); 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Shell::GetInstance()->SetTouchHudProjectionEnabled(!enabled); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Debug print methods. 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintLayerHierarchy() { 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < root_windows.size(); ++i) { 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::PrintLayerHierarchy( 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_windows[i]->layer(), 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_windows[i]->GetDispatcher()->GetLastMouseLocationInRoot()); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintViewHierarchy() { 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* active_window = ash::wm::GetActiveWindow(); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!active_window) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* browser_widget = 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::GetWidgetForNativeWindow(active_window); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_widget) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::PrintViewHierarchy(browser_widget->GetRootView()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintWindowHierarchy(aura::Window* window, 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream* out) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string indent_str(indent, ' '); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name(window->name()); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (name.empty()) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = "\"\""; 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << indent_str << name << " (" << window << ")" 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " type=" << window->type() 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (wm::IsActiveWindow(window) ? " [active] " : " ") 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << (window->IsVisible() ? " visible " : " ") 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << window->bounds().ToString() 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << '\n'; 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window->children().size(); ++i) 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(window->children()[i], indent + 3, out); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandlePrintWindowHierarchy() { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::RootWindowControllerList controllers = 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindowControllers(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < controllers.size(); ++i) { 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::ostringstream out; 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out << "RootWindow " << i << ":\n"; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintWindowHierarchy(controllers[i]->root_window(), 0, &out); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Error so logs can be collected from end-users. 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << out.str(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HandlePrintUIHierarchies() { 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is a separate command so the user only has to hit one key to generate 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all the logs. Developers use the individual dumps repeatedly, so keep 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // those as separate commands to avoid spamming their logs. 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintLayerHierarchy(); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintWindowHierarchy(); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HandlePrintViewHierarchy(); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorControllerContext, public: 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorControllerContext::AcceleratorControllerContext() { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_.set_type(ui::ET_UNKNOWN); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_.set_type(ui::ET_UNKNOWN); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorControllerContext::UpdateContext( 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_accelerator_ = current_accelerator_; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_accelerator_ = accelerator; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, public: 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::AcceleratorController() 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : accelerator_manager_(new ui::AcceleratorManager) { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController::~AcceleratorController() { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Init() { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLoginOrLockScreenLength; ++i) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.insert( 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert( 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kActionsAllowedAtLoginOrLockScreen[i]); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtLockScreenLength; ++i) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.insert(kActionsAllowedAtLockScreen[i]); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kActionsAllowedAtModalWindowLength; ++i) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.insert(kActionsAllowedAtModalWindow[i]); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kReservedActionsLength; ++i) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reserved_actions_.insert(kReservedActions[i]); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kNonrepeatableActionsLength; ++i) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nonrepeatable_actions_.insert(kNonrepeatableActions[i]); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kActionsAllowedInAppModeLength; ++i) 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.insert(kActionsAllowedInAppMode[i]); 806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < kActionsNeedingWindowLength; ++i) 807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) actions_needing_window_.insert(kActionsNeedingWindow[i]); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kAcceleratorData, kAcceleratorDataLength); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(NDEBUG) 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RegisterAccelerators(kDesktopAcceleratorData, kDesktopAcceleratorDataLength); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (DebugShortcutsEnabled()) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterAccelerators(kDebugAcceleratorData, kDebugAcceleratorDataLength); 81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < kReservedDebugActionsLength; ++i) 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) reserved_actions_.insert(kReservedDebugActions[i]); 81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_.reset( 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new KeyboardBrightnessController()); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Register(const ui::Accelerator& accelerator, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Register(accelerator, 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorManager::kNormalPriority, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::Unregister(const ui::Accelerator& accelerator, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::AcceleratorTarget* target) { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->Unregister(accelerator, target); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_manager_->UnregisterAll(target); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::Process(const ui::Accelerator& accelerator) { 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (ime_control_delegate_) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process( 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator)); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->Process(accelerator); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsRegistered( 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accelerator_manager_->GetCurrentTarget(accelerator) != NULL; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::IsReservedAccelerator( 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) const { 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator remapped_accelerator = ime_control_delegate_.get() ? 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ime_control_delegate_->RemapAccelerator(accelerator) : accelerator; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator iter = 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(remapped_accelerator); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == accelerators_.end()) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // not an accelerator. 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reserved_actions_.find(iter->second) != reserved_actions_.end(); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::PerformAction(int action, 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell* shell = ash::Shell::GetInstance(); 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!shell->session_state_delegate()->IsActiveUserSessionStarted() && 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.find(action) == 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_login_screen_.end()) { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shell->session_state_delegate()->IsScreenLocked() && 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.find(action) == 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_lock_screen_.end()) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->IsSystemModalWindowOpen() && 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.find(action) == 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actions_allowed_at_modal_window_.end()) { 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we return true. This indicates the shortcut is handled 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will not be passed to the modal window. This is important 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for things like Alt+Tab that would cause an undesired effect 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the modal window by cycling through its window elements. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shell->delegate()->IsRunningInForcedAppMode() && 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.find(action) == 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actions_allowed_in_app_mode_.end()) { 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (MruWindowTracker::BuildWindowList(false).empty() && 897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) actions_needing_window_.find(action) != actions_needing_window_.end()) { 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Shell::GetInstance()->accessibility_delegate()->TriggerAccessibilityAlert( 899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) A11Y_ALERT_WINDOW_NEEDED); 900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyboardCode key_code = accelerator.key_code(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PerformAction() is performed from gesture controllers and passes 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty Accelerator() instance as the second argument. Such events 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should never be suspended. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool gesture_event = key_code == ui::VKEY_UNKNOWN; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore accelerators invoked as repeated (while holding a key for a long 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time, if their handling is nonrepeatable. 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nonrepeatable_actions_.find(action) != nonrepeatable_actions_.end() && 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.repeated() && !gesture_event) { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type of the previous accelerator. Used by NEXT_IME and DISABLE_CAPS_LOCK. 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::EventType previous_event_type = 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.previous_accelerator().type(); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::KeyboardCode previous_key_code = 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_.previous_accelerator().key_code(); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You *MUST* return true when some action is performed. Otherwise, this 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function might be called *twice*, via BrowserView::PreHandleKeyboardEvent 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and BrowserView::HandleKeyboardEvent, for a single accelerator press. 92458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 92558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If your accelerator invokes more than one line of code, please either 92658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // implement it in your module's controller code (like TOGGLE_MIRROR_MODE 92758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // below) or pull it into a HandleFoo() function above. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (action) { 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_NEXT: 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(false); 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ACCESSIBLE_FOCUS_PREVIOUS: 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleAccessibleFocusCycle(true); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_BACKWARD_MRU: 934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleCycleBackwardMRU(accelerator); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CYCLE_FORWARD_MRU: 936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleCycleForwardMRU(accelerator); 93758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case CYCLE_LINEAR: 938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleCycleLinear(accelerator); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 94090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADD_REMOVE_DISPLAY: 941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleAddRemoveDisplay(); 94290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case TOGGLE_MIRROR_MODE: 943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleToggleMirrorMode(); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_SCREEN: 945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLock(key_code); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case OPEN_FILE_MANAGER: 9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return HandleFileManager(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_CROSH: 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleCrosh(); 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SILENCE_SPOKEN_FEEDBACK: 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HandleSilenceSpokenFeedback(); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWAP_PRIMARY_DISPLAY: 954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleSwapPrimaryDisplay(); 95568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SWITCH_TO_NEXT_USER: 956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleCycleUser(SessionStateDelegate::CYCLE_TO_NEXT_USER); 957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case SWITCH_TO_PREVIOUS_USER: 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleCycleUser(SessionStateDelegate::CYCLE_TO_PREVIOUS_USER); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_SPOKEN_FEEDBACK: 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleSpokenFeedback(); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_WIFI: 96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->NotifyRequestToggleWifi(); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case TOUCH_HUD_CLEAR: 965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleTouchHudClear(); 966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case TOUCH_HUD_MODE_CHANGE: 967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleTouchHudModeChange(); 968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case TOUCH_HUD_PROJECTION_TOGGLE: 969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleTouchHudProjectToggle(); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case DISABLE_GPU_WATCHDOG: 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::GpuDataManager::GetInstance()->DisableGpuWatchdog(); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_CHROMEOS 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OPEN_FEEDBACK_PAGE: 975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleOpenFeedbackPage(); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EXIT: 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // UMA metrics are recorded in the handler. 97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) exit_warning_handler_.HandleAccelerator(); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case NEW_INCOGNITO_WINDOW: 981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleNewIncognitoWindow(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_TAB: 983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleNewTab(key_code); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEW_WINDOW: 985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleNewWindow(); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RESTORE_TAB: 987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleRestoreTab(); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_SCREENSHOT: 989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleTakeScreenshot(screenshot_delegate_.get()); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TAKE_PARTIAL_SCREENSHOT: 991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleTakePartialScreenshot(screenshot_delegate_.get()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_APP_LIST: 993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleToggleAppList( 994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code, previous_event_type, previous_key_code, accelerator); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DISABLE_CAPS_LOCK: 996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleDisableCapsLock( 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code, previous_event_type, previous_key_code); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_CAPS_LOCK: 999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleToggleCapsLock( 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code, previous_event_type, previous_key_code); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_DOWN: 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessDown(accelerator); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BRIGHTNESS_UP: 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (brightness_control_delegate_) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return brightness_control_delegate_->HandleBrightnessUp(accelerator); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_DOWN: 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessDown(accelerator); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KEYBOARD_BRIGHTNESS_UP: 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard_brightness_control_delegate_) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return keyboard_brightness_control_delegate_-> 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleKeyboardBrightnessUp(accelerator); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_MUTE: { 10201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 10211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 10221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeMute(accelerator); 10231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_DOWN: { 10251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 10261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 10271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeDown(accelerator); 10281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case VOLUME_UP: { 10301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::VolumeControlDelegate* volume_delegate = 10311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) shell->system_tray_delegate()->GetVolumeControlDelegate(); 10321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return volume_delegate && volume_delegate->HandleVolumeUp(accelerator); 10331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_LAUNCHER: 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleFocusLauncher(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_NEXT_PANE: 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::FORWARD); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FOCUS_PREVIOUS_PANE: 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotatePaneFocus(Shell::BACKWARD); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_KEYBOARD_OVERLAY: 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleShowKeyboardOverlay(); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_OAK: 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleShowOak(); 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case SHOW_SYSTEM_TRAY_BUBBLE: 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleShowSystemTrayBubble(); 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case SHOW_MESSAGE_CENTER_BUBBLE: 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) HandleShowMessageCenterBubble(); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SHOW_TASK_MANAGER: 1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleShowTaskManager(); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NEXT_IME: 1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleNextIme( 1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ime_control_delegate_.get(), previous_event_type, previous_key_code); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PREVIOUS_IME: 1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandlePreviousIme(ime_control_delegate_.get(), accelerator); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PRINT_UI_HIERARCHIES: 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandlePrintUIHierarchies(); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SWITCH_IME: 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleSwitchIme(ime_control_delegate_.get(), accelerator); 1060eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_0: 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(0); 1062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_1: 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(1); 1064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_2: 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(2); 1066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_3: 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(3); 1068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_4: 1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(4); 1070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_5: 1071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(5); 1072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_6: 1073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(6); 1074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_APP_7: 1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchAppN(7); 1076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case LAUNCH_LAST_APP: 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleLaunchLastApp(); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WINDOW_SNAP_LEFT: 1079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WINDOW_SNAP_RIGHT: 1080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleWindowSnap(action); 108158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case WINDOW_MINIMIZE: 1082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleWindowMinimize(); 1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case TOGGLE_FULLSCREEN: 1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandleToggleFullscreen(key_code); 1085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case TOGGLE_MAXIMIZED: 10868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) accelerators::ToggleMaximized(); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case WINDOW_POSITION_CENTER: 1089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HandlePositionCenter(); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_UP: 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(true /* up */); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SCALE_UI_DOWN: 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleScaleUI(false /* down */); 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SCALE_UI_RESET: 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return HandleScaleReset(); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ROTATE_WINDOW: 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HandleRotateActiveWindow(); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ROTATE_SCREEN: 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleRotateScreen(); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_DESKTOP_BACKGROUND_MODE: 110168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return debug::CycleDesktopBackgroundMode(); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOGGLE_ROOT_WINDOW_FULL_SCREEN: 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleToggleRootWindowFullScreen(); 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_DEVICE_SCALE_FACTOR: 110590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell::GetInstance()->display_manager()->ToggleDisplayScaleFactor(); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS: 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowDebugBorders(); 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_FPS_COUNTER: 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowFpsCounter(); 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case DEBUG_TOGGLE_SHOW_PAINT_RECTS: 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::debug::ToggleShowPaintRects(); 1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_IN: 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(1); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MAGNIFY_SCREEN_ZOOM_OUT: 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMagnifyScreen(-1); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_NEXT_TRACK: 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaNextTrack(); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PLAY_PAUSE: 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPlayPause(); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MEDIA_PREV_TRACK: 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandleMediaPrevTrack(); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_PRESSED: // fallthrough 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case POWER_RELEASED: 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 11294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!base::SysInfo::IsRunningOnChromeOS()) { 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no powerd in linux desktop, so call the 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PowerButtonController here. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPowerButtonEvent(action == POWER_PRESSED, base::TimeTicks()); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't do anything with these at present on the device, 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (power button events are reported to us from powerm via 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // D-BUS), but we consume them to prevent them from getting 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to apps -- see http://crbug.com/146609. 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_PRESSED: 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOCK_RELEASED: 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->power_button_controller()-> 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnLockButtonEvent(action == LOCK_PRESSED, base::TimeTicks()); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_LAYER_HIERARCHY: 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintLayerHierarchy(); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_VIEW_HIERARCHY: 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintViewHierarchy(); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PRINT_WINDOW_HIERARCHY: 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HandlePrintWindowHierarchy(); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unhandled action " << action; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetBrightnessControlDelegate( 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install brightness control delegate only when internal 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display exists. 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Shell::GetInstance()->display_manager()->HasInternalDisplay() || 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch( 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kAshEnableBrightnessControl)) { 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness_control_delegate_ = brightness_control_delegate.Pass(); 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetImeControlDelegate( 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ImeControlDelegate> ime_control_delegate) { 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ime_control_delegate_ = ime_control_delegate.Pass(); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetScreenshotDelegate( 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScreenshotDelegate> screenshot_delegate) { 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screenshot_delegate_ = screenshot_delegate.Pass(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AcceleratorController, ui::AcceleratorTarget implementation: 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::AcceleratorPressed( 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<ui::Accelerator, int>::const_iterator it = 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.find(accelerator); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != accelerators_.end()); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PerformAction(static_cast<AcceleratorAction>(it->second), accelerator); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::RegisterAccelerators( 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AcceleratorData accelerators[], 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t accelerators_length) { 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < accelerators_length; ++i) { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator accelerator(accelerators[i].keycode, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators[i].modifiers); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator.set_type(accelerators[i].trigger_on_press ? 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Register(accelerator, this); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerators_.insert( 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair(accelerator, accelerators[i].action)); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AcceleratorController::SetKeyboardBrightnessControlDelegate( 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<KeyboardBrightnessControlDelegate> 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate) { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate_ = 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyboard_brightness_control_delegate.Pass(); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorController::CanHandleAccelerators() const { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1216