| Index: ash/accelerators/accelerator_controller.cc
|
| diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
|
| index 0dc7bbceb54024459f4b597211446c52843e6036..43b41a2618e046c2b838a9b1abc5145dc9e26f81 100644
|
| --- a/ash/accelerators/accelerator_controller.cc
|
| +++ b/ash/accelerators/accelerator_controller.cc
|
| @@ -44,11 +44,13 @@
|
| #include "ash/system/web_notification/web_notification_tray.h"
|
| #include "ash/touch/touch_hud_debug.h"
|
| #include "ash/volume_control_delegate.h"
|
| +#include "ash/wm/dock/docked_window_layout_manager.h"
|
| #include "ash/wm/maximize_mode/maximize_mode_controller.h"
|
| #include "ash/wm/mru_window_tracker.h"
|
| #include "ash/wm/overview/window_selector_controller.h"
|
| #include "ash/wm/partial_screenshot_view.h"
|
| #include "ash/wm/power_button_controller.h"
|
| +#include "ash/wm/window_animations.h"
|
| #include "ash/wm/window_cycle_controller.h"
|
| #include "ash/wm/window_state.h"
|
| #include "ash/wm/window_util.h"
|
| @@ -502,26 +504,131 @@ bool HandleToggleRootWindowFullScreen() {
|
| return true;
|
| }
|
|
|
| -bool HandleWindowSnap(int action) {
|
| +DockedWindowLayoutManager* GetDockedWindowLayoutManager()
|
| +{
|
| + aura::Window* active_window = ash::wm::GetActiveWindow();
|
| + if (active_window) {
|
| + aura::Window* dock_container = Shell::GetContainer(
|
| + active_window->GetRootWindow(), kShellWindowId_DockedContainer);
|
| + DockedWindowLayoutManager* dock_layout =
|
| + static_cast<DockedWindowLayoutManager*>(
|
| + dock_container->layout_manager());
|
| + return dock_layout;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +class ScopedPreferredAlignmentResetter {
|
| + public:
|
| + ScopedPreferredAlignmentResetter(DockedAlignment dock_alignment)
|
| + : docked_window_layout_manager_(GetDockedWindowLayoutManager()) {
|
| + docked_window_layout_manager_->set_preferred_alignment(dock_alignment);
|
| + }
|
| + ~ScopedPreferredAlignmentResetter() {
|
| + docked_window_layout_manager_->set_preferred_alignment(
|
| + DOCKED_ALIGNMENT_NONE);
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedPreferredAlignmentResetter);
|
| + DockedWindowLayoutManager* docked_window_layout_manager_;
|
| +};
|
| +
|
| +void RestoreWindow() {
|
| + wm::WindowState* window_state = wm::GetActiveWindowState();
|
| + if (!window_state)
|
| + return;
|
| +
|
| + base::RecordAction(UserMetricsAction("Accel_Window_Restore"));
|
| + const wm::WMEvent event(wm::WM_EVENT_NORMAL);
|
| + window_state->OnWMEvent(&event);
|
| +}
|
| +
|
| +void DockWindow(DockedAlignment dock_alignment) {
|
| + wm::WindowState* window_state = wm::GetActiveWindowState();
|
| + if (!window_state)
|
| + return;
|
| +
|
| + if (window_state->IsDocked()) {
|
| + GetDockedWindowLayoutManager()->MaybeSetDesiredDockedAlignment(
|
| + dock_alignment);
|
| + return;
|
| + }
|
| +
|
| + ScopedPreferredAlignmentResetter alignmentResetter(dock_alignment);
|
| + base::RecordAction(UserMetricsAction(dock_alignment == DOCKED_ALIGNMENT_LEFT ?
|
| + "Accel_Window_Dock_Left" : "Accel_Window_Dock_Right"));
|
| + const wm::WMEvent event(wm::WM_EVENT_DOCK);
|
| + window_state->OnWMEvent(&event);
|
| +}
|
| +
|
| +void SnapWindow(wm::WMEventType event_type) {
|
| + wm::WindowState* window_state = wm::GetActiveWindowState();
|
| + if (!window_state)
|
| + return;
|
| + base::RecordAction(UserMetricsAction(event_type == wm::WM_EVENT_SNAP_LEFT ?
|
| + "Accel_Window_Snap_Left" :
|
| + "Accel_Window_Snap_Right"));
|
| + const wm::WMEvent event(event_type);
|
| + window_state->OnWMEvent(&event);
|
| +}
|
| +
|
| +bool CanDock(DockedAlignment desired_alignment) {
|
| + aura::Window* active_window = ash::wm::GetActiveWindow();
|
| + DockedWindowLayoutManager* dock_layout = GetDockedWindowLayoutManager();
|
| + if (dock_layout)
|
| + return dock_layout->CanDockWindow(active_window, desired_alignment);
|
| + return false;
|
| +}
|
| +
|
| +DockedAlignment CurrentDockAlignment() {
|
| + DockedWindowLayoutManager* dock_layout = GetDockedWindowLayoutManager();
|
| + if (dock_layout)
|
| + return dock_layout->CalculateAlignment();
|
| + return DOCKED_ALIGNMENT_NONE;
|
| +}
|
| +
|
| +bool HandleWindowSnapOrDock(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() != ui::wm::WINDOW_TYPE_NORMAL ||
|
| - window_state->IsFullscreen() ||
|
| - !window_state->CanSnap()) {
|
| + (window_state->window()->type() != ui::wm::WINDOW_TYPE_NORMAL &&
|
| + window_state->window()->type() != ui::wm::WINDOW_TYPE_PANEL) ||
|
| + window_state->IsFullscreen()) {
|
| return false;
|
| }
|
|
|
| - if (action == WINDOW_SNAP_LEFT) {
|
| - base::RecordAction(UserMetricsAction("Accel_Window_Snap_Left"));
|
| - } else {
|
| - base::RecordAction(UserMetricsAction("Accel_Window_Snap_Right"));
|
| + wm::WindowStateType desired_snap_state = action == WINDOW_SNAP_OR_DOCK_LEFT ?
|
| + wm::WINDOW_STATE_TYPE_LEFT_SNAPPED : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED;
|
| + DockedAlignment desired_dock_alignment = action == WINDOW_SNAP_OR_DOCK_LEFT ?
|
| + DOCKED_ALIGNMENT_LEFT : DOCKED_ALIGNMENT_RIGHT;
|
| + DockedAlignment current_dock_alignment = CurrentDockAlignment();
|
| +
|
| + if (!window_state->IsDocked() ||
|
| + (current_dock_alignment != DOCKED_ALIGNMENT_NONE &&
|
| + current_dock_alignment != desired_dock_alignment)) {
|
| + if (window_state->CanSnap() &&
|
| + window_state->GetStateType() != desired_snap_state &&
|
| + window_state->window()->type() != ui::wm::WINDOW_TYPE_PANEL) {
|
| + SnapWindow(desired_snap_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED ?
|
| + wm::WM_EVENT_SNAP_LEFT : wm::WM_EVENT_SNAP_RIGHT);
|
| + return true;
|
| + }
|
| +
|
| + if (CanDock(desired_dock_alignment)) {
|
| + DockWindow(desired_dock_alignment);
|
| + return true;
|
| + }
|
| }
|
| - const wm::WMEvent event(action == WINDOW_SNAP_LEFT ?
|
| - wm::WM_EVENT_SNAP_LEFT : wm::WM_EVENT_SNAP_RIGHT);
|
| - window_state->OnWMEvent(&event);
|
| - return true;
|
| +
|
| + if (window_state->IsDocked() || window_state->IsSnapped()) {
|
| + RestoreWindow();
|
| + return true;
|
| + }
|
| + ::wm::AnimateWindow(window_state->window(),
|
| + ::wm::WINDOW_ANIMATION_TYPE_BOUNCE);
|
| + return false;
|
| }
|
|
|
| bool HandleWindowMinimize() {
|
| @@ -1051,9 +1158,9 @@ bool AcceleratorController::PerformAction(int action,
|
| return HandleLaunchAppN(7);
|
| case LAUNCH_LAST_APP:
|
| return HandleLaunchLastApp();
|
| - case WINDOW_SNAP_LEFT:
|
| - case WINDOW_SNAP_RIGHT:
|
| - return HandleWindowSnap(action);
|
| + case WINDOW_SNAP_OR_DOCK_LEFT:
|
| + case WINDOW_SNAP_OR_DOCK_RIGHT:
|
| + return HandleWindowSnapOrDock(action);
|
| case WINDOW_MINIMIZE:
|
| return HandleWindowMinimize();
|
| case TOGGLE_FULLSCREEN:
|
|
|