Chromium Code Reviews| Index: ash/accelerators/accelerator_controller_delegate_aura.cc |
| diff --git a/ash/accelerators/accelerator_controller_delegate_aura.cc b/ash/accelerators/accelerator_controller_delegate_aura.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d6d57608213b1ce6541e8efd337c4ce61bdbccb8 |
| --- /dev/null |
| +++ b/ash/accelerators/accelerator_controller_delegate_aura.cc |
| @@ -0,0 +1,708 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ash/accelerators/accelerator_controller_delegate_aura.h" |
| + |
| +#include <algorithm> |
| +#include <cmath> |
| +#include <string> |
| +#include <utility> |
| + |
| +#include "ash/accelerators/accelerator_commands_aura.h" |
| +#include "ash/common/accessibility_delegate.h" |
| +#include "ash/common/accessibility_types.h" |
| +#include "ash/common/ash_switches.h" |
| +#include "ash/common/focus_cycler.h" |
| +#include "ash/common/gpu_support.h" |
| +#include "ash/common/session/session_state_delegate.h" |
| +#include "ash/common/shell_delegate.h" |
| +#include "ash/common/shell_window_ids.h" |
| +#include "ash/common/system/status_area_widget.h" |
| +#include "ash/common/system/system_notifier.h" |
| +#include "ash/common/system/tray/system_tray.h" |
| +#include "ash/common/system/web_notification/web_notification_tray.h" |
| +#include "ash/common/wm/maximize_mode/maximize_mode_controller.h" |
| +#include "ash/common/wm/window_state.h" |
| +#include "ash/common/wm/wm_event.h" |
| +#include "ash/common/wm_shell.h" |
| +#include "ash/debug.h" |
| +#include "ash/display/window_tree_host_manager.h" |
| +#include "ash/magnifier/magnification_controller.h" |
| +#include "ash/magnifier/partial_magnification_controller.h" |
| +#include "ash/new_window_delegate.h" |
| +#include "ash/root_window_controller.h" |
| +#include "ash/rotator/screen_rotation_animator.h" |
| +#include "ash/rotator/window_rotation.h" |
| +#include "ash/screen_util.h" |
| +#include "ash/screenshot_delegate.h" |
| +#include "ash/shelf/shelf.h" |
| +#include "ash/shelf/shelf_widget.h" |
| +#include "ash/shell.h" |
| +#include "ash/touch/touch_hud_debug.h" |
| +#include "ash/utility/screenshot_controller.h" |
| +#include "ash/wm/power_button_controller.h" |
| +#include "ash/wm/window_state_aura.h" |
| +#include "ash/wm/window_util.h" |
| +#include "base/metrics/histogram_macros.h" |
| +#include "base/metrics/user_metrics.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "ui/base/accelerators/accelerator.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| +#include "ui/compositor/layer.h" |
| +#include "ui/compositor/layer_animation_sequence.h" |
| +#include "ui/compositor/layer_animator.h" |
| +#include "ui/display/screen.h" |
| +#include "ui/events/event.h" |
| +#include "ui/events/keycodes/keyboard_codes.h" |
| +#include "ui/message_center/message_center.h" |
| +#include "ui/message_center/notification.h" |
| +#include "ui/message_center/notifier_settings.h" |
| + |
| +#if defined(OS_CHROMEOS) |
| +#include "ash/display/display_configuration_controller.h" |
| +#include "base/sys_info.h" |
| +#endif // defined(OS_CHROMEOS) |
| + |
| +namespace ash { |
| +namespace { |
| + |
| +using base::UserMetricsAction; |
| + |
| +// The notification delegate that will be used to open the keyboard shortcut |
| +// help page when the notification is clicked. |
| +class DeprecatedAcceleratorNotificationDelegate |
| + : public message_center::NotificationDelegate { |
| + public: |
| + DeprecatedAcceleratorNotificationDelegate() {} |
| + |
| + // message_center::NotificationDelegate: |
| + bool HasClickedListener() override { return true; } |
| + |
| + void Click() override { |
| + if (!WmShell::Get()->GetSessionStateDelegate()->IsUserSessionBlocked()) |
| + WmShell::Get()->delegate()->OpenKeyboardShortcutHelpPage(); |
| + } |
| + |
| + private: |
| + // Private destructor since NotificationDelegate is ref-counted. |
| + ~DeprecatedAcceleratorNotificationDelegate() override {} |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DeprecatedAcceleratorNotificationDelegate); |
| +}; |
| + |
| +// Ensures that there are no word breaks at the "+"s in the shortcut texts such |
| +// as "Ctrl+Shift+Space". |
| +void EnsureNoWordBreaks(base::string16* shortcut_text) { |
| + std::vector<base::string16> keys = |
| + base::SplitString(*shortcut_text, base::ASCIIToUTF16("+"), |
| + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| + |
| + if (keys.size() < 2U) |
| + return; |
| + |
| + // The plus sign surrounded by the word joiner to guarantee an non-breaking |
| + // shortcut. |
| + const base::string16 non_breaking_plus = |
| + base::UTF8ToUTF16("\xe2\x81\xa0+\xe2\x81\xa0"); |
| + shortcut_text->clear(); |
| + for (size_t i = 0; i < keys.size() - 1; ++i) { |
| + *shortcut_text += keys[i]; |
| + *shortcut_text += non_breaking_plus; |
| + } |
| + |
| + *shortcut_text += keys.back(); |
| +} |
| + |
| +// Gets the notification message after it formats it in such a way that there |
| +// are no line breaks in the middle of the shortcut texts. |
| +base::string16 GetNotificationText(int message_id, |
| + int old_shortcut_id, |
| + int new_shortcut_id) { |
| + base::string16 old_shortcut = l10n_util::GetStringUTF16(old_shortcut_id); |
| + base::string16 new_shortcut = l10n_util::GetStringUTF16(new_shortcut_id); |
| + EnsureNoWordBreaks(&old_shortcut); |
| + EnsureNoWordBreaks(&new_shortcut); |
| + |
| + return l10n_util::GetStringFUTF16(message_id, new_shortcut, old_shortcut); |
| +} |
| + |
| +void HandleFocusShelf() { |
| + base::RecordAction(base::UserMetricsAction("Accel_Focus_Shelf")); |
|
James Cook
2016/07/20 16:08:04
nit: base:: not needed, here and below
sky
2016/07/20 16:42:50
Done.
|
| + WmShell::Get()->focus_cycler()->FocusWidget( |
| + Shelf::ForPrimaryDisplay()->shelf_widget()); |
| +} |
| + |
| +void HandleLaunchAppN(int n) { |
| + base::RecordAction(UserMetricsAction("Accel_Launch_App")); |
| + Shelf::ForPrimaryDisplay()->LaunchAppIndexAt(n); |
| +} |
| + |
| +void HandleLaunchLastApp() { |
| + base::RecordAction(UserMetricsAction("Accel_Launch_Last_App")); |
| + Shelf::ForPrimaryDisplay()->LaunchAppIndexAt(-1); |
| +} |
| + |
| +bool CanHandleMagnifyScreen() { |
| + Shell* shell = Shell::GetInstance(); |
| + return shell->magnification_controller()->IsEnabled() || |
| + shell->partial_magnification_controller()->is_enabled(); |
| +} |
| + |
| +// Magnify the screen |
| +void HandleMagnifyScreen(int delta_index) { |
| + if (Shell::GetInstance()->magnification_controller()->IsEnabled()) { |
| + // TODO(yoshiki): Move the following logic to MagnificationController. |
| + float scale = Shell::GetInstance()->magnification_controller()->GetScale(); |
| + // Calculate rounded logarithm (base kMagnificationScaleFactor) of scale. |
| + int scale_index = |
| + std::floor(std::log(scale) / std::log(kMagnificationScaleFactor) + 0.5); |
| + |
| + int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); |
| + |
| + Shell::GetInstance()->magnification_controller()->SetScale( |
| + std::pow(kMagnificationScaleFactor, new_scale_index), true); |
| + } else if (Shell::GetInstance() |
| + ->partial_magnification_controller() |
| + ->is_enabled()) { |
| + float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; |
| + Shell::GetInstance()->partial_magnification_controller()->SetScale(scale); |
| + } |
| +} |
| + |
| +bool CanHandleNewIncognitoWindow() { |
| + return WmShell::Get()->delegate()->IsIncognitoAllowed(); |
| +} |
| + |
| +void HandleNewIncognitoWindow() { |
| + base::RecordAction(UserMetricsAction("Accel_New_Incognito_Window")); |
| + Shell::GetInstance()->new_window_delegate()->NewWindow( |
|
James Cook
2016/07/20 16:08:04
NewWindowDelegate has no aura dependencies. What d
sky
2016/07/20 16:42:50
I did see that NewWindowDelegate has no aura depen
James Cook
2016/07/20 17:11:56
This is OK for now, but having AppDriver know the
|
| + true /* is_incognito */); |
| +} |
| + |
| +void HandleNewTab(const ui::Accelerator& accelerator) { |
| + if (accelerator.key_code() == ui::VKEY_T) |
| + base::RecordAction(base::UserMetricsAction("Accel_NewTab_T")); |
| + Shell::GetInstance()->new_window_delegate()->NewTab(); |
| +} |
| + |
| +void HandleNewWindow() { |
| + base::RecordAction(base::UserMetricsAction("Accel_New_Window")); |
| + Shell::GetInstance()->new_window_delegate()->NewWindow( |
| + false /* is_incognito */); |
| +} |
| + |
| +void HandleOpenFeedbackPage() { |
| + base::RecordAction(UserMetricsAction("Accel_Open_Feedback_Page")); |
| + Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); |
| +} |
| + |
| +void HandleRestoreTab() { |
| + base::RecordAction(base::UserMetricsAction("Accel_Restore_Tab")); |
| + Shell::GetInstance()->new_window_delegate()->RestoreTab(); |
| +} |
| + |
| +display::Display::Rotation GetNextRotation(display::Display::Rotation current) { |
| + switch (current) { |
| + case display::Display::ROTATE_0: |
| + return display::Display::ROTATE_90; |
| + case display::Display::ROTATE_90: |
| + return display::Display::ROTATE_180; |
| + case display::Display::ROTATE_180: |
| + return display::Display::ROTATE_270; |
| + case display::Display::ROTATE_270: |
| + return display::Display::ROTATE_0; |
| + } |
| + NOTREACHED() << "Unknown rotation:" << current; |
| + return display::Display::ROTATE_0; |
| +} |
| + |
| +// Rotates the screen. |
| +void HandleRotateScreen() { |
| + if (Shell::GetInstance()->display_manager()->IsInUnifiedMode()) |
| + return; |
| + |
| + base::RecordAction(UserMetricsAction("Accel_Rotate_Window")); |
| + gfx::Point point = display::Screen::GetScreen()->GetCursorScreenPoint(); |
| + display::Display display = |
| + display::Screen::GetScreen()->GetDisplayNearestPoint(point); |
| + const DisplayInfo& display_info = |
| + Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); |
| + ScreenRotationAnimator(display.id()) |
| + .Rotate(GetNextRotation(display_info.GetActiveRotation()), |
| + display::Display::ROTATION_SOURCE_USER); |
| +} |
| + |
| +// Rotate the active window. |
| +void HandleRotateActiveWindow() { |
| + base::RecordAction(UserMetricsAction("Accel_Rotate_Window")); |
| + aura::Window* active_window = wm::GetActiveWindow(); |
| + if (active_window) { |
| + // The rotation animation bases its target transform on the current |
| + // rotation and position. Since there could be an animation in progress |
| + // right now, queue this animation so when it starts it picks up a neutral |
| + // rotation and position. Use replace so we only enqueue one at a time. |
| + active_window->layer()->GetAnimator()->set_preemption_strategy( |
| + ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); |
| + active_window->layer()->GetAnimator()->StartAnimation( |
| + new ui::LayerAnimationSequence( |
| + new WindowRotation(360, active_window->layer()))); |
| + } |
| +} |
| + |
| +void HandleShowKeyboardOverlay() { |
| + base::RecordAction(UserMetricsAction("Accel_Show_Keyboard_Overlay")); |
| + Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); |
| +} |
| + |
| +bool CanHandleShowMessageCenterBubble() { |
| + RootWindowController* controller = |
| + RootWindowController::ForTargetRootWindow(); |
| + StatusAreaWidget* status_area_widget = |
| + controller->shelf_widget()->status_area_widget(); |
| + return status_area_widget && |
| + status_area_widget->web_notification_tray()->visible(); |
| +} |
| + |
| +void HandleShowMessageCenterBubble() { |
| + base::RecordAction(UserMetricsAction("Accel_Show_Message_Center_Bubble")); |
| + RootWindowController* controller = |
| + RootWindowController::ForTargetRootWindow(); |
| + StatusAreaWidget* status_area_widget = |
| + controller->shelf_widget()->status_area_widget(); |
| + if (status_area_widget) { |
| + WebNotificationTray* notification_tray = |
| + status_area_widget->web_notification_tray(); |
| + if (notification_tray->visible()) |
| + notification_tray->ShowMessageCenterBubble(); |
| + } |
| +} |
| + |
| +void HandleShowSystemTrayBubble() { |
|
James Cook
2016/07/20 16:08:04
How urgent is it to move all these status area / s
sky
2016/07/20 16:42:50
I would like to land this soon so I can complete t
James Cook
2016/07/20 17:11:56
OK. I'll CC you on the bugs for the applist and sy
|
| + base::RecordAction(UserMetricsAction("Accel_Show_System_Tray_Bubble")); |
| + RootWindowController* controller = |
| + RootWindowController::ForTargetRootWindow(); |
| + if (!controller->GetSystemTray()->HasSystemBubble()) |
| + controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); |
| +} |
| + |
| +void HandleShowTaskManager() { |
| + base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager")); |
| + Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); |
| +} |
| + |
| +void HandleTakeWindowScreenshot(ScreenshotDelegate* screenshot_delegate) { |
| + base::RecordAction(UserMetricsAction("Accel_Take_Window_Screenshot")); |
| + DCHECK(screenshot_delegate); |
| + Shell::GetInstance()->screenshot_controller()->StartWindowScreenshotSession( |
| + screenshot_delegate); |
| +} |
| + |
| +void HandleTakePartialScreenshot(ScreenshotDelegate* screenshot_delegate) { |
| + base::RecordAction(UserMetricsAction("Accel_Take_Partial_Screenshot")); |
| + DCHECK(screenshot_delegate); |
| + Shell::GetInstance()->screenshot_controller()->StartPartialScreenshotSession( |
| + screenshot_delegate); |
| +} |
| + |
| +void HandleTakeScreenshot(ScreenshotDelegate* screenshot_delegate) { |
| + base::RecordAction(UserMetricsAction("Accel_Take_Screenshot")); |
| + DCHECK(screenshot_delegate); |
| + if (screenshot_delegate->CanTakeScreenshot()) |
| + screenshot_delegate->HandleTakeScreenshotForAllRootWindows(); |
| +} |
| + |
| +bool CanHandleToggleAppList(const ui::Accelerator& accelerator, |
| + const ui::Accelerator& previous_accelerator) { |
| + if (accelerator.key_code() == ui::VKEY_LWIN) { |
| + // If something else was pressed between the Search key (LWIN) |
| + // being pressed and released, then ignore the release of the |
| + // Search key. |
| + if (previous_accelerator.type() != ui::ET_KEY_PRESSED || |
| + previous_accelerator.key_code() != ui::VKEY_LWIN) { |
| + return false; |
| + } |
| + |
| + // When spoken feedback is enabled, we should neither toggle the list nor |
| + // consume the key since Search+Shift is one of the shortcuts the a11y |
| + // feature uses. crbug.com/132296 |
| + if (WmShell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled()) |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +void HandleToggleAppList(const ui::Accelerator& accelerator) { |
| + if (accelerator.key_code() == ui::VKEY_LWIN) |
| + base::RecordAction(base::UserMetricsAction("Accel_Search_LWin")); |
| + Shell::GetInstance()->ToggleAppList(nullptr); |
|
James Cook
2016/07/20 16:08:04
If it can wait, I have a CL that will go out for r
sky
2016/07/20 16:42:50
Similar comment to above.
|
| +} |
| + |
| +bool CanHandleUnpin() { |
| + wm::WindowState* window_state = wm::GetActiveWindowState(); |
| + return window_state && window_state->IsPinned(); |
| +} |
| + |
| +#if defined(OS_CHROMEOS) |
| +void HandleCrosh() { |
| + base::RecordAction(UserMetricsAction("Accel_Open_Crosh")); |
| + |
| + Shell::GetInstance()->new_window_delegate()->OpenCrosh(); |
| +} |
| + |
| +void HandleFileManager() { |
| + base::RecordAction(UserMetricsAction("Accel_Open_File_Manager")); |
| + |
| + Shell::GetInstance()->new_window_delegate()->OpenFileManager(); |
| +} |
| + |
| +void HandleGetHelp() { |
| + Shell::GetInstance()->new_window_delegate()->OpenGetHelp(); |
| +} |
| + |
| +void HandleSwapPrimaryDisplay() { |
| + base::RecordAction(UserMetricsAction("Accel_Swap_Primary_Display")); |
| + Shell::GetInstance()->display_configuration_controller()->SetPrimaryDisplayId( |
| + ScreenUtil::GetSecondaryDisplay().id(), true /* user_action */); |
| +} |
| + |
| +void HandleToggleMirrorMode() { |
| + base::RecordAction(UserMetricsAction("Accel_Toggle_Mirror_Mode")); |
| + bool mirror = !Shell::GetInstance()->display_manager()->IsInMirrorMode(); |
| + Shell::GetInstance()->display_configuration_controller()->SetMirrorMode( |
| + mirror, true /* user_action */); |
| +} |
| + |
| +bool CanHandleTouchHud() { |
| + return RootWindowController::ForTargetRootWindow()->touch_hud_debug(); |
| +} |
| + |
| +void HandleTouchHudClear() { |
| + RootWindowController::ForTargetRootWindow()->touch_hud_debug()->Clear(); |
| +} |
| + |
| +void HandleTouchHudModeChange() { |
| + RootWindowController* controller = |
| + RootWindowController::ForTargetRootWindow(); |
| + controller->touch_hud_debug()->ChangeToNextMode(); |
| +} |
| + |
| +#endif // defined(OS_CHROMEOS) |
| + |
| +} // namespace |
| + |
| +AcceleratorControllerDelegateAura::AcceleratorControllerDelegateAura() {} |
| + |
| +AcceleratorControllerDelegateAura::~AcceleratorControllerDelegateAura() {} |
| + |
| +void AcceleratorControllerDelegateAura::SetScreenshotDelegate( |
| + std::unique_ptr<ScreenshotDelegate> screenshot_delegate) { |
| + screenshot_delegate_ = std::move(screenshot_delegate); |
| +} |
| + |
| +bool AcceleratorControllerDelegateAura::HandlesAction( |
| + AcceleratorAction action) { |
| + switch (action) { |
| + case FOCUS_SHELF: |
| + case LAUNCH_APP_0: |
| + case LAUNCH_APP_1: |
| + case LAUNCH_APP_2: |
| + case LAUNCH_APP_3: |
| + case LAUNCH_APP_4: |
| + case LAUNCH_APP_5: |
| + case LAUNCH_APP_6: |
| + case LAUNCH_APP_7: |
| + case LAUNCH_LAST_APP: |
| + case MAGNIFY_SCREEN_ZOOM_IN: |
| + case MAGNIFY_SCREEN_ZOOM_OUT: |
| + case NEW_INCOGNITO_WINDOW: |
| + case NEW_TAB: |
| + case NEW_WINDOW: |
| + case OPEN_FEEDBACK_PAGE: |
| + case RESTORE_TAB: |
| + case ROTATE_SCREEN: |
| + case ROTATE_WINDOW: |
| + case SCALE_UI_DOWN: |
| + case SCALE_UI_RESET: |
| + case SCALE_UI_UP: |
| + case SHOW_KEYBOARD_OVERLAY: |
| + case SHOW_MESSAGE_CENTER_BUBBLE: |
| + case SHOW_SYSTEM_TRAY_BUBBLE: |
| + case SHOW_TASK_MANAGER: |
| + case TAKE_PARTIAL_SCREENSHOT: |
| + case TAKE_SCREENSHOT: |
| + case TAKE_WINDOW_SCREENSHOT: |
| + case TOGGLE_APP_LIST: |
| + case UNPIN: |
| + return true; |
| + |
| +#if defined(OS_CHROMEOS) |
| + case DISABLE_GPU_WATCHDOG: |
| + case LOCK_PRESSED: |
| + case LOCK_RELEASED: |
| + case OPEN_CROSH: |
| + case OPEN_FILE_MANAGER: |
| + case OPEN_GET_HELP: |
| + case POWER_PRESSED: |
| + case POWER_RELEASED: |
| + case SWAP_PRIMARY_DISPLAY: |
| + case TOGGLE_MIRROR_MODE: |
| + case TOUCH_HUD_CLEAR: |
| + case TOUCH_HUD_MODE_CHANGE: |
| + case TOUCH_HUD_PROJECTION_TOGGLE: |
| + return true; |
| +#endif |
| + |
| + default: |
| + break; |
| + } |
| + return false; |
| +} |
| + |
| +bool AcceleratorControllerDelegateAura::CanPerformAction( |
| + AcceleratorAction action, |
| + const ui::Accelerator& accelerator, |
| + const ui::Accelerator& previous_accelerator) { |
| + switch (action) { |
| + case MAGNIFY_SCREEN_ZOOM_IN: |
| + case MAGNIFY_SCREEN_ZOOM_OUT: |
| + return CanHandleMagnifyScreen(); |
| + case NEW_INCOGNITO_WINDOW: |
| + return CanHandleNewIncognitoWindow(); |
| + case SCALE_UI_DOWN: |
| + case SCALE_UI_RESET: |
| + case SCALE_UI_UP: |
| + return accelerators::IsInternalDisplayZoomEnabled(); |
| + case SHOW_MESSAGE_CENTER_BUBBLE: |
| + return CanHandleShowMessageCenterBubble(); |
| + case TOGGLE_APP_LIST: |
| + return CanHandleToggleAppList(accelerator, previous_accelerator); |
| + case UNPIN: |
| + return CanHandleUnpin(); |
| + |
| + // Following are always enabled: |
| + case FOCUS_SHELF: |
| + case LAUNCH_APP_0: |
| + case LAUNCH_APP_1: |
| + case LAUNCH_APP_2: |
| + case LAUNCH_APP_3: |
| + case LAUNCH_APP_4: |
| + case LAUNCH_APP_5: |
| + case LAUNCH_APP_6: |
| + case LAUNCH_APP_7: |
| + case LAUNCH_LAST_APP: |
| + case NEW_TAB: |
| + case NEW_WINDOW: |
| + case OPEN_FEEDBACK_PAGE: |
| + case RESTORE_TAB: |
| + case ROTATE_SCREEN: |
| + case ROTATE_WINDOW: |
| + case SHOW_KEYBOARD_OVERLAY: |
| + case SHOW_SYSTEM_TRAY_BUBBLE: |
| + case SHOW_TASK_MANAGER: |
| + case TAKE_PARTIAL_SCREENSHOT: |
| + case TAKE_SCREENSHOT: |
| + case TAKE_WINDOW_SCREENSHOT: |
| + return true; |
| + |
| +#if defined(OS_CHROMEOS) |
| + case SWAP_PRIMARY_DISPLAY: |
| + return display::Screen::GetScreen()->GetNumDisplays() > 1; |
| + case TOUCH_HUD_CLEAR: |
| + case TOUCH_HUD_MODE_CHANGE: |
| + return CanHandleTouchHud(); |
| + |
| + // Following are always enabled. |
| + case DISABLE_GPU_WATCHDOG: |
| + case LOCK_PRESSED: |
| + case LOCK_RELEASED: |
| + case OPEN_CROSH: |
| + case OPEN_FILE_MANAGER: |
| + case OPEN_GET_HELP: |
| + case POWER_PRESSED: |
| + case POWER_RELEASED: |
| + case TOGGLE_MIRROR_MODE: |
| + case TOUCH_HUD_PROJECTION_TOGGLE: |
| + return true; |
| +#endif |
| + |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| + return false; |
| +} |
| + |
| +void AcceleratorControllerDelegateAura::PerformAction( |
| + AcceleratorAction action, |
| + const ui::Accelerator& accelerator) { |
| + switch (action) { |
| + case FOCUS_SHELF: |
| + HandleFocusShelf(); |
| + break; |
| + case LAUNCH_APP_0: |
| + HandleLaunchAppN(0); |
| + break; |
| + case LAUNCH_APP_1: |
| + HandleLaunchAppN(1); |
| + break; |
| + case LAUNCH_APP_2: |
| + HandleLaunchAppN(2); |
| + break; |
| + case LAUNCH_APP_3: |
| + HandleLaunchAppN(3); |
| + break; |
| + case LAUNCH_APP_4: |
| + HandleLaunchAppN(4); |
| + break; |
| + case LAUNCH_APP_5: |
| + HandleLaunchAppN(5); |
| + break; |
| + case LAUNCH_APP_6: |
| + HandleLaunchAppN(6); |
| + break; |
| + case LAUNCH_APP_7: |
| + HandleLaunchAppN(7); |
| + break; |
| + case LAUNCH_LAST_APP: |
| + HandleLaunchLastApp(); |
| + break; |
| + case MAGNIFY_SCREEN_ZOOM_IN: |
| + HandleMagnifyScreen(1); |
| + break; |
| + case MAGNIFY_SCREEN_ZOOM_OUT: |
| + HandleMagnifyScreen(-1); |
| + break; |
| + case NEW_INCOGNITO_WINDOW: |
| + HandleNewIncognitoWindow(); |
| + break; |
| + case NEW_TAB: |
| + HandleNewTab(accelerator); |
| + break; |
| + case NEW_WINDOW: |
| + HandleNewWindow(); |
| + break; |
| + case OPEN_FEEDBACK_PAGE: |
| + HandleOpenFeedbackPage(); |
| + break; |
| + case RESTORE_TAB: |
| + HandleRestoreTab(); |
| + break; |
| + case ROTATE_SCREEN: |
| + HandleRotateScreen(); |
| + break; |
| + case ROTATE_WINDOW: |
| + HandleRotateActiveWindow(); |
| + break; |
| + case SCALE_UI_DOWN: |
| + accelerators::ZoomInternalDisplay(false /* down */); |
| + break; |
| + case SCALE_UI_RESET: |
| + accelerators::ResetInternalDisplayZoom(); |
| + break; |
| + case SCALE_UI_UP: |
| + accelerators::ZoomInternalDisplay(true /* up */); |
| + break; |
| + case SHOW_KEYBOARD_OVERLAY: |
| + HandleShowKeyboardOverlay(); |
| + break; |
| + case SHOW_MESSAGE_CENTER_BUBBLE: |
| + HandleShowMessageCenterBubble(); |
| + break; |
| + case SHOW_SYSTEM_TRAY_BUBBLE: |
| + HandleShowSystemTrayBubble(); |
| + break; |
| + case SHOW_TASK_MANAGER: |
| + HandleShowTaskManager(); |
| + break; |
| + case TAKE_PARTIAL_SCREENSHOT: |
| + HandleTakePartialScreenshot(screenshot_delegate_.get()); |
| + break; |
| + case TAKE_SCREENSHOT: |
| + HandleTakeScreenshot(screenshot_delegate_.get()); |
| + break; |
| + case TAKE_WINDOW_SCREENSHOT: |
| + HandleTakeWindowScreenshot(screenshot_delegate_.get()); |
| + break; |
| + case TOGGLE_APP_LIST: |
| + HandleToggleAppList(accelerator); |
| + break; |
| + case UNPIN: |
| + accelerators::Unpin(); |
| + break; |
| +#if defined(OS_CHROMEOS) |
| + case DISABLE_GPU_WATCHDOG: |
| + Shell::GetInstance()->gpu_support()->DisableGpuWatchdog(); |
| + break; |
| + case LOCK_PRESSED: |
| + case LOCK_RELEASED: |
| + Shell::GetInstance()->power_button_controller()->OnLockButtonEvent( |
| + action == LOCK_PRESSED, base::TimeTicks()); |
| + break; |
| + case OPEN_CROSH: |
| + HandleCrosh(); |
| + break; |
| + case OPEN_FILE_MANAGER: |
| + HandleFileManager(); |
| + break; |
| + case OPEN_GET_HELP: |
| + HandleGetHelp(); |
| + break; |
| + case POWER_PRESSED: // fallthrough |
| + case POWER_RELEASED: |
| + if (!base::SysInfo::IsRunningOnChromeOS()) { |
| + // There is no powerd, the Chrome OS power manager, in linux desktop, |
| + // so call the PowerButtonController here. |
| + Shell::GetInstance()->power_button_controller()->OnPowerButtonEvent( |
| + action == POWER_PRESSED, base::TimeTicks()); |
| + } |
| + // We don't do anything with these at present on the device, |
| + // (power button events are reported to us from powerm via |
| + // D-BUS), but we consume them to prevent them from getting |
| + // passed to apps -- see http://crbug.com/146609. |
| + break; |
| + case SWAP_PRIMARY_DISPLAY: |
| + HandleSwapPrimaryDisplay(); |
| + break; |
| + case TOGGLE_MIRROR_MODE: |
| + HandleToggleMirrorMode(); |
| + break; |
| + case TOUCH_HUD_CLEAR: |
| + HandleTouchHudClear(); |
| + break; |
| + case TOUCH_HUD_MODE_CHANGE: |
| + HandleTouchHudModeChange(); |
| + break; |
| + case TOUCH_HUD_PROJECTION_TOGGLE: |
| + accelerators::ToggleTouchHudProjection(); |
| + break; |
| +#endif |
| + default: |
| + break; |
| + } |
| +} |
| + |
| +void AcceleratorControllerDelegateAura::ShowDeprecatedAcceleratorNotification( |
| + const char* const notification_id, |
| + int message_id, |
| + int old_shortcut_id, |
| + int new_shortcut_id) { |
| + const base::string16 message = |
| + GetNotificationText(message_id, old_shortcut_id, new_shortcut_id); |
| + std::unique_ptr<message_center::Notification> notification( |
| + new message_center::Notification( |
| + message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, |
| + base::string16(), message, |
| + WmShell::Get()->delegate()->GetDeprecatedAcceleratorImage(), |
| + base::string16(), GURL(), |
| + message_center::NotifierId( |
| + message_center::NotifierId::SYSTEM_COMPONENT, |
| + system_notifier::kNotifierDeprecatedAccelerator), |
| + message_center::RichNotificationData(), |
| + new DeprecatedAcceleratorNotificationDelegate)); |
| + message_center::MessageCenter::Get()->AddNotification( |
| + std::move(notification)); |
| +} |
| + |
| +} // namespace ash |