Index: ash/accelerators/accelerator_controller.cc |
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc |
index d9c2d7955d7b7d08e781c02df72d9c3b00e1c70d..80e80e3cc8b5e573b9a5898adaf8c1d66d8fad43 100644 |
--- a/ash/accelerators/accelerator_controller.cc |
+++ b/ash/accelerators/accelerator_controller.cc |
@@ -92,7 +92,40 @@ bool DebugShortcutsEnabled() { |
#endif |
} |
-void HandleCycleBackwardMRU(const ui::Accelerator& accelerator) { |
+bool HandleAccessibleFocusCycle(bool reverse) { |
+ if (reverse) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Accessible_Focus_Previous")); |
+ } else { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Accessible_Focus_Next")); |
+ } |
+ |
+ if (!Shell::GetInstance()->accessibility_delegate()-> |
+ IsSpokenFeedbackEnabled()) { |
+ return false; |
+ } |
+ aura::Window* active_window = ash::wm::GetActiveWindow(); |
+ if (!active_window) |
+ return false; |
+ views::Widget* widget = |
+ views::Widget::GetWidgetForNativeWindow(active_window); |
+ if (!widget) |
+ return false; |
+ views::FocusManager* focus_manager = widget->GetFocusManager(); |
+ if (!focus_manager) |
+ return false; |
+ views::View* view = focus_manager->GetFocusedView(); |
+ if (!view) |
+ return false; |
+ if (!strcmp(view->GetClassName(), views::WebView::kViewClassName)) |
+ return false; |
+ |
+ focus_manager->AdvanceFocus(reverse); |
+ return true; |
+} |
+ |
+bool HandleCycleBackwardMRU(const ui::Accelerator& accelerator) { |
Shell* shell = Shell::GetInstance(); |
if (accelerator.key_code() == ui::VKEY_TAB) |
@@ -101,13 +134,14 @@ void HandleCycleBackwardMRU(const ui::Accelerator& accelerator) { |
if (switches::UseOverviewMode()) { |
shell->window_selector_controller()->HandleCycleWindow( |
WindowSelector::BACKWARD); |
- return; |
+ return true; |
} |
shell->window_cycle_controller()->HandleCycleWindow( |
WindowCycleController::BACKWARD, accelerator.IsAltDown()); |
+ return true; |
} |
-void HandleCycleForwardMRU(const ui::Accelerator& accelerator) { |
+bool HandleCycleForwardMRU(const ui::Accelerator& accelerator) { |
Shell* shell = Shell::GetInstance(); |
if (accelerator.key_code() == ui::VKEY_TAB) |
@@ -116,13 +150,14 @@ void HandleCycleForwardMRU(const ui::Accelerator& accelerator) { |
if (switches::UseOverviewMode()) { |
shell->window_selector_controller()->HandleCycleWindow( |
WindowSelector::FORWARD); |
- return; |
+ return true; |
} |
shell->window_cycle_controller()->HandleCycleWindow( |
WindowCycleController::FORWARD, accelerator.IsAltDown()); |
+ return true; |
} |
-void HandleCycleLinear(const ui::Accelerator& accelerator) { |
+bool HandleCycleLinear(const ui::Accelerator& accelerator) { |
Shell* shell = Shell::GetInstance(); |
// TODO(jamescook): When overview becomes the default the AcceleratorAction |
@@ -130,98 +165,206 @@ void HandleCycleLinear(const ui::Accelerator& accelerator) { |
if (switches::UseOverviewMode()) { |
content::RecordAction(content::UserMetricsAction("Accel_Overview_F5")); |
shell->window_selector_controller()->ToggleOverview(); |
- return; |
+ return true; |
} |
if (accelerator.key_code() == ui::VKEY_MEDIA_LAUNCH_APP1) |
content::RecordAction(content::UserMetricsAction("Accel_NextWindow_F5")); |
shell->window_cycle_controller()->HandleLinearCycleWindow(); |
+ return true; |
} |
-bool HandleAccessibleFocusCycle(bool reverse) { |
- if (!Shell::GetInstance()->accessibility_delegate()-> |
- IsSpokenFeedbackEnabled()) { |
+bool HandleDisableCapsLock(ui::KeyboardCode key_code, |
+ ui::EventType previous_event_type, |
+ ui::KeyboardCode previous_key_code) { |
+ Shell* shell = Shell::GetInstance(); |
+ |
+ if (previous_event_type == ui::ET_KEY_RELEASED || |
+ (previous_key_code != ui::VKEY_LSHIFT && |
+ previous_key_code != ui::VKEY_SHIFT && |
+ previous_key_code != ui::VKEY_RSHIFT)) { |
+ // If something else was pressed between the Shift key being pressed |
+ // and released, then ignore the release of the Shift key. |
return false; |
} |
- aura::Window* active_window = ash::wm::GetActiveWindow(); |
- if (!active_window) |
- return false; |
- views::Widget* widget = |
- views::Widget::GetWidgetForNativeWindow(active_window); |
- if (!widget) |
- return false; |
- views::FocusManager* focus_manager = widget->GetFocusManager(); |
- if (!focus_manager) |
- return false; |
- views::View* view = focus_manager->GetFocusedView(); |
- if (!view) |
- return false; |
- if (!strcmp(view->GetClassName(), views::WebView::kViewClassName)) |
- return false; |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Disable_Caps_Lock")); |
+ if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { |
+ shell->caps_lock_delegate()->SetCapsLockEnabled(false); |
+ return true; |
+ } |
+ return false; |
+} |
- focus_manager->AdvanceFocus(reverse); |
+bool HandleFocusLauncher() { |
+ Shell* shell = Shell::GetInstance(); |
+ content::RecordAction(content::UserMetricsAction("Accel_Focus_Launcher")); |
+ return shell->focus_cycler()->FocusWidget( |
+ Launcher::ForPrimaryDisplay()->shelf_widget()); |
+} |
+ |
+bool HandleLaunchAppN(int n) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Launch_App")); |
+ Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(n); |
return true; |
} |
-void HandleSilenceSpokenFeedback() { |
- AccessibilityDelegate* delegate = |
- Shell::GetInstance()->accessibility_delegate(); |
- if (!delegate->IsSpokenFeedbackEnabled()) |
- return; |
- delegate->SilenceSpokenFeedback(); |
+bool HandleLaunchLastApp() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Launch_Last_App")); |
+ Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(-1); |
+ return true; |
} |
-#if defined(OS_CHROMEOS) |
-bool HandleLock() { |
- Shell::GetInstance()->session_state_delegate()->LockScreen(); |
+// Magnify the screen |
+bool HandleMagnifyScreen(int delta_index) { |
+ if (ash::Shell::GetInstance()->magnification_controller()->IsEnabled()) { |
+ // TODO(yoshiki): Move the following logic to MagnificationController. |
+ float scale = |
+ ash::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)); |
+ |
+ ash::Shell::GetInstance()->magnification_controller()-> |
+ SetScale(std::pow(kMagnificationScaleFactor, new_scale_index), true); |
+ } else if (ash::Shell::GetInstance()-> |
+ partial_magnification_controller()->is_enabled()) { |
+ float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; |
+ ash::Shell::GetInstance()->partial_magnification_controller()-> |
+ SetScale(scale); |
+ } |
+ |
return true; |
} |
-bool HandleFileManager() { |
- Shell::GetInstance()->new_window_delegate()->OpenFileManager(); |
+bool HandleMediaNextTrack() { |
+ Shell::GetInstance()->media_delegate()->HandleMediaNextTrack(); |
return true; |
} |
-bool HandleCrosh() { |
- Shell::GetInstance()->new_window_delegate()->OpenCrosh(); |
+bool HandleMediaPlayPause() { |
+ Shell::GetInstance()->media_delegate()->HandleMediaPlayPause(); |
return true; |
} |
-bool HandleToggleSpokenFeedback() { |
- Shell::GetInstance()->accessibility_delegate()-> |
- ToggleSpokenFeedback(A11Y_NOTIFICATION_SHOW); |
+bool HandleMediaPrevTrack() { |
+ Shell::GetInstance()->media_delegate()->HandleMediaPrevTrack(); |
return true; |
} |
-bool SwitchToNextUser() { |
- if (!Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) |
- return false; |
- ash::SessionStateDelegate* delegate = |
- ash::Shell::GetInstance()->session_state_delegate(); |
- if (delegate->NumberOfLoggedInUsers() <= 1) |
+bool HandleNewIncognitoWindow() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_New_Incognito_Window")); |
+ bool incognito_allowed = |
+ Shell::GetInstance()->delegate()->IsIncognitoAllowed(); |
+ if (incognito_allowed) |
+ Shell::GetInstance()->new_window_delegate()->NewWindow( |
+ true /* is_incognito */); |
+ return incognito_allowed; |
+} |
+ |
+bool HandleNewTab(ui::KeyboardCode key_code) { |
+ if (key_code == ui::VKEY_T) |
+ content::RecordAction(content::UserMetricsAction("Accel_NewTab_T")); |
+ Shell::GetInstance()->new_window_delegate()->NewTab(); |
+ return true; |
+} |
+ |
+bool HandleNewWindow() { |
+ content::RecordAction(content::UserMetricsAction("Accel_New_Window")); |
+ Shell::GetInstance()->new_window_delegate()->NewWindow( |
+ false /* is_incognito */); |
+ return true; |
+} |
+ |
+bool HandleNextIme(ImeControlDelegate* ime_control_delegate, |
+ ui::EventType previous_event_type, |
+ ui::KeyboardCode previous_key_code) { |
+ // This check is necessary e.g. not to process the Shift+Alt+ |
+ // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ |
+ // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab |
+ // is released. |
+ if (previous_event_type == ui::ET_KEY_RELEASED && |
+ // Workaround for crbug.com/139556. CJK IME users tend to press |
+ // Enter (or Space) and Shift+Alt almost at the same time to commit |
+ // an IME string and then switch from the IME to the English layout. |
+ // This workaround allows the user to trigger NEXT_IME even if the |
+ // user presses Shift+Alt before releasing Enter. |
+ // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. |
+ previous_key_code != ui::VKEY_RETURN && |
+ previous_key_code != ui::VKEY_SPACE) { |
+ // We totally ignore this accelerator. |
+ // TODO(mazda): Fix crbug.com/158217 |
return false; |
- MultiProfileUMA::RecordSwitchActiveUser( |
- MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR); |
- delegate->SwitchActiveUserToNext(); |
+ } |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Next_Ime")); |
+ if (ime_control_delegate) |
+ return ime_control_delegate->HandleNextIme(); |
+ return false; |
+} |
+ |
+bool HandleOpenFeedbackPage() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Open_Feedback_Page")); |
+ ash::Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); |
return true; |
} |
-#endif // defined(OS_CHROMEOS) |
+bool HandlePositionCenter() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Window_Position_Center")); |
+ aura::Window* window = wm::GetActiveWindow(); |
+ // Docked windows do not support centering and ignore accelerator. |
+ if (window && !wm::GetWindowState(window)->IsDocked()) { |
+ wm::CenterWindow(window); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool HandlePreviousIme(ImeControlDelegate* ime_control_delegate, |
+ const ui::Accelerator& accelerator) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Previous_Ime")); |
+ if (ime_control_delegate) |
+ return ime_control_delegate->HandlePreviousIme(accelerator); |
+ return false; |
+} |
+ |
+bool HandleRestoreTab() { |
+ content::RecordAction(content::UserMetricsAction("Accel_Restore_Tab")); |
+ Shell::GetInstance()->new_window_delegate()->RestoreTab(); |
+ return true; |
+} |
bool HandleRotatePaneFocus(Shell::Direction direction) { |
Shell* shell = Shell::GetInstance(); |
switch (direction) { |
- case Shell::FORWARD: |
+ // TODO(stevet): Not sure if this is the same as IDC_FOCUS_NEXT_PANE. |
+ case Shell::FORWARD: { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Focus_Next_Pane")); |
shell->focus_cycler()->RotateFocus(internal::FocusCycler::FORWARD); |
break; |
- case Shell::BACKWARD: |
+ } |
+ case Shell::BACKWARD: { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Focus_Previous_Pane")); |
shell->focus_cycler()->RotateFocus(internal::FocusCycler::BACKWARD); |
break; |
+ } |
} |
return true; |
} |
// Rotate the active window. |
bool HandleRotateActiveWindow() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Rotate_Window")); |
aura::Window* active_window = wm::GetActiveWindow(); |
if (active_window) { |
// The rotation animation bases its target transform on the current |
@@ -252,12 +395,48 @@ gfx::Display::Rotation GetNextRotation(gfx::Display::Rotation current) { |
return gfx::Display::ROTATE_0; |
} |
+// Rotates the screen. |
+bool HandleRotateScreen() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Rotate_Window")); |
+ gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint(); |
+ gfx::Display display = Shell::GetScreen()->GetDisplayNearestPoint(point); |
+ const DisplayInfo& display_info = |
+ Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); |
+ Shell::GetInstance()->display_manager()->SetDisplayRotation( |
+ display.id(), GetNextRotation(display_info.rotation())); |
+ return true; |
+} |
+ |
+bool HandleScaleReset() { |
+ internal::DisplayManager* display_manager = |
+ Shell::GetInstance()->display_manager(); |
+ int64 display_id = display_manager->GetDisplayIdForUIScaling(); |
+ if (display_id == gfx::Display::kInvalidDisplayID) |
+ return false; |
+ |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Scale_Ui_Reset")); |
+ |
+ display_manager->SetDisplayUIScale(display_id, 1.0f); |
+ return true; |
+} |
+ |
bool HandleScaleUI(bool up) { |
internal::DisplayManager* display_manager = |
Shell::GetInstance()->display_manager(); |
int64 display_id = display_manager->GetDisplayIdForUIScaling(); |
if (display_id == gfx::Display::kInvalidDisplayID) |
return false; |
+ |
+ if (up) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Scale_Ui_Up")); |
+ } else { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Scale_Ui_Down")); |
+ } |
+ |
const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id); |
float next_scale = |
internal::DisplayManager::GetNextUIScale(display_info, up); |
@@ -265,24 +444,156 @@ bool HandleScaleUI(bool up) { |
return true; |
} |
-bool HandleScaleReset() { |
- internal::DisplayManager* display_manager = |
- Shell::GetInstance()->display_manager(); |
- int64 display_id = display_manager->GetDisplayIdForUIScaling(); |
- if (display_id == gfx::Display::kInvalidDisplayID) |
+bool HandleSwapPrimaryDisplay() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Swap_Primary_Display")); |
+ Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); |
+ return true; |
+} |
+ |
+bool HandleShowKeyboardOverlay() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Show_Keyboard_Overlay")); |
+ ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); |
+ |
+ return true; |
+} |
+ |
+void HandleShowMessageCenterBubble() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Show_Message_Center_Bubble")); |
+ internal::RootWindowController* controller = |
+ internal::RootWindowController::ForTargetRootWindow(); |
+ internal::StatusAreaWidget* status_area_widget = |
+ controller->shelf()->status_area_widget(); |
+ if (status_area_widget) { |
+ WebNotificationTray* notification_tray = |
+ status_area_widget->web_notification_tray(); |
+ if (notification_tray->visible()) |
+ notification_tray->ShowMessageCenterBubble(); |
+ } |
+} |
+ |
+bool HandleShowOak() { |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kAshEnableOak)) { |
+ oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow()); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool HandleShowSystemTrayBubble() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Show_System_Tray_Bubble")); |
+ internal::RootWindowController* controller = |
+ internal::RootWindowController::ForTargetRootWindow(); |
+ if (!controller->GetSystemTray()->HasSystemBubble()) { |
+ controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool HandleShowTaskManager() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Show_Task_Manager")); |
+ Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); |
+ return true; |
+} |
+ |
+void HandleSilenceSpokenFeedback() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Silence_Spoken_Feedback")); |
+ |
+ AccessibilityDelegate* delegate = |
+ Shell::GetInstance()->accessibility_delegate(); |
+ if (!delegate->IsSpokenFeedbackEnabled()) |
+ return; |
+ delegate->SilenceSpokenFeedback(); |
+} |
+ |
+bool HandleSwitchIme(ImeControlDelegate* ime_control_delegate, |
+ const ui::Accelerator& accelerator) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Switch_Ime")); |
+ if (ime_control_delegate) |
+ return ime_control_delegate->HandleSwitchIme(accelerator); |
+ return false; |
+} |
+ |
+bool HandleTakePartialScreenshot(ScreenshotDelegate* screenshot_delegate) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Take_Partial_Screenshot")); |
+ if (screenshot_delegate) { |
+ ash::PartialScreenshotView::StartPartialScreenshot( |
+ screenshot_delegate); |
+ } |
+ // Return true to prevent propagation of the key event because |
+ // this key combination is reserved for partial screenshot. |
+ return true; |
+} |
+ |
+bool HandleTakeScreenshot(ScreenshotDelegate* screenshot_delegate) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Take_Screenshot")); |
+ if (screenshot_delegate && |
+ screenshot_delegate->CanTakeScreenshot()) { |
+ screenshot_delegate->HandleTakeScreenshotForAllRootWindows(); |
+ } |
+ // Return true to prevent propagation of the key event. |
+ return true; |
+} |
+ |
+bool HandleToggleAppList(ui::KeyboardCode key_code, |
+ ui::EventType previous_event_type, |
+ ui::KeyboardCode previous_key_code, |
+ const ui::Accelerator& accelerator) { |
+ // If something else was pressed between the Search key (LWIN) |
+ // being pressed and released, then ignore the release of the |
+ // Search key. |
+ if (key_code == ui::VKEY_LWIN && |
+ (previous_event_type == ui::ET_KEY_RELEASED || |
+ previous_key_code != ui::VKEY_LWIN)) |
return false; |
- display_manager->SetDisplayUIScale(display_id, 1.0f); |
+ if (key_code == ui::VKEY_LWIN) |
+ content::RecordAction(content::UserMetricsAction("Accel_Search_LWin")); |
+ // 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 |
+ DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); |
+ if (Shell::GetInstance()->accessibility_delegate()-> |
+ IsSpokenFeedbackEnabled()) |
+ return false; |
+ ash::Shell::GetInstance()->ToggleAppList(NULL); |
return true; |
} |
-// Rotates the screen. |
-bool HandleRotateScreen() { |
- gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint(); |
- gfx::Display display = Shell::GetScreen()->GetDisplayNearestPoint(point); |
- const DisplayInfo& display_info = |
- Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); |
- Shell::GetInstance()->display_manager()->SetDisplayRotation( |
- display.id(), GetNextRotation(display_info.rotation())); |
+bool HandleToggleCapsLock(ui::KeyboardCode key_code, |
+ ui::EventType previous_event_type, |
+ ui::KeyboardCode previous_key_code) { |
+ Shell* shell = Shell::GetInstance(); |
+ if (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. |
+ // TODO(danakj): Releasing Alt first breaks this: crbug.com/166495 |
+ if (previous_event_type == ui::ET_KEY_RELEASED || |
+ previous_key_code != ui::VKEY_LWIN) |
+ return false; |
+ } |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Toggle_Caps_Lock")); |
+ shell->caps_lock_delegate()->ToggleCapsLock(); |
+ return true; |
+} |
+ |
+bool HandleToggleFullscreen(ui::KeyboardCode key_code) { |
+ if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Fullscreen_F4")); |
+ } |
+ accelerators::ToggleFullscreen(); |
return true; |
} |
@@ -291,45 +602,125 @@ bool HandleToggleRootWindowFullScreen() { |
return true; |
} |
-// Magnify the screen |
-bool HandleMagnifyScreen(int delta_index) { |
- if (ash::Shell::GetInstance()->magnification_controller()->IsEnabled()) { |
- // TODO(yoshiki): Move the following logic to MagnificationController. |
- float scale = |
- ash::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)); |
+bool HandleWindowSnap(int action) { |
+ wm::WindowState* window_state = wm::GetActiveWindowState(); |
+ // Disable window snapping shortcut key for full screen window due to |
+ // http://crbug.com/135487. |
+ if (!window_state || |
+ window_state->window()->type() != aura::client::WINDOW_TYPE_NORMAL || |
+ window_state->IsFullscreen()) { |
+ return false; |
+ } |
- ash::Shell::GetInstance()->magnification_controller()-> |
- SetScale(std::pow(kMagnificationScaleFactor, new_scale_index), true); |
- } else if (ash::Shell::GetInstance()-> |
- partial_magnification_controller()->is_enabled()) { |
- float scale = delta_index > 0 ? kDefaultPartialMagnifiedScale : 1; |
- ash::Shell::GetInstance()->partial_magnification_controller()-> |
- SetScale(scale); |
+ if (action == WINDOW_SNAP_LEFT) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Window_Snap_Left")); |
+ } else { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Window_Snap_Right")); |
} |
+ internal::SnapSizer::SnapWindow(window_state, |
+ action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : |
+ internal::SnapSizer::RIGHT_EDGE); |
return true; |
} |
-bool HandleMediaNextTrack() { |
- Shell::GetInstance()->media_delegate()->HandleMediaNextTrack(); |
+#if defined(OS_CHROMEOS) |
+bool HandleAddRemoveDisplay() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Add_Remove_Display")); |
+ Shell::GetInstance()->display_manager()->AddRemoveDisplay(); |
return true; |
} |
-bool HandleMediaPlayPause() { |
- Shell::GetInstance()->media_delegate()->HandleMediaPlayPause(); |
+bool HandleCrosh() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Open_Crosh")); |
+ |
+ Shell::GetInstance()->new_window_delegate()->OpenCrosh(); |
return true; |
} |
-bool HandleMediaPrevTrack() { |
- Shell::GetInstance()->media_delegate()->HandleMediaPrevTrack(); |
+bool HandleFileManager() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Open_File_Manager")); |
+ |
+ Shell::GetInstance()->new_window_delegate()->OpenFileManager(); |
return true; |
} |
+bool HandleLock(ui::KeyboardCode key_code) { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_LockScreen_L")); |
+ Shell::GetInstance()->session_state_delegate()->LockScreen(); |
+ return true; |
+} |
+ |
+bool HandleSwitchToNextUser() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Switch_To_Next_User")); |
+ |
+ if (!Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) |
+ return false; |
+ ash::SessionStateDelegate* delegate = |
+ ash::Shell::GetInstance()->session_state_delegate(); |
+ if (delegate->NumberOfLoggedInUsers() <= 1) |
+ return false; |
+ MultiProfileUMA::RecordSwitchActiveUser( |
+ MultiProfileUMA::SWITCH_ACTIVE_USER_BY_ACCELERATOR); |
+ delegate->SwitchActiveUserToNext(); |
+ return true; |
+} |
+ |
+bool HandleToggleMirrorMode() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Toggle_Mirror_Mode")); |
+ Shell::GetInstance()->display_controller()->ToggleMirrorMode(); |
+ return true; |
+} |
+ |
+bool HandleToggleSpokenFeedback() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Toggle_Spoken_Feedback")); |
+ |
+ Shell::GetInstance()->accessibility_delegate()-> |
+ ToggleSpokenFeedback(A11Y_NOTIFICATION_SHOW); |
+ return true; |
+} |
+ |
+bool HandleTouchHudClear() { |
+ internal::RootWindowController* controller = |
+ internal::RootWindowController::ForTargetRootWindow(); |
+ if (controller->touch_hud_debug()) { |
+ controller->touch_hud_debug()->Clear(); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool HandleTouchHudModeChange() { |
+ internal::RootWindowController* controller = |
+ internal::RootWindowController::ForTargetRootWindow(); |
+ if (controller->touch_hud_debug()) { |
+ controller->touch_hud_debug()->ChangeToNextMode(); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool HandleTouchHudProjectToggle() { |
+ content::RecordAction( |
+ content::UserMetricsAction("Accel_Touch_Hud_Clear")); |
+ bool enabled = Shell::GetInstance()->is_touch_hud_projection_enabled(); |
+ Shell::GetInstance()->SetTouchHudProjectionEnabled(!enabled); |
+ return true; |
+} |
+ |
+#endif // defined(OS_CHROMEOS) |
+ |
+// Debug print methods. |
+ |
bool HandlePrintLayerHierarchy() { |
aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
for (size_t i = 0; i < root_windows.size(); ++i) { |
@@ -565,25 +956,18 @@ bool AcceleratorController::PerformAction(int action, |
case ACCESSIBLE_FOCUS_PREVIOUS: |
return HandleAccessibleFocusCycle(true); |
case CYCLE_BACKWARD_MRU: |
- HandleCycleBackwardMRU(accelerator); |
- return true; |
+ return HandleCycleBackwardMRU(accelerator); |
case CYCLE_FORWARD_MRU: |
- HandleCycleForwardMRU(accelerator); |
- return true; |
+ return HandleCycleForwardMRU(accelerator); |
case CYCLE_LINEAR: |
- HandleCycleLinear(accelerator); |
- return true; |
+ return HandleCycleLinear(accelerator); |
#if defined(OS_CHROMEOS) |
case ADD_REMOVE_DISPLAY: |
- Shell::GetInstance()->display_manager()->AddRemoveDisplay(); |
- return true; |
+ return HandleAddRemoveDisplay(); |
case TOGGLE_MIRROR_MODE: |
- Shell::GetInstance()->display_controller()->ToggleMirrorMode(); |
- return true; |
+ return HandleToggleMirrorMode(); |
case LOCK_SCREEN: |
- if (key_code == ui::VKEY_L) |
- content::RecordAction(content::UserMetricsAction("Accel_LockScreen_L")); |
- return HandleLock(); |
+ return HandleLock(key_code); |
case OPEN_FILE_MANAGER: |
return HandleFileManager(); |
case OPEN_CROSH: |
@@ -592,129 +976,51 @@ bool AcceleratorController::PerformAction(int action, |
HandleSilenceSpokenFeedback(); |
break; |
case SWAP_PRIMARY_DISPLAY: |
- Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); |
- return true; |
+ return HandleSwapPrimaryDisplay(); |
case SWITCH_TO_NEXT_USER: |
- return SwitchToNextUser(); |
+ return HandleSwitchToNextUser(); |
case TOGGLE_SPOKEN_FEEDBACK: |
return HandleToggleSpokenFeedback(); |
case TOGGLE_WIFI: |
Shell::GetInstance()->system_tray_notifier()->NotifyRequestToggleWifi(); |
return true; |
- case TOUCH_HUD_CLEAR: { |
- internal::RootWindowController* controller = |
- internal::RootWindowController::ForTargetRootWindow(); |
- if (controller->touch_hud_debug()) { |
- controller->touch_hud_debug()->Clear(); |
- return true; |
- } |
- return false; |
- } |
- case TOUCH_HUD_MODE_CHANGE: { |
- internal::RootWindowController* controller = |
- internal::RootWindowController::ForTargetRootWindow(); |
- if (controller->touch_hud_debug()) { |
- controller->touch_hud_debug()->ChangeToNextMode(); |
- return true; |
- } |
- return false; |
- } |
- case TOUCH_HUD_PROJECTION_TOGGLE: { |
- bool enabled = Shell::GetInstance()->is_touch_hud_projection_enabled(); |
- Shell::GetInstance()->SetTouchHudProjectionEnabled(!enabled); |
- return true; |
- } |
+ case TOUCH_HUD_CLEAR: |
+ return HandleTouchHudClear(); |
+ case TOUCH_HUD_MODE_CHANGE: |
+ return HandleTouchHudModeChange(); |
+ case TOUCH_HUD_PROJECTION_TOGGLE: |
+ return HandleTouchHudProjectToggle(); |
case DISABLE_GPU_WATCHDOG: |
content::GpuDataManager::GetInstance()->DisableGpuWatchdog(); |
return true; |
-#endif |
+#endif // OS_CHROMEOS |
case OPEN_FEEDBACK_PAGE: |
- ash::Shell::GetInstance()->new_window_delegate()->OpenFeedbackPage(); |
- return true; |
+ return HandleOpenFeedbackPage(); |
case EXIT: |
// UMA metrics are recorded in the handler. |
exit_warning_handler_.HandleAccelerator(); |
return true; |
- case NEW_INCOGNITO_WINDOW: { |
- bool incognito_allowed = |
- Shell::GetInstance()->delegate()->IsIncognitoAllowed(); |
- if (incognito_allowed) |
- Shell::GetInstance()->new_window_delegate()->NewWindow( |
- true /* is_incognito */); |
- return incognito_allowed; |
- } |
+ case NEW_INCOGNITO_WINDOW: |
+ return HandleNewIncognitoWindow(); |
case NEW_TAB: |
- if (key_code == ui::VKEY_T) |
- content::RecordAction(content::UserMetricsAction("Accel_NewTab_T")); |
- Shell::GetInstance()->new_window_delegate()->NewTab(); |
- return true; |
+ return HandleNewTab(key_code); |
case NEW_WINDOW: |
- Shell::GetInstance()->new_window_delegate()->NewWindow( |
- false /* is_incognito */); |
- return true; |
+ return HandleNewWindow(); |
case RESTORE_TAB: |
- Shell::GetInstance()->new_window_delegate()->RestoreTab(); |
- return true; |
+ return HandleRestoreTab(); |
case TAKE_SCREENSHOT: |
- if (screenshot_delegate_.get() && |
- screenshot_delegate_->CanTakeScreenshot()) { |
- screenshot_delegate_->HandleTakeScreenshotForAllRootWindows(); |
- } |
- // Return true to prevent propagation of the key event. |
- return true; |
+ return HandleTakeScreenshot(screenshot_delegate_.get()); |
case TAKE_PARTIAL_SCREENSHOT: |
- if (screenshot_delegate_) { |
- ash::PartialScreenshotView::StartPartialScreenshot( |
- screenshot_delegate_.get()); |
- } |
- // Return true to prevent propagation of the key event because |
- // this key combination is reserved for partial screenshot. |
- return true; |
+ return HandleTakePartialScreenshot(screenshot_delegate_.get()); |
case TOGGLE_APP_LIST: |
- // If something else was pressed between the Search key (LWIN) |
- // being pressed and released, then ignore the release of the |
- // Search key. |
- if (key_code == ui::VKEY_LWIN && |
- (previous_event_type == ui::ET_KEY_RELEASED || |
- previous_key_code != ui::VKEY_LWIN)) |
- return false; |
- if (key_code == ui::VKEY_LWIN) |
- content::RecordAction(content::UserMetricsAction("Accel_Search_LWin")); |
- // 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 |
- DCHECK_EQ(ui::VKEY_LWIN, accelerator.key_code()); |
- if (Shell::GetInstance()->accessibility_delegate()-> |
- IsSpokenFeedbackEnabled()) |
- return false; |
- ash::Shell::GetInstance()->ToggleAppList(NULL); |
- return true; |
+ return HandleToggleAppList( |
+ key_code, previous_event_type, previous_key_code, accelerator); |
case DISABLE_CAPS_LOCK: |
- if (previous_event_type == ui::ET_KEY_RELEASED || |
- (previous_key_code != ui::VKEY_LSHIFT && |
- previous_key_code != ui::VKEY_SHIFT && |
- previous_key_code != ui::VKEY_RSHIFT)) { |
- // If something else was pressed between the Shift key being pressed |
- // and released, then ignore the release of the Shift key. |
- return false; |
- } |
- if (shell->caps_lock_delegate()->IsCapsLockEnabled()) { |
- shell->caps_lock_delegate()->SetCapsLockEnabled(false); |
- return true; |
- } |
- return false; |
+ return HandleDisableCapsLock( |
+ key_code, previous_event_type, previous_key_code); |
case TOGGLE_CAPS_LOCK: |
- if (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. |
- // TODO(danakj): Releasing Alt first breaks this: crbug.com/166495 |
- if (previous_event_type == ui::ET_KEY_RELEASED || |
- previous_key_code != ui::VKEY_LWIN) |
- return false; |
- } |
- shell->caps_lock_delegate()->ToggleCapsLock(); |
- return true; |
+ return HandleToggleCapsLock( |
+ key_code, previous_event_type, previous_key_code); |
case BRIGHTNESS_DOWN: |
if (brightness_control_delegate_) |
return brightness_control_delegate_->HandleBrightnessDown(accelerator); |
@@ -749,145 +1055,61 @@ bool AcceleratorController::PerformAction(int action, |
return volume_delegate && volume_delegate->HandleVolumeUp(accelerator); |
} |
case FOCUS_LAUNCHER: |
- return shell->focus_cycler()->FocusWidget( |
- Launcher::ForPrimaryDisplay()->shelf_widget()); |
+ return HandleFocusLauncher(); |
case FOCUS_NEXT_PANE: |
return HandleRotatePaneFocus(Shell::FORWARD); |
case FOCUS_PREVIOUS_PANE: |
return HandleRotatePaneFocus(Shell::BACKWARD); |
case SHOW_KEYBOARD_OVERLAY: |
- ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay(); |
- return true; |
+ return HandleShowKeyboardOverlay(); |
case SHOW_OAK: |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kAshEnableOak)) { |
- oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow()); |
- return true; |
- } |
+ return HandleShowOak(); |
+ case SHOW_SYSTEM_TRAY_BUBBLE: |
+ return HandleShowSystemTrayBubble(); |
+ case SHOW_MESSAGE_CENTER_BUBBLE: |
+ HandleShowMessageCenterBubble(); |
break; |
- case SHOW_SYSTEM_TRAY_BUBBLE: { |
- internal::RootWindowController* controller = |
- internal::RootWindowController::ForTargetRootWindow(); |
- if (!controller->GetSystemTray()->HasSystemBubble()) { |
- controller->GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW); |
- return true; |
- } |
- break; |
- } |
- case SHOW_MESSAGE_CENTER_BUBBLE: { |
- internal::RootWindowController* controller = |
- internal::RootWindowController::ForTargetRootWindow(); |
- internal::StatusAreaWidget* status_area_widget = |
- controller->shelf()->status_area_widget(); |
- if (status_area_widget) { |
- WebNotificationTray* notification_tray = |
- status_area_widget->web_notification_tray(); |
- if (notification_tray->visible()) |
- notification_tray->ShowMessageCenterBubble(); |
- } |
- break; |
- } |
case SHOW_TASK_MANAGER: |
- Shell::GetInstance()->new_window_delegate()->ShowTaskManager(); |
- return true; |
+ return HandleShowTaskManager(); |
case NEXT_IME: |
- // This check is necessary e.g. not to process the Shift+Alt+ |
- // ET_KEY_RELEASED accelerator for Chrome OS (see ash/accelerators/ |
- // accelerator_controller.cc) when Shift+Alt+Tab is pressed and then Tab |
- // is released. |
- if (previous_event_type == ui::ET_KEY_RELEASED && |
- // Workaround for crbug.com/139556. CJK IME users tend to press |
- // Enter (or Space) and Shift+Alt almost at the same time to commit |
- // an IME string and then switch from the IME to the English layout. |
- // This workaround allows the user to trigger NEXT_IME even if the |
- // user presses Shift+Alt before releasing Enter. |
- // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. |
- previous_key_code != ui::VKEY_RETURN && |
- previous_key_code != ui::VKEY_SPACE) { |
- // We totally ignore this accelerator. |
- // TODO(mazda): Fix crbug.com/158217 |
- return false; |
- } |
- if (ime_control_delegate_) |
- return ime_control_delegate_->HandleNextIme(); |
- break; |
+ return HandleNextIme( |
+ ime_control_delegate_.get(), previous_event_type, previous_key_code); |
case PREVIOUS_IME: |
- if (ime_control_delegate_) |
- return ime_control_delegate_->HandlePreviousIme(accelerator); |
- break; |
+ return HandlePreviousIme(ime_control_delegate_.get(), accelerator); |
case PRINT_UI_HIERARCHIES: |
return HandlePrintUIHierarchies(); |
case SWITCH_IME: |
- if (ime_control_delegate_) |
- return ime_control_delegate_->HandleSwitchIme(accelerator); |
- break; |
+ return HandleSwitchIme(ime_control_delegate_.get(), accelerator); |
case LAUNCH_APP_0: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(0); |
- return true; |
+ return HandleLaunchAppN(0); |
case LAUNCH_APP_1: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(1); |
- return true; |
+ return HandleLaunchAppN(1); |
case LAUNCH_APP_2: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(2); |
- return true; |
+ return HandleLaunchAppN(2); |
case LAUNCH_APP_3: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(3); |
- return true; |
+ return HandleLaunchAppN(3); |
case LAUNCH_APP_4: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(4); |
- return true; |
+ return HandleLaunchAppN(4); |
case LAUNCH_APP_5: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(5); |
- return true; |
+ return HandleLaunchAppN(5); |
case LAUNCH_APP_6: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(6); |
- return true; |
+ return HandleLaunchAppN(6); |
case LAUNCH_APP_7: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(7); |
- return true; |
+ return HandleLaunchAppN(7); |
case LAUNCH_LAST_APP: |
- Launcher::ForPrimaryDisplay()->LaunchAppIndexAt(-1); |
- return true; |
+ return HandleLaunchLastApp(); |
case WINDOW_SNAP_LEFT: |
- case WINDOW_SNAP_RIGHT: { |
- wm::WindowState* window_state = wm::GetActiveWindowState(); |
- // Disable window snapping shortcut key for full screen window due to |
- // http://crbug.com/135487. |
- if (!window_state || |
- window_state->window()->type() != aura::client::WINDOW_TYPE_NORMAL || |
- window_state->IsFullscreen()) { |
- break; |
- } |
- |
- internal::SnapSizer::SnapWindow(window_state, |
- action == WINDOW_SNAP_LEFT ? internal::SnapSizer::LEFT_EDGE : |
- internal::SnapSizer::RIGHT_EDGE); |
- return true; |
- } |
+ case WINDOW_SNAP_RIGHT: |
+ return HandleWindowSnap(action); |
case WINDOW_MINIMIZE: |
return accelerators::ToggleMinimized(); |
- case TOGGLE_FULLSCREEN: { |
- if (key_code == ui::VKEY_MEDIA_LAUNCH_APP2) { |
- content::RecordAction( |
- content::UserMetricsAction("Accel_Fullscreen_F4")); |
- } |
- accelerators::ToggleFullscreen(); |
- return true; |
- } |
- case TOGGLE_MAXIMIZED: { |
+ case TOGGLE_FULLSCREEN: |
+ return HandleToggleFullscreen(key_code); |
+ case TOGGLE_MAXIMIZED: |
accelerators::ToggleMaximized(); |
return true; |
- } |
- case WINDOW_POSITION_CENTER: { |
- content::RecordAction(content::UserMetricsAction("Accel_Center")); |
- aura::Window* window = wm::GetActiveWindow(); |
- // Docked windows do not support centering and ignore accelerator. |
- if (window && !wm::GetWindowState(window)->IsDocked()) { |
- wm::CenterWindow(window); |
- return true; |
- } |
- break; |
- } |
+ case WINDOW_POSITION_CENTER: |
+ return HandlePositionCenter(); |
case SCALE_UI_UP: |
return HandleScaleUI(true /* up */); |
case SCALE_UI_DOWN: |