From 7f492e928a8605f66266eb9adedd64734465f9df Mon Sep 17 00:00:00 2001 From: "oshima@chromium.org" Date: Tue, 19 Aug 2014 19:41:02 +0000 Subject: Add shoftcut (ctrl-f6) to toggle split view BUG=covered by test. Review URL: https://codereview.chromium.org/465983002 Cr-Commit-Position: refs/heads/master@{#290633} git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290633 0039d316-1c4b-4281-b951-d872f2087c98 --- athena/wm/split_view_controller.cc | 3 +++ athena/wm/window_manager_impl.cc | 21 +++++++++++++++++++++ athena/wm/window_manager_impl.h | 3 +++ athena/wm/window_manager_unittest.cc | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) (limited to 'athena/wm') diff --git a/athena/wm/split_view_controller.cc b/athena/wm/split_view_controller.cc index 2329089..cf39f2e 100644 --- a/athena/wm/split_view_controller.cc +++ b/athena/wm/split_view_controller.cc @@ -163,6 +163,9 @@ void SplitViewController::SetWindowTransform(aura::Window* window, } void SplitViewController::OnAnimationCompleted(aura::Window* window) { + // Animation can be cancelled when deactivated. + if (left_window_ == NULL) + return; DCHECK(window == left_window_ || window == right_window_); if (state_ == ACTIVE) { gfx::Rect window_bounds = gfx::Rect(container_->bounds().size()); diff --git a/athena/wm/window_manager_impl.cc b/athena/wm/window_manager_impl.cc index bbc8673..d66f2ed 100644 --- a/athena/wm/window_manager_impl.cc +++ b/athena/wm/window_manager_impl.cc @@ -192,6 +192,8 @@ void WindowManagerImpl::InstallAccelerators() { const AcceleratorData accelerator_data[] = { {TRIGGER_ON_PRESS, ui::VKEY_F6, ui::EF_NONE, CMD_TOGGLE_OVERVIEW, AF_NONE}, + {TRIGGER_ON_PRESS, ui::VKEY_F6, ui::EF_CONTROL_DOWN, + CMD_TOGGLE_SPLIT_VIEW, AF_NONE}, }; AcceleratorManager::Get()->RegisterAccelerators( accelerator_data, arraysize(accelerator_data), this); @@ -217,6 +219,8 @@ void WindowManagerImpl::OnSplitViewMode(aura::Window* left, } void WindowManagerImpl::OnWindowAdded(aura::Window* new_window) { + // TODO(oshima): Creating a new window should updates the ovewview mode + // instead of exitting. if (new_window->type() == ui::wm::WINDOW_TYPE_NORMAL) SetInOverview(false); } @@ -236,10 +240,27 @@ bool WindowManagerImpl::OnAcceleratorFired(int command_id, case CMD_TOGGLE_OVERVIEW: ToggleOverview(); break; + case CMD_TOGGLE_SPLIT_VIEW: + ToggleSplitview(); + break; } return true; } +void WindowManagerImpl::ToggleSplitview() { + // TODO(oshima): Figure out what to do. + if (IsOverviewModeActive()) + return; + + if (split_view_controller_->IsSplitViewModeActive()) { + split_view_controller_->DeactivateSplitMode(); + // Relayout so that windows are maximzied. + container_->layout_manager()->OnWindowResized(); + } else if (window_list_provider_->GetWindowList().size() > 1) { + split_view_controller_->ActivateSplitMode(NULL, NULL); + } +} + aura::Window* WindowManagerImpl::GetWindowBehind(aura::Window* window) { const aura::Window::Windows& windows = window_list_provider_->GetWindowList(); aura::Window::Windows::const_reverse_iterator iter = diff --git a/athena/wm/window_manager_impl.h b/athena/wm/window_manager_impl.h index 2a8d5ac..c8e9038 100644 --- a/athena/wm/window_manager_impl.h +++ b/athena/wm/window_manager_impl.h @@ -44,11 +44,14 @@ class WindowManagerImpl : public WindowManager, enum Command { CMD_TOGGLE_OVERVIEW, + CMD_TOGGLE_SPLIT_VIEW, }; // Sets whether overview mode is active. void SetInOverview(bool active); + void ToggleSplitview(); + void InstallAccelerators(); // WindowManager: diff --git a/athena/wm/window_manager_unittest.cc b/athena/wm/window_manager_unittest.cc index 705e730..41d949c 100644 --- a/athena/wm/window_manager_unittest.cc +++ b/athena/wm/window_manager_unittest.cc @@ -282,4 +282,39 @@ TEST_F(WindowManagerTest, NewWindowBounds) { wm_api.split_view_controller()->left_window()->bounds().ToString()); } +TEST_F(WindowManagerTest, SplitModeActivationByShortcut) { + WindowManagerImplTestApi wm_api; + + aura::test::TestWindowDelegate delegate; + scoped_ptr w1(CreateTestWindow(&delegate, gfx::Rect())); + w1->Show(); + + ui::test::EventGenerator generator(root_window()); + + // Splitview mode needs at least two windows. + generator.PressKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + generator.ReleaseKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + EXPECT_FALSE(wm_api.split_view_controller()->IsSplitViewModeActive()); + + scoped_ptr w2(CreateTestWindow(&delegate, gfx::Rect())); + w2->Show(); + + generator.PressKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + generator.ReleaseKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + EXPECT_TRUE(wm_api.split_view_controller()->IsSplitViewModeActive()); + int width = + gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().width(); + + EXPECT_EQ(width / 2, w1->bounds().width()); + EXPECT_EQ(width / 2, w2->bounds().width()); + + // Toggle back to normal mode. + generator.PressKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + generator.ReleaseKey(ui::VKEY_F6, ui::EF_CONTROL_DOWN); + EXPECT_FALSE(wm_api.split_view_controller()->IsSplitViewModeActive()); + + EXPECT_EQ(width, w1->bounds().width()); + EXPECT_EQ(width, w2->bounds().width()); +} + } // namespace athena -- cgit v1.1