Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ash/accelerators/accelerator_controller_delegate_aura.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 #include <cmath> | |
| 9 #include <string> | |
| 10 #include <utility> | |
| 11 | |
| 12 #include "ash/accelerators/accelerator_commands_aura.h" | |
| 13 #include "ash/common/accessibility_delegate.h" | |
| 14 #include "ash/common/accessibility_types.h" | |
| 15 #include "ash/common/ash_switches.h" | |
| 16 #include "ash/common/focus_cycler.h" | |
| 17 #include "ash/common/gpu_support.h" | |
| 18 #include "ash/common/session/session_state_delegate.h" | |
| 19 #include "ash/common/shell_delegate.h" | |
| 20 #include "ash/common/shell_window_ids.h" | |
| 21 #include "ash/common/system/status_area_widget.h" | |
| 22 #include "ash/common/system/system_notifier.h" | |
| 23 #include "ash/common/system/tray/system_tray.h" | |
| 24 #include "ash/common/system/web_notification/web_notification_tray.h" | |
| 25 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" | |
| 26 #include "ash/common/wm/window_state.h" | |
| 27 #include "ash/common/wm/wm_event.h" | |
| 28 #include "ash/common/wm_shell.h" | |
| 29 #include "ash/debug.h" | |
| 30 #include "ash/display/window_tree_host_manager.h" | |
| 31 #include "ash/magnifier/magnification_controller.h" | |
| 32 #include "ash/magnifier/partial_magnification_controller.h" | |
| 33 #include "ash/new_window_delegate.h" | |
| 34 #include "ash/root_window_controller.h" | |
| 35 #include "ash/rotator/screen_rotation_animator.h" | |
| 36 #include "ash/rotator/window_rotation.h" | |
| 37 #include "ash/screen_util.h" | |
| 38 #include "ash/screenshot_delegate.h" | |
| 39 #include "ash/shelf/shelf.h" | |
| 40 #include "ash/shelf/shelf_widget.h" | |
| 41 #include "ash/shell.h" | |
| 42 #include "ash/touch/touch_hud_debug.h" | |
| 43 #include "ash/utility/screenshot_controller.h" | |
| 44 #include "ash/wm/power_button_controller.h" | |
| 45 #include "ash/wm/window_state_aura.h" | |
| 46 #include "ash/wm/window_util.h" | |
| 47 #include "base/metrics/histogram_macros.h" | |
| 48 #include "base/metrics/user_metrics.h" | |
| 49 #include "base/strings/string_split.h" | |
| 50 #include "base/strings/utf_string_conversions.h" | |
| 51 #include "ui/base/accelerators/accelerator.h" | |
| 52 #include "ui/base/l10n/l10n_util.h" | |
| 53 #include "ui/compositor/layer.h" | |
| 54 #include "ui/compositor/layer_animation_sequence.h" | |
| 55 #include "ui/compositor/layer_animator.h" | |
| 56 #include "ui/display/screen.h" | |
| 57 #include "ui/events/event.h" | |
| 58 #include "ui/events/keycodes/keyboard_codes.h" | |
| 59 #include "ui/message_center/message_center.h" | |
| 60 #include "ui/message_center/notification.h" | |
| 61 #include "ui/message_center/notifier_settings.h" | |
| 62 | |
| 63 #if defined(OS_CHROMEOS) | |
| 64 #include "ash/display/display_configuration_controller.h" | |
| 65 #include "base/sys_info.h" | |
| 66 #endif // defined(OS_CHROMEOS) | |
| 67 | |
| 68 namespace ash { | |
| 69 namespace { | |
| 70 | |
| 71 using base::UserMetricsAction; | |
| 72 | |
| 73 // The notification delegate that will be used to open the keyboard shortcut | |
| 74 // help page when the notification is clicked. | |
| 75 class DeprecatedAcceleratorNotificationDelegate | |
| 76 : public message_center::NotificationDelegate { | |
| 77 public: | |
| 78 DeprecatedAcceleratorNotificationDelegate() {} | |
| 79 | |
| 80 // message_center::NotificationDelegate: | |
| 81 bool HasClickedListener() override { return true; } | |
| 82 | |
| 83 void Click() override { | |
| 84 if (!WmShell::Get()->GetSessionStateDelegate()->IsUserSessionBlocked()) | |
| 85 WmShell::Get()->delegate()->OpenKeyboardShortcutHelpPage(); | |
| 86 } | |
| 87 | |
| 88 private: | |
| 89 // Private destructor since NotificationDelegate is ref-counted. | |
| 90 ~DeprecatedAcceleratorNotificationDelegate() override {} | |
| 91 | |
| 92 DISALLOW_COPY_AND_ASSIGN(DeprecatedAcceleratorNotificationDelegate); | |
| 93 }; | |
| 94 | |
| 95 // Ensures that there are no word breaks at the "+"s in the shortcut texts such | |
| 96 // as "Ctrl+Shift+Space". | |
| 97 void EnsureNoWordBreaks(base::string16* shortcut_text) { | |
| 98 std::vector<base::string16> keys = | |
| 99 base::SplitString(*shortcut_text, base::ASCIIToUTF16("+"), | |
| 100 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | |
| 101 | |
| 102 if (keys.size() < 2U) | |
| 103 return; | |
| 104 | |
| 105 // The plus sign surrounded by the word joiner to guarantee an non-breaking | |
| 106 // shortcut. | |
| 107 const base::string16 non_breaking_plus = | |
| 108 base::UTF8ToUTF16("\xe2\x81\xa0+\xe2\x81\xa0"); | |
| 109 shortcut_text->clear(); | |
| 110 for (size_t i = 0; i < keys.size() - 1; ++i) { | |
| 111 *shortcut_text += keys[i]; | |
| 112 *shortcut_text += non_breaking_plus; | |
| 113 } | |
| 114 | |
| 115 *shortcut_text += keys.back(); | |
| 116 } | |
| 117 | |
| 118 // Gets the notification message after it formats it in such a way that there | |
| 119 // are no line breaks in the middle of the shortcut texts. | |
| 120 base::string16 GetNotificationText(int message_id, | |
| 121 int old_shortcut_id, | |
| 122 int new_shortcut_id) { | |
| 123 base::string16 old_shortcut = l10n_util::GetStringUTF16(old_shortcut_id); | |
| 124 base::string16 new_shortcut = l10n_util::GetStringUTF16(new_shortcut_id); | |
| 125 EnsureNoWordBreaks(&old_shortcut); | |
| 126 EnsureNoWordBreaks(&new_shortcut); | |
| 127 | |
| 128 return l10n_util::GetStringFUTF16(message_id, new_shortcut, old_shortcut); | |
| 129 } | |
| 130 | |
| 131 void HandleFocusShelf() { | |
| 132 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.
| |
| 133 WmShell::Get()->focus_cycler()->FocusWidget( | |
| 134 Shelf::ForPrimaryDisplay()->shelf_widget()); | |
| 135 } | |
| 136 | |
| 137 void HandleLaunchAppN(int n) { | |
| 138 base::RecordAction(UserMetricsAction("Accel_Launch_App")); | |
| 139 Shelf::ForPrimaryDisplay()->LaunchAppIndexAt(n); | |
| 140 } | |
| 141 | |
| 142 void HandleLaunchLastApp() { | |
| 143 base::RecordAction(UserMetricsAction("Accel_Launch_Last_App")); | |
| 144 Shelf::ForPrimaryDisplay()->LaunchAppIndexAt(-1); | |
| 145 } | |
| 146 | |
| 147 bool CanHandleMagnifyScreen() { | |
| 148 Shell* shell = Shell::GetInstance(); | |
| 149 return shell->magnification_controller()->IsEnabled() || | |
| 150 shell->partial_magnification_controller()->is_enabled(); | |
| 151 } | |
| 152 | |
| 153 // Magnify the screen | |
| 154 void HandleMagnifyScreen(int delta_index) { | |
| 155 if (Shell::GetInstance()->magnification_controller()->IsEnabled()) { | |
| 156 // TODO(yoshiki): Move the following logic to MagnificationController. | |
| 157 float scale = Shell::GetInstance()->magnification_controller()->GetScale(); | |
| 158 // Calculate rounded logarithm (base kMagnificationScaleFactor) of scale. | |
| 159 int scale_index = | |
| 160 std::floor(std::log(scale) / std::log(kMagnificationScaleFactor) + 0.5); | |
| 161 | |
| 162 int new_scale_index = std::max(0, std::min(8, scale_index + delta_index)); | |
| 163 | |
| 164 Shell::GetInstance()->magnification_controller()->SetScale( | |
| 165 std::pow(kMagnificationScaleFactor, new_scale_index), true); | |
| 166 } else if (Shell::GetInstance() | |
| 167 ->partial_magnification_controller() | |
| 168 ->is_enabled()) { | |
| 169 float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; | |
| 170 Shell::GetInstance()->partial_magnification_controller()->SetScale(scale); | |
| 171 } | |
| 172 } | |
| 173 | |
| 174 bool CanHandleNewIncognitoWindow() { | |
| 175 return WmShell::Get()->delegate()->IsIncognitoAllowed(); | |
| 176 } | |
| 177 | |
| 178 void HandleNewIncognitoWindow() { | |
| 179 base::RecordAction(UserMetricsAction("Accel_New_Incognito_Window")); | |
| 180 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
| |
| 181 true /* is_incognito */); | |
| 182 } | |
| 183 | |
| 184 void HandleNewTab(const ui::Accelerator& accelerator) { | |
| 185 if (accelerator.key_code() == ui::VKEY_T) | |
| 186 base::RecordAction(base::UserMetricsAction("Accel_NewTab_T")); | |
| 187 Shell::GetInstance()->new_window_delegate()->NewTab(); | |
| 188 } | |
| 189 | |
| 190 void HandleNewWindow() { | |
| 191 base::RecordAction(base::UserMetricsAction("Accel_New_Window")); | |
| 192 Shell::GetInstance()->new_window_delegate()->NewWindow( | |
| 193 false /* is_incognito */); | |
| 194 } | |
| 195 | |
| 196 void HandleOpenFeedbackPage() { | |
| 197 base::RecordAction(UserMetricsAction("Accel_Open_Feedback_Page")); | |
| 198 Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); | |
| 199 } | |
| 200 | |
| 201 void HandleRestoreTab() { | |
| 202 base::RecordAction(base::UserMetricsAction("Accel_Restore_Tab")); | |
| 203 Shell::GetInstance()->new_window_delegate()->RestoreTab(); | |
| 204 } | |
| 205 | |
| 206 display::Display::Rotation GetNextRotation(display::Display::Rotation current) { | |
| 207 switch (current) { | |
| 208 case display::Display::ROTATE_0: | |
| 209 return display::Display::ROTATE_90; | |
| 210 case display::Display::ROTATE_90: | |
| 211 return display::Display::ROTATE_180; | |
| 212 case display::Display::ROTATE_180: | |
| 213 return display::Display::ROTATE_270; | |
| 214 case display::Display::ROTATE_270: | |
| 215 return display::Display::ROTATE_0; | |
| 216 } | |
| 217 NOTREACHED() << "Unknown rotation:" << current; | |
| 218 return display::Display::ROTATE_0; | |
| 219 } | |
| 220 | |
| 221 // Rotates the screen. | |
| 222 void HandleRotateScreen() { | |
| 223 if (Shell::GetInstance()->display_manager()->IsInUnifiedMode()) | |
| 224 return; | |
| 225 | |
| 226 base::RecordAction(UserMetricsAction("Accel_Rotate_Window")); | |
| 227 gfx::Point point = display::Screen::GetScreen()->GetCursorScreenPoint(); | |
| 228 display::Display display = | |
| 229 display::Screen::GetScreen()->GetDisplayNearestPoint(point); | |
| 230 const DisplayInfo& display_info = | |
| 231 Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); | |
| 232 ScreenRotationAnimator(display.id()) | |
| 233 .Rotate(GetNextRotation(display_info.GetActiveRotation()), | |
| 234 display::Display::ROTATION_SOURCE_USER); | |
| 235 } | |
| 236 | |
| 237 // Rotate the active window. | |
| 238 void HandleRotateActiveWindow() { | |
| 239 base::RecordAction(UserMetricsAction("Accel_Rotate_Window")); | |
| 240 aura::Window* active_window = wm::GetActiveWindow(); | |
| 241 if (active_window) { | |
| 242 // The rotation animation bases its target transform on the current | |
| 243 // rotation and position. Since there could be an animation in progress | |
| 244 // right now, queue this animation so when it starts it picks up a neutral | |
| 245 // rotation and position. Use replace so we only enqueue one at a time. | |
| 246 active_window->layer()->GetAnimator()->set_preemption_strategy( | |
| 247 ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); | |
| 248 active_window->layer()->GetAnimator()->StartAnimation( | |
| 249 new ui::LayerAnimationSequence( | |
| 250 new WindowRotation(360, active_window->layer()))); | |
| 251 } | |
| 252 } | |
| 253 | |
| 254 void HandleShowKeyboardOverlay() { | |
| 255 base::RecordAction(UserMetricsAction("Accel_Show_Keyboard_Overlay")); | |
| 256 Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); | |
| 257 } | |
| 258 | |
| 259 bool CanHandleShowMessageCenterBubble() { | |
| 260 RootWindowController* controller = | |
| 261 RootWindowController::ForTargetRootWindow(); | |
| 262 StatusAreaWidget* status_area_widget = | |
| 263 controller->shelf_widget()->status_area_widget(); | |
| 264 return status_area_widget && | |
| 265 status_area_widget->web_notification_tray()->visible(); | |
| 266 } | |
| 267 | |
| 268 void HandleShowMessageCenterBubble() { | |
| 269 base::RecordAction(UserMetricsAction("Accel_Show_Message_Center_Bubble")); | |
| 270 RootWindowController* controller = | |
| 271 RootWindowController::ForTargetRootWindow(); | |
| 272 StatusAreaWidget* status_area_widget = | |
| 273 controller->shelf_widget()->status_area_widget(); | |
| 274 if (status_area_widget) { | |
| 275 WebNotificationTray* notification_tray = | |
| 276 status_area_widget->web_notification_tray(); | |
| 277 if (notification_tray->visible()) | |
| 278 notification_tray->ShowMessageCenterBubble(); | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 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
| |
| 283 base::RecordAction(UserMetricsAction("Accel_Show_System_Tray_Bubble")); | |
| 284 RootWindowController* controller = | |
| 285 RootWindowController::ForTargetRootWindow(); | |
| 286 if (!controller->GetSystemTray()->HasSystemBubble()) | |
| 287 controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); | |
| 288 } | |
| 289 | |
| 290 void HandleShowTaskManager() { | |
| 291 base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager")); | |
| 292 Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); | |
| 293 } | |
| 294 | |
| 295 void HandleTakeWindowScreenshot(ScreenshotDelegate* screenshot_delegate) { | |
| 296 base::RecordAction(UserMetricsAction("Accel_Take_Window_Screenshot")); | |
| 297 DCHECK(screenshot_delegate); | |
| 298 Shell::GetInstance()->screenshot_controller()->StartWindowScreenshotSession( | |
| 299 screenshot_delegate); | |
| 300 } | |
| 301 | |
| 302 void HandleTakePartialScreenshot(ScreenshotDelegate* screenshot_delegate) { | |
| 303 base::RecordAction(UserMetricsAction("Accel_Take_Partial_Screenshot")); | |
| 304 DCHECK(screenshot_delegate); | |
| 305 Shell::GetInstance()->screenshot_controller()->StartPartialScreenshotSession( | |
| 306 screenshot_delegate); | |
| 307 } | |
| 308 | |
| 309 void HandleTakeScreenshot(ScreenshotDelegate* screenshot_delegate) { | |
| 310 base::RecordAction(UserMetricsAction("Accel_Take_Screenshot")); | |
| 311 DCHECK(screenshot_delegate); | |
| 312 if (screenshot_delegate->CanTakeScreenshot()) | |
| 313 screenshot_delegate->HandleTakeScreenshotForAllRootWindows(); | |
| 314 } | |
| 315 | |
| 316 bool CanHandleToggleAppList(const ui::Accelerator& accelerator, | |
| 317 const ui::Accelerator& previous_accelerator) { | |
| 318 if (accelerator.key_code() == ui::VKEY_LWIN) { | |
| 319 // If something else was pressed between the Search key (LWIN) | |
| 320 // being pressed and released, then ignore the release of the | |
| 321 // Search key. | |
| 322 if (previous_accelerator.type() != ui::ET_KEY_PRESSED || | |
| 323 previous_accelerator.key_code() != ui::VKEY_LWIN) { | |
| 324 return false; | |
| 325 } | |
| 326 | |
| 327 // When spoken feedback is enabled, we should neither toggle the list nor | |
| 328 // consume the key since Search+Shift is one of the shortcuts the a11y | |
| 329 // feature uses. crbug.com/132296 | |
| 330 if (WmShell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled()) | |
| 331 return false; | |
| 332 } | |
| 333 return true; | |
| 334 } | |
| 335 | |
| 336 void HandleToggleAppList(const ui::Accelerator& accelerator) { | |
| 337 if (accelerator.key_code() == ui::VKEY_LWIN) | |
| 338 base::RecordAction(base::UserMetricsAction("Accel_Search_LWin")); | |
| 339 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.
| |
| 340 } | |
| 341 | |
| 342 bool CanHandleUnpin() { | |
| 343 wm::WindowState* window_state = wm::GetActiveWindowState(); | |
| 344 return window_state && window_state->IsPinned(); | |
| 345 } | |
| 346 | |
| 347 #if defined(OS_CHROMEOS) | |
| 348 void HandleCrosh() { | |
| 349 base::RecordAction(UserMetricsAction("Accel_Open_Crosh")); | |
| 350 | |
| 351 Shell::GetInstance()->new_window_delegate()->OpenCrosh(); | |
| 352 } | |
| 353 | |
| 354 void HandleFileManager() { | |
| 355 base::RecordAction(UserMetricsAction("Accel_Open_File_Manager")); | |
| 356 | |
| 357 Shell::GetInstance()->new_window_delegate()->OpenFileManager(); | |
| 358 } | |
| 359 | |
| 360 void HandleGetHelp() { | |
| 361 Shell::GetInstance()->new_window_delegate()->OpenGetHelp(); | |
| 362 } | |
| 363 | |
| 364 void HandleSwapPrimaryDisplay() { | |
| 365 base::RecordAction(UserMetricsAction("Accel_Swap_Primary_Display")); | |
| 366 Shell::GetInstance()->display_configuration_controller()->SetPrimaryDisplayId( | |
| 367 ScreenUtil::GetSecondaryDisplay().id(), true /* user_action */); | |
| 368 } | |
| 369 | |
| 370 void HandleToggleMirrorMode() { | |
| 371 base::RecordAction(UserMetricsAction("Accel_Toggle_Mirror_Mode")); | |
| 372 bool mirror = !Shell::GetInstance()->display_manager()->IsInMirrorMode(); | |
| 373 Shell::GetInstance()->display_configuration_controller()->SetMirrorMode( | |
| 374 mirror, true /* user_action */); | |
| 375 } | |
| 376 | |
| 377 bool CanHandleTouchHud() { | |
| 378 return RootWindowController::ForTargetRootWindow()->touch_hud_debug(); | |
| 379 } | |
| 380 | |
| 381 void HandleTouchHudClear() { | |
| 382 RootWindowController::ForTargetRootWindow()->touch_hud_debug()->Clear(); | |
| 383 } | |
| 384 | |
| 385 void HandleTouchHudModeChange() { | |
| 386 RootWindowController* controller = | |
| 387 RootWindowController::ForTargetRootWindow(); | |
| 388 controller->touch_hud_debug()->ChangeToNextMode(); | |
| 389 } | |
| 390 | |
| 391 #endif // defined(OS_CHROMEOS) | |
| 392 | |
| 393 } // namespace | |
| 394 | |
| 395 AcceleratorControllerDelegateAura::AcceleratorControllerDelegateAura() {} | |
| 396 | |
| 397 AcceleratorControllerDelegateAura::~AcceleratorControllerDelegateAura() {} | |
| 398 | |
| 399 void AcceleratorControllerDelegateAura::SetScreenshotDelegate( | |
| 400 std::unique_ptr<ScreenshotDelegate> screenshot_delegate) { | |
| 401 screenshot_delegate_ = std::move(screenshot_delegate); | |
| 402 } | |
| 403 | |
| 404 bool AcceleratorControllerDelegateAura::HandlesAction( | |
| 405 AcceleratorAction action) { | |
| 406 switch (action) { | |
| 407 case FOCUS_SHELF: | |
| 408 case LAUNCH_APP_0: | |
| 409 case LAUNCH_APP_1: | |
| 410 case LAUNCH_APP_2: | |
| 411 case LAUNCH_APP_3: | |
| 412 case LAUNCH_APP_4: | |
| 413 case LAUNCH_APP_5: | |
| 414 case LAUNCH_APP_6: | |
| 415 case LAUNCH_APP_7: | |
| 416 case LAUNCH_LAST_APP: | |
| 417 case MAGNIFY_SCREEN_ZOOM_IN: | |
| 418 case MAGNIFY_SCREEN_ZOOM_OUT: | |
| 419 case NEW_INCOGNITO_WINDOW: | |
| 420 case NEW_TAB: | |
| 421 case NEW_WINDOW: | |
| 422 case OPEN_FEEDBACK_PAGE: | |
| 423 case RESTORE_TAB: | |
| 424 case ROTATE_SCREEN: | |
| 425 case ROTATE_WINDOW: | |
| 426 case SCALE_UI_DOWN: | |
| 427 case SCALE_UI_RESET: | |
| 428 case SCALE_UI_UP: | |
| 429 case SHOW_KEYBOARD_OVERLAY: | |
| 430 case SHOW_MESSAGE_CENTER_BUBBLE: | |
| 431 case SHOW_SYSTEM_TRAY_BUBBLE: | |
| 432 case SHOW_TASK_MANAGER: | |
| 433 case TAKE_PARTIAL_SCREENSHOT: | |
| 434 case TAKE_SCREENSHOT: | |
| 435 case TAKE_WINDOW_SCREENSHOT: | |
| 436 case TOGGLE_APP_LIST: | |
| 437 case UNPIN: | |
| 438 return true; | |
| 439 | |
| 440 #if defined(OS_CHROMEOS) | |
| 441 case DISABLE_GPU_WATCHDOG: | |
| 442 case LOCK_PRESSED: | |
| 443 case LOCK_RELEASED: | |
| 444 case OPEN_CROSH: | |
| 445 case OPEN_FILE_MANAGER: | |
| 446 case OPEN_GET_HELP: | |
| 447 case POWER_PRESSED: | |
| 448 case POWER_RELEASED: | |
| 449 case SWAP_PRIMARY_DISPLAY: | |
| 450 case TOGGLE_MIRROR_MODE: | |
| 451 case TOUCH_HUD_CLEAR: | |
| 452 case TOUCH_HUD_MODE_CHANGE: | |
| 453 case TOUCH_HUD_PROJECTION_TOGGLE: | |
| 454 return true; | |
| 455 #endif | |
| 456 | |
| 457 default: | |
| 458 break; | |
| 459 } | |
| 460 return false; | |
| 461 } | |
| 462 | |
| 463 bool AcceleratorControllerDelegateAura::CanPerformAction( | |
| 464 AcceleratorAction action, | |
| 465 const ui::Accelerator& accelerator, | |
| 466 const ui::Accelerator& previous_accelerator) { | |
| 467 switch (action) { | |
| 468 case MAGNIFY_SCREEN_ZOOM_IN: | |
| 469 case MAGNIFY_SCREEN_ZOOM_OUT: | |
| 470 return CanHandleMagnifyScreen(); | |
| 471 case NEW_INCOGNITO_WINDOW: | |
| 472 return CanHandleNewIncognitoWindow(); | |
| 473 case SCALE_UI_DOWN: | |
| 474 case SCALE_UI_RESET: | |
| 475 case SCALE_UI_UP: | |
| 476 return accelerators::IsInternalDisplayZoomEnabled(); | |
| 477 case SHOW_MESSAGE_CENTER_BUBBLE: | |
| 478 return CanHandleShowMessageCenterBubble(); | |
| 479 case TOGGLE_APP_LIST: | |
| 480 return CanHandleToggleAppList(accelerator, previous_accelerator); | |
| 481 case UNPIN: | |
| 482 return CanHandleUnpin(); | |
| 483 | |
| 484 // Following are always enabled: | |
| 485 case FOCUS_SHELF: | |
| 486 case LAUNCH_APP_0: | |
| 487 case LAUNCH_APP_1: | |
| 488 case LAUNCH_APP_2: | |
| 489 case LAUNCH_APP_3: | |
| 490 case LAUNCH_APP_4: | |
| 491 case LAUNCH_APP_5: | |
| 492 case LAUNCH_APP_6: | |
| 493 case LAUNCH_APP_7: | |
| 494 case LAUNCH_LAST_APP: | |
| 495 case NEW_TAB: | |
| 496 case NEW_WINDOW: | |
| 497 case OPEN_FEEDBACK_PAGE: | |
| 498 case RESTORE_TAB: | |
| 499 case ROTATE_SCREEN: | |
| 500 case ROTATE_WINDOW: | |
| 501 case SHOW_KEYBOARD_OVERLAY: | |
| 502 case SHOW_SYSTEM_TRAY_BUBBLE: | |
| 503 case SHOW_TASK_MANAGER: | |
| 504 case TAKE_PARTIAL_SCREENSHOT: | |
| 505 case TAKE_SCREENSHOT: | |
| 506 case TAKE_WINDOW_SCREENSHOT: | |
| 507 return true; | |
| 508 | |
| 509 #if defined(OS_CHROMEOS) | |
| 510 case SWAP_PRIMARY_DISPLAY: | |
| 511 return display::Screen::GetScreen()->GetNumDisplays() > 1; | |
| 512 case TOUCH_HUD_CLEAR: | |
| 513 case TOUCH_HUD_MODE_CHANGE: | |
| 514 return CanHandleTouchHud(); | |
| 515 | |
| 516 // Following are always enabled. | |
| 517 case DISABLE_GPU_WATCHDOG: | |
| 518 case LOCK_PRESSED: | |
| 519 case LOCK_RELEASED: | |
| 520 case OPEN_CROSH: | |
| 521 case OPEN_FILE_MANAGER: | |
| 522 case OPEN_GET_HELP: | |
| 523 case POWER_PRESSED: | |
| 524 case POWER_RELEASED: | |
| 525 case TOGGLE_MIRROR_MODE: | |
| 526 case TOUCH_HUD_PROJECTION_TOGGLE: | |
| 527 return true; | |
| 528 #endif | |
| 529 | |
| 530 default: | |
| 531 NOTREACHED(); | |
| 532 break; | |
| 533 } | |
| 534 return false; | |
| 535 } | |
| 536 | |
| 537 void AcceleratorControllerDelegateAura::PerformAction( | |
| 538 AcceleratorAction action, | |
| 539 const ui::Accelerator& accelerator) { | |
| 540 switch (action) { | |
| 541 case FOCUS_SHELF: | |
| 542 HandleFocusShelf(); | |
| 543 break; | |
| 544 case LAUNCH_APP_0: | |
| 545 HandleLaunchAppN(0); | |
| 546 break; | |
| 547 case LAUNCH_APP_1: | |
| 548 HandleLaunchAppN(1); | |
| 549 break; | |
| 550 case LAUNCH_APP_2: | |
| 551 HandleLaunchAppN(2); | |
| 552 break; | |
| 553 case LAUNCH_APP_3: | |
| 554 HandleLaunchAppN(3); | |
| 555 break; | |
| 556 case LAUNCH_APP_4: | |
| 557 HandleLaunchAppN(4); | |
| 558 break; | |
| 559 case LAUNCH_APP_5: | |
| 560 HandleLaunchAppN(5); | |
| 561 break; | |
| 562 case LAUNCH_APP_6: | |
| 563 HandleLaunchAppN(6); | |
| 564 break; | |
| 565 case LAUNCH_APP_7: | |
| 566 HandleLaunchAppN(7); | |
| 567 break; | |
| 568 case LAUNCH_LAST_APP: | |
| 569 HandleLaunchLastApp(); | |
| 570 break; | |
| 571 case MAGNIFY_SCREEN_ZOOM_IN: | |
| 572 HandleMagnifyScreen(1); | |
| 573 break; | |
| 574 case MAGNIFY_SCREEN_ZOOM_OUT: | |
| 575 HandleMagnifyScreen(-1); | |
| 576 break; | |
| 577 case NEW_INCOGNITO_WINDOW: | |
| 578 HandleNewIncognitoWindow(); | |
| 579 break; | |
| 580 case NEW_TAB: | |
| 581 HandleNewTab(accelerator); | |
| 582 break; | |
| 583 case NEW_WINDOW: | |
| 584 HandleNewWindow(); | |
| 585 break; | |
| 586 case OPEN_FEEDBACK_PAGE: | |
| 587 HandleOpenFeedbackPage(); | |
| 588 break; | |
| 589 case RESTORE_TAB: | |
| 590 HandleRestoreTab(); | |
| 591 break; | |
| 592 case ROTATE_SCREEN: | |
| 593 HandleRotateScreen(); | |
| 594 break; | |
| 595 case ROTATE_WINDOW: | |
| 596 HandleRotateActiveWindow(); | |
| 597 break; | |
| 598 case SCALE_UI_DOWN: | |
| 599 accelerators::ZoomInternalDisplay(false /* down */); | |
| 600 break; | |
| 601 case SCALE_UI_RESET: | |
| 602 accelerators::ResetInternalDisplayZoom(); | |
| 603 break; | |
| 604 case SCALE_UI_UP: | |
| 605 accelerators::ZoomInternalDisplay(true /* up */); | |
| 606 break; | |
| 607 case SHOW_KEYBOARD_OVERLAY: | |
| 608 HandleShowKeyboardOverlay(); | |
| 609 break; | |
| 610 case SHOW_MESSAGE_CENTER_BUBBLE: | |
| 611 HandleShowMessageCenterBubble(); | |
| 612 break; | |
| 613 case SHOW_SYSTEM_TRAY_BUBBLE: | |
| 614 HandleShowSystemTrayBubble(); | |
| 615 break; | |
| 616 case SHOW_TASK_MANAGER: | |
| 617 HandleShowTaskManager(); | |
| 618 break; | |
| 619 case TAKE_PARTIAL_SCREENSHOT: | |
| 620 HandleTakePartialScreenshot(screenshot_delegate_.get()); | |
| 621 break; | |
| 622 case TAKE_SCREENSHOT: | |
| 623 HandleTakeScreenshot(screenshot_delegate_.get()); | |
| 624 break; | |
| 625 case TAKE_WINDOW_SCREENSHOT: | |
| 626 HandleTakeWindowScreenshot(screenshot_delegate_.get()); | |
| 627 break; | |
| 628 case TOGGLE_APP_LIST: | |
| 629 HandleToggleAppList(accelerator); | |
| 630 break; | |
| 631 case UNPIN: | |
| 632 accelerators::Unpin(); | |
| 633 break; | |
| 634 #if defined(OS_CHROMEOS) | |
| 635 case DISABLE_GPU_WATCHDOG: | |
| 636 Shell::GetInstance()->gpu_support()->DisableGpuWatchdog(); | |
| 637 break; | |
| 638 case LOCK_PRESSED: | |
| 639 case LOCK_RELEASED: | |
| 640 Shell::GetInstance()->power_button_controller()->OnLockButtonEvent( | |
| 641 action == LOCK_PRESSED, base::TimeTicks()); | |
| 642 break; | |
| 643 case OPEN_CROSH: | |
| 644 HandleCrosh(); | |
| 645 break; | |
| 646 case OPEN_FILE_MANAGER: | |
| 647 HandleFileManager(); | |
| 648 break; | |
| 649 case OPEN_GET_HELP: | |
| 650 HandleGetHelp(); | |
| 651 break; | |
| 652 case POWER_PRESSED: // fallthrough | |
| 653 case POWER_RELEASED: | |
| 654 if (!base::SysInfo::IsRunningOnChromeOS()) { | |
| 655 // There is no powerd, the Chrome OS power manager, in linux desktop, | |
| 656 // so call the PowerButtonController here. | |
| 657 Shell::GetInstance()->power_button_controller()->OnPowerButtonEvent( | |
| 658 action == POWER_PRESSED, base::TimeTicks()); | |
| 659 } | |
| 660 // We don't do anything with these at present on the device, | |
| 661 // (power button events are reported to us from powerm via | |
| 662 // D-BUS), but we consume them to prevent them from getting | |
| 663 // passed to apps -- see http://crbug.com/146609. | |
| 664 break; | |
| 665 case SWAP_PRIMARY_DISPLAY: | |
| 666 HandleSwapPrimaryDisplay(); | |
| 667 break; | |
| 668 case TOGGLE_MIRROR_MODE: | |
| 669 HandleToggleMirrorMode(); | |
| 670 break; | |
| 671 case TOUCH_HUD_CLEAR: | |
| 672 HandleTouchHudClear(); | |
| 673 break; | |
| 674 case TOUCH_HUD_MODE_CHANGE: | |
| 675 HandleTouchHudModeChange(); | |
| 676 break; | |
| 677 case TOUCH_HUD_PROJECTION_TOGGLE: | |
| 678 accelerators::ToggleTouchHudProjection(); | |
| 679 break; | |
| 680 #endif | |
| 681 default: | |
| 682 break; | |
| 683 } | |
| 684 } | |
| 685 | |
| 686 void AcceleratorControllerDelegateAura::ShowDeprecatedAcceleratorNotification( | |
| 687 const char* const notification_id, | |
| 688 int message_id, | |
| 689 int old_shortcut_id, | |
| 690 int new_shortcut_id) { | |
| 691 const base::string16 message = | |
| 692 GetNotificationText(message_id, old_shortcut_id, new_shortcut_id); | |
| 693 std::unique_ptr<message_center::Notification> notification( | |
| 694 new message_center::Notification( | |
| 695 message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, | |
| 696 base::string16(), message, | |
| 697 WmShell::Get()->delegate()->GetDeprecatedAcceleratorImage(), | |
| 698 base::string16(), GURL(), | |
| 699 message_center::NotifierId( | |
| 700 message_center::NotifierId::SYSTEM_COMPONENT, | |
| 701 system_notifier::kNotifierDeprecatedAccelerator), | |
| 702 message_center::RichNotificationData(), | |
| 703 new DeprecatedAcceleratorNotificationDelegate)); | |
| 704 message_center::MessageCenter::Get()->AddNotification( | |
| 705 std::move(notification)); | |
| 706 } | |
| 707 | |
| 708 } // namespace ash | |
| OLD | NEW |