Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(474)

Unified Diff: ash/wm/default_state.cc

Issue 594383002: Change behaviour of the Alt-] and Alt-[ keys so that it cycles through SnapLeft/SnapRight to DockLe… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@event
Patch Set: Fix comment Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/accelerators/accelerator_table.cc ('k') | ash/wm/dock/dock_types.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/default_state.cc
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc
index 86d9565d2b8c599dd4979cd209efe21816c9bced..46a85450df1b13336b03b77b4774d490bb32b18f 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,105 @@ void MoveToDisplayForRestore(WindowState* window_state) {
}
}
+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,
+ 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:
+ DockedWindowLayoutManager* docked_window_layout_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedPreferredAlignmentResetter);
+};
+
+class ScopedDockedLayoutEventSourceResetter {
+ public:
+ ScopedDockedLayoutEventSourceResetter(DockedWindowLayoutManager* dock_layout)
+ : docked_window_layout_manager_(dock_layout) {
+ docked_window_layout_manager_->set_event_source(
+ DOCKED_ACTION_SOURCE_KEYBOARD);
+ }
+ ~ScopedDockedLayoutEventSourceResetter() {
+ docked_window_layout_manager_->set_event_source(
+ DOCKED_ACTION_SOURCE_UNKNOWN);
+ }
+
+ private:
+ DockedWindowLayoutManager* docked_window_layout_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedDockedLayoutEventSourceResetter);
+};
+
+void CycleSnapDock(WindowState* window_state, WMEventType event) {
+ DockedWindowLayoutManager* dock_layout = GetDockedWindowLayoutManager();
+ wm::WindowStateType desired_snap_state = event ==
+ WM_EVENT_CYCLE_SNAP_DOCK_LEFT ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED :
+ wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED;
+ DockedAlignment desired_dock_alignment = event ==
+ WM_EVENT_CYCLE_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);
+ return;
+ }
+
+ if (dock_layout &&
+ dock_layout->CanDockWindow(window_state->window(),
+ desired_dock_alignment)) {
+ if (window_state->IsDocked()) {
+ dock_layout->MaybeSetDesiredDockedAlignment(desired_dock_alignment);
+ return;
+ }
+
+ ScopedDockedLayoutEventSourceResetter event_source_resetter(dock_layout);
+ ScopedPreferredAlignmentResetter alignmentResetter(desired_dock_alignment,
+ dock_layout);
+ const wm::WMEvent event(wm::WM_EVENT_DOCK);
+ window_state->OnWMEvent(&event);
+ return;
+ }
+ }
+
+ if (window_state->IsDocked() || window_state->IsSnapped()) {
+ ScopedDockedLayoutEventSourceResetter event_source_resetter(dock_layout);
+ window_state->Restore();
+ return;
+ }
+ ::wm::AnimateWindow(window_state->window(),
+ ::wm::WINDOW_ANIMATION_TYPE_BOUNCE);
+}
+
} // namespace;
DefaultState::DefaultState(WindowStateType initial_state_type)
@@ -117,6 +217,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_CYCLE_SNAP_DOCK_LEFT:
+ case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT:
case WM_EVENT_CENTER:
NOTREACHED() << "Compound event should not reach here:" << event;
return;
@@ -268,6 +370,10 @@ bool DefaultState::ProcessCompoundEvents(WindowState* window_state,
case WM_EVENT_TOGGLE_FULLSCREEN:
ToggleFullScreen(window_state, window_state->delegate());
return true;
+ case WM_EVENT_CYCLE_SNAP_DOCK_LEFT:
+ case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT:
+ CycleSnapDock(window_state, event->type());
+ return true;
case WM_EVENT_CENTER:
CenterWindow(window_state);
return true;
@@ -370,6 +476,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_CYCLE_SNAP_DOCK_LEFT:
+ case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT:
case WM_EVENT_CENTER:
case WM_EVENT_NORMAL:
case WM_EVENT_MAXIMIZE:
« no previous file with comments | « ash/accelerators/accelerator_table.cc ('k') | ash/wm/dock/dock_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698