Chromium Code Reviews| Index: ash/wm/default_state.cc |
| diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc |
| index 78d074656000615653534d0889afc26f6b8469c6..d3e98de483ed98081d539a9f5d04cdc7ae376fa5 100644 |
| --- a/ash/wm/default_state.cc |
| +++ b/ash/wm/default_state.cc |
| @@ -9,6 +9,7 @@ |
| #include "ash/shell.h" |
| #include "ash/shell_window_ids.h" |
| #include "ash/wm/coordinate_conversion.h" |
| +#include "ash/wm/dock/docked_window_layout_manager.h" |
| #include "ash/wm/window_animations.h" |
| #include "ash/wm/window_state.h" |
| #include "ash/wm/window_state_delegate.h" |
| @@ -64,6 +65,86 @@ void MoveToDisplayForRestore(WindowState* window_state) { |
| } |
| } |
| +DockedWindowLayoutManager* GetDockedWindowLayoutManager() |
| +{ |
|
oshima
2014/10/02 21:58:41
nit: move { to previous line (see style guide)
dtapuska
2014/10/03 15:44:59
Done.
|
| + 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, |
| + DockedWindowLayoutManager* dock_layout) |
| + : docked_window_layout_manager_(dock_layout) { |
| + 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); |
|
oshima
2014/10/02 21:58:41
nit: move DISALLOW... to the last, with one new li
dtapuska
2014/10/03 15:44:59
Done.
|
| + DockedWindowLayoutManager* docked_window_layout_manager_; |
| +}; |
| + |
| +void ToggleSnapDock(WindowState* window_state, WMEventType event) { |
| + DockedWindowLayoutManager* dock_layout = GetDockedWindowLayoutManager(); |
| + wm::WindowStateType desired_snap_state = event == |
| + WM_EVENT_TOGGLE_SNAP_DOCK_LEFT ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED : |
| + wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; |
| + DockedAlignment desired_dock_alignment = event == |
| + WM_EVENT_TOGGLE_SNAP_DOCK_LEFT ? |
| + DOCKED_ALIGNMENT_LEFT : DOCKED_ALIGNMENT_RIGHT; |
| + DockedAlignment current_dock_alignment = dock_layout ? |
| + dock_layout->CalculateAlignment() : DOCKED_ALIGNMENT_NONE; |
| + |
| + 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) { |
| + const wm::WMEvent event(desired_snap_state == |
| + wm::WINDOW_STATE_TYPE_LEFT_SNAPPED ? |
| + wm::WM_EVENT_SNAP_LEFT : wm::WM_EVENT_SNAP_RIGHT); |
| + window_state->OnWMEvent(&event); |
|
varkha
2014/10/02 22:17:59
May need to RecordUmaAction DOCKED_ACTION_MAXIMIZE
dtapuska
2014/10/03 15:44:59
Done.
|
| + return; |
| + } |
| + |
| + if (dock_layout && |
| + dock_layout->CanDockWindow(window_state->window(), |
| + desired_dock_alignment)) { |
| + |
| + if (window_state->IsDocked()) { |
| + dock_layout->MaybeSetDesiredDockedAlignment(desired_dock_alignment); |
| + return; |
| + } |
| + |
| + ScopedPreferredAlignmentResetter alignmentResetter(desired_dock_alignment, |
| + dock_layout); |
| + const wm::WMEvent event(wm::WM_EVENT_DOCK); |
|
oshima
2014/10/02 21:58:41
This is ok for now. Alternative way is to pass the
dtapuska
2014/10/03 15:44:59
Acknowledged.
|
| + window_state->OnWMEvent(&event); |
|
varkha
2014/10/02 22:17:59
Need to RecordUmaAction DOCKED_ACTION_DOCK.
dtapuska
2014/10/03 15:44:59
Applied in the docked_window_layout_manager when a
|
| + return; |
| + } |
| + } |
| + |
| + if (window_state->IsDocked() || window_state->IsSnapped()) { |
| + window_state->Restore(); |
|
varkha
2014/10/02 22:17:59
May need to RecordUmaAction DOCKED_ACTION_UNDOCK.
dtapuska
2014/10/03 15:44:59
Applied in the docked_window_layout_manager.cc
|
| + return; |
| + } |
| + ::wm::AnimateWindow(window_state->window(), |
| + ::wm::WINDOW_ANIMATION_TYPE_BOUNCE); |
| +} |
| + |
| } // namespace; |
| DefaultState::DefaultState(WindowStateType initial_state_type) |
| @@ -117,6 +198,8 @@ void DefaultState::OnWMEvent(WindowState* window_state, |
| case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
| case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
| case WM_EVENT_TOGGLE_FULLSCREEN: |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_LEFT: |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_RIGHT: |
| case WM_EVENT_CENTER: |
| NOTREACHED() << "Compound event should not reach here:" << event; |
| return; |
| @@ -268,6 +351,10 @@ bool DefaultState::ProcessCompoundEvents(WindowState* window_state, |
| case WM_EVENT_TOGGLE_FULLSCREEN: |
| ToggleFullScreen(window_state, window_state->delegate()); |
| return true; |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_LEFT: |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_RIGHT: |
| + ToggleSnapDock(window_state, event->type()); |
| + return true; |
| case WM_EVENT_CENTER: |
| CenterWindow(window_state); |
| return true; |
| @@ -370,6 +457,8 @@ bool DefaultState::ProcessWorkspaceEvents(WindowState* window_state, |
| case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
| case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
| case WM_EVENT_TOGGLE_FULLSCREEN: |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_LEFT: |
| + case WM_EVENT_TOGGLE_SNAP_DOCK_RIGHT: |
| case WM_EVENT_CENTER: |
| case WM_EVENT_NORMAL: |
| case WM_EVENT_MAXIMIZE: |