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

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: Use Compound Events for snap/dock as per oshima's request 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
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:

Powered by Google App Engine
This is Rietveld 408576698