summaryrefslogtreecommitdiffstats
path: root/athena
diff options
context:
space:
mode:
authorthakis <thakis@chromium.org>2014-09-24 09:21:10 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-24 16:21:30 +0000
commitf1546bfaabc3492485219dfb51a270bae8da41b9 (patch)
tree6d941757e36111e8ae6f56b20f0bef94d674876a /athena
parent82b9096939b7e60095fc822c31975b25ee22e37b (diff)
downloadchromium_src-f1546bfaabc3492485219dfb51a270bae8da41b9.zip
chromium_src-f1546bfaabc3492485219dfb51a270bae8da41b9.tar.gz
chromium_src-f1546bfaabc3492485219dfb51a270bae8da41b9.tar.bz2
Revert of Adding split view divider widget. (patchset #15 id:280001 of https://codereview.chromium.org/545393002/)
Reason for revert: DragHandleTest.ScrollTest is failing on the bots: http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20%28dbg%29%283%29/builds/36880 Original issue's description: > Adding split view divider widget. > > Adding split view divider widget which could be dragged to exit the split view. > > BUG=403207,408691 > > Committed: https://crrev.com/b47c16517f0882cbabf8c9aa9ce66711f026fd5b > Cr-Commit-Position: refs/heads/master@{#296351} TBR=mukai@chromium.org,oshima@chromium.org,sadrul@chromium.org,tdanderson@chromium.org,pkotwicz@chromium.org,mfomitchev@chromium.org NOTREECHECKS=true NOTRY=true BUG=403207,408691 Review URL: https://codereview.chromium.org/602603003 Cr-Commit-Position: refs/heads/master@{#296433}
Diffstat (limited to 'athena')
-rw-r--r--athena/athena.gyp15
-rw-r--r--athena/util/DEPS1
-rw-r--r--athena/util/drag_handle.cc142
-rw-r--r--athena/util/drag_handle.h41
-rw-r--r--athena/util/drag_handle_unittest.cc138
-rw-r--r--athena/wm/DEPS1
-rw-r--r--athena/wm/bezel_controller.cc60
-rw-r--r--athena/wm/bezel_controller.h12
-rw-r--r--athena/wm/split_view_controller.cc363
-rw-r--r--athena/wm/split_view_controller.h79
-rw-r--r--athena/wm/window_manager_impl.cc2
-rw-r--r--athena/wm/window_manager_unittest.cc4
12 files changed, 105 insertions, 753 deletions
diff --git a/athena/athena.gyp b/athena/athena.gyp
index 2044bc4b..0f821d5 100644
--- a/athena/athena.gyp
+++ b/athena/athena.gyp
@@ -51,6 +51,11 @@
'activity/public/activity_view_manager.h',
'activity/public/activity_view_model.h',
'athena_export.h',
+ 'util/container_priorities.h',
+ 'util/fill_layout_manager.cc',
+ 'util/fill_layout_manager.h',
+ 'util/switches.cc',
+ 'util/switches.h',
'env/athena_env_impl.cc',
'env/public/athena_env.h',
'home/app_list_view_delegate.cc',
@@ -95,13 +100,6 @@
'system/time_view.h',
'system/public/system_ui.h',
'system/system_ui_impl.cc',
- 'util/container_priorities.h',
- 'util/drag_handle.cc',
- 'util/drag_handle.h',
- 'util/fill_layout_manager.cc',
- 'util/fill_layout_manager.h',
- 'util/switches.cc',
- 'util/switches.h',
'wm/bezel_controller.cc',
'wm/bezel_controller.h',
'wm/overview_toolbar.cc',
@@ -269,6 +267,7 @@
],
'sources': [
'activity/activity_manager_unittest.cc',
+ 'util/fill_layout_manager_unittest.cc',
'content/app_activity_unittest.cc',
'env/athena_env_unittest.cc',
'home/athena_start_page_view_unittest.cc',
@@ -279,8 +278,6 @@
'resource_manager/resource_manager_unittest.cc',
'screen/screen_manager_unittest.cc',
'test/athena_unittests.cc',
- 'util/drag_handle_unittest.cc',
- 'util/fill_layout_manager_unittest.cc',
'wm/split_view_controller_unittest.cc',
'wm/window_list_provider_impl_unittest.cc',
'wm/window_manager_unittest.cc',
diff --git a/athena/util/DEPS b/athena/util/DEPS
index c30254d..8755565 100644
--- a/athena/util/DEPS
+++ b/athena/util/DEPS
@@ -2,5 +2,4 @@ include_rules = [
"+athena/athena_export.h",
"+ui/aura",
"+ui/compositor",
- "+ui/views",
]
diff --git a/athena/util/drag_handle.cc b/athena/util/drag_handle.cc
deleted file mode 100644
index 8515007..0000000
--- a/athena/util/drag_handle.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "athena/util/drag_handle.h"
-
-#include "ui/views/background.h"
-#include "ui/views/view.h"
-
-namespace athena {
-namespace {
-
-const SkColor kDragHandleColorNormal = SK_ColorGRAY;
-const SkColor kDragHandleColorHot = SK_ColorWHITE;
-
-// This view notifies its delegate of the touch scroll gestures performed on it.
-class DragHandleView : public views::View {
- public:
- DragHandleView(DragHandleScrollDirection scroll_direction,
- DragHandleScrollDelegate* delegate,
- int preferred_width,
- int preferred_height);
- virtual ~DragHandleView();
-
- private:
- void SetColor(SkColor color);
-
- void SetIsScrolling(bool scrolling);
-
- // views::View:
- virtual gfx::Size GetPreferredSize() const OVERRIDE;
- virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
-
- bool scroll_in_progress_;
- DragHandleScrollDelegate* delegate_;
- DragHandleScrollDirection scroll_direction_;
- SkColor color_;
- float scroll_start_location_;
- const int preferred_width_;
- const int preferred_height_;
-
- DISALLOW_COPY_AND_ASSIGN(DragHandleView);
-};
-
-DragHandleView::DragHandleView(DragHandleScrollDirection scroll_direction,
- DragHandleScrollDelegate* delegate,
- int preferred_width,
- int preferred_height)
- : scroll_in_progress_(false),
- delegate_(delegate),
- scroll_direction_(scroll_direction),
- color_(SK_ColorTRANSPARENT),
- preferred_width_(preferred_width),
- preferred_height_(preferred_height) {
- SetColor(kDragHandleColorNormal);
-}
-
-DragHandleView::~DragHandleView() {
-}
-
-void DragHandleView::SetColor(SkColor color) {
- if (color_ == color)
- return;
- color_ = color;
- set_background(views::Background::CreateSolidBackground(color_));
- SchedulePaint();
-}
-
-void DragHandleView::SetIsScrolling(bool scrolling) {
- if (scroll_in_progress_ == scrolling)
- return;
- scroll_in_progress_ = scrolling;
- if (!scroll_in_progress_)
- scroll_start_location_ = 0;
-}
-
-// views::View:
-gfx::Size DragHandleView::GetPreferredSize() const {
- return gfx::Size(preferred_width_, preferred_height_);
-}
-
-void DragHandleView::OnGestureEvent(ui::GestureEvent* event) {
- SkColor change_color = SK_ColorTRANSPARENT;
- if (event->type() == ui::ET_GESTURE_BEGIN &&
- event->details().touch_points() == 1) {
- change_color = kDragHandleColorHot;
- } else if (event->type() == ui::ET_GESTURE_END &&
- event->details().touch_points() == 1) {
- change_color = kDragHandleColorNormal;
- }
-
- if (change_color != SK_ColorTRANSPARENT) {
- SetColor(change_color);
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
- if (scroll_in_progress_)
- return;
- float delta;
- if (scroll_direction_ == DRAG_HANDLE_VERTICAL) {
- delta = event->details().scroll_y_hint();
- scroll_start_location_ = event->root_location().y();
- } else {
- delta = event->details().scroll_x_hint();
- scroll_start_location_ = event->root_location().x();
- }
- delegate_->HandleScrollBegin(delta);
- SetIsScrolling(true);
- event->SetHandled();
- } else if (event->type() == ui::ET_GESTURE_SCROLL_END ||
- event->type() == ui::ET_SCROLL_FLING_START) {
- if (!scroll_in_progress_)
- return;
- delegate_->HandleScrollEnd();
- SetColor(kDragHandleColorNormal);
- SetIsScrolling(false);
- event->SetHandled();
- } else if (event->type() == ui::ET_GESTURE_SCROLL_UPDATE) {
- if (!scroll_in_progress_)
- return;
- float delta = scroll_direction_ == DRAG_HANDLE_VERTICAL
- ? event->root_location().y() - scroll_start_location_
- : event->root_location().x() - scroll_start_location_;
- delegate_->HandleScrollUpdate(delta);
- event->SetHandled();
- }
-}
-
-} // namespace
-
-views::View* CreateDragHandleView(DragHandleScrollDirection scroll_direction,
- DragHandleScrollDelegate* delegate,
- int preferred_width,
- int preferred_height) {
- views::View* view = new DragHandleView(
- scroll_direction, delegate, preferred_width, preferred_height);
- return view;
-}
-
-} // namespace athena
diff --git a/athena/util/drag_handle.h b/athena/util/drag_handle.h
deleted file mode 100644
index ad1b209..0000000
--- a/athena/util/drag_handle.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ATHENA_UTIL_DRAG_HANDLE_H_
-#define ATHENA_UTIL_DRAG_HANDLE_H_
-
-#include "athena/athena_export.h"
-
-namespace views {
-class View;
-}
-
-namespace athena {
-class DragHandleScrollDelegate {
- public:
- virtual ~DragHandleScrollDelegate() {}
-
- // Beginning of a scroll gesture.
- virtual void HandleScrollBegin(float delta) = 0;
-
- // End of the current scroll gesture.
- virtual void HandleScrollEnd() = 0;
-
- // Update of the scroll position for the currently active scroll gesture.
- virtual void HandleScrollUpdate(float delta) = 0;
-};
-
-enum DragHandleScrollDirection { DRAG_HANDLE_VERTICAL, DRAG_HANDLE_HORIZONTAL };
-
-// Creates a handle view which notifies the delegate of the scrolls performed on
-// it.
-ATHENA_EXPORT views::View* CreateDragHandleView(
- DragHandleScrollDirection scroll_direction,
- DragHandleScrollDelegate* delegate,
- int preferred_width,
- int preferred_height);
-
-} // namespace athena
-
-#endif // ATHENA_UTIL_DRAG_HANDLE_H_
diff --git a/athena/util/drag_handle_unittest.cc b/athena/util/drag_handle_unittest.cc
deleted file mode 100644
index c86e2a0..0000000
--- a/athena/util/drag_handle_unittest.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "athena/util/drag_handle.h"
-
-#include "ui/aura/test/aura_test_base.h"
-#include "ui/aura/window.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace athena {
-
-class DragHandleDelegateTest : public DragHandleScrollDelegate {
- public:
- explicit DragHandleDelegateTest()
- : begin_delta_(0),
- got_scroll_end_(false),
- update_delta_(0) {}
-
- virtual ~DragHandleDelegateTest() {}
-
- void Reset() {
- begin_delta_ = 0;
- got_scroll_end_ = false;
- update_delta_ = 0;
- }
-
- float begin_delta() { return begin_delta_; }
- bool got_scroll_end() { return got_scroll_end_; }
- float update_delta() { return update_delta_; }
-
- private:
- // DragHandleScrollDelegate:
- virtual void HandleScrollBegin(float delta) OVERRIDE {
- begin_delta_ = delta;
- }
-
- virtual void HandleScrollEnd() OVERRIDE {
- got_scroll_end_ = true;
- }
-
- virtual void HandleScrollUpdate(float delta) OVERRIDE {
- update_delta_ = delta;
- }
-
- float begin_delta_;
- bool got_scroll_end_;
- float update_delta_;
-
- DISALLOW_COPY_AND_ASSIGN(DragHandleDelegateTest);
-};
-
-typedef aura::test::AuraTestBase DragHandleTest;
-
-const int kDragHandleWidth = 10;
-const int kDragHandleHeight = 100;
-
-ui::GestureEvent CreateGestureEvent(ui::EventType type,
- float x,
- float delta_x) {
- ui::GestureEvent event(
- x,
- 1,
- 0,
- base::TimeDelta::FromInternalValue(base::Time::Now().ToInternalValue()),
- ui::GestureEventDetails(type, delta_x, 0));
- event.set_root_location(gfx::PointF(x, 1));
- return event;
-}
-
-TEST_F(DragHandleTest, ScrollTest) {
- DragHandleDelegateTest delegate;
- scoped_ptr<views::View> drag_handle(
- CreateDragHandleView(DragHandleScrollDirection::DRAG_HANDLE_HORIZONTAL,
- &delegate,
- kDragHandleWidth,
- kDragHandleHeight));
-
- views::Widget widget;
- views::Widget::InitParams params(
- views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params.parent = root_window();
- params.accept_events = true;
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(params);
- widget.SetContentsView(drag_handle.get());
- const gfx::Size& size = gfx::Size(kDragHandleWidth, kDragHandleHeight);
- widget.SetSize(size);
- widget.SetBounds(gfx::Rect(0, 0, size.width(), size.height()));
-
- const float begin_x = 4.0;
- const float begin_delta = 10.0;
- const float update_delta = 15.0;
-
- ui::GestureEvent scroll_begin_model =
- CreateGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, begin_x, begin_delta);
- ui::GestureEvent scroll_update_model =
- CreateGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE,
- begin_x + update_delta,
- update_delta - begin_delta);
- ui::GestureEvent scroll_end_model =
- CreateGestureEvent(ui::ET_GESTURE_SCROLL_END, begin_x + update_delta, 0);
- ui::GestureEvent fling_start_model =
- CreateGestureEvent(ui::ET_SCROLL_FLING_START, begin_x + update_delta, 0);
-
- // Normal scroll
- ui::GestureEvent e(scroll_begin_model);
- widget.OnGestureEvent(&e);
- EXPECT_EQ(begin_delta, delegate.begin_delta());
- EXPECT_EQ(0, delegate.update_delta());
- EXPECT_FALSE(delegate.got_scroll_end());
- e = ui::GestureEvent(scroll_update_model);
- widget.OnGestureEvent(&e);
- EXPECT_EQ(update_delta, delegate.update_delta());
- EXPECT_FALSE(delegate.got_scroll_end());
- e = ui::GestureEvent(scroll_end_model);
- widget.OnGestureEvent(&e);
- EXPECT_EQ(update_delta, delegate.update_delta());
- EXPECT_TRUE(delegate.got_scroll_end());
-
- delegate.Reset();
-
- // Scroll ending with a fling
- e = ui::GestureEvent(scroll_begin_model);
- widget.OnGestureEvent(&e);
- e = ui::GestureEvent(scroll_update_model);
- widget.OnGestureEvent(&e);
- e = ui::GestureEvent(fling_start_model);
- widget.OnGestureEvent(&e);
- EXPECT_TRUE(delegate.got_scroll_end());
-
- delegate.Reset();
-
- drag_handle.reset();
-}
-
-} // namespace athena
diff --git a/athena/wm/DEPS b/athena/wm/DEPS
index 5ea8adf..dce11b0 100644
--- a/athena/wm/DEPS
+++ b/athena/wm/DEPS
@@ -9,6 +9,5 @@ include_rules = [
"+ui/compositor",
"+ui/events",
"+ui/gfx",
- "+ui/views",
"+ui/wm",
]
diff --git a/athena/wm/bezel_controller.cc b/athena/wm/bezel_controller.cc
index c4a53a0..a4e8156 100644
--- a/athena/wm/bezel_controller.cc
+++ b/athena/wm/bezel_controller.cc
@@ -46,21 +46,6 @@ float GetDistance(const gfx::PointF& location,
: point_in_screen.x() - GetDisplay(window).bounds().width();
}
-// Returns the bezel corresponding to the |location| in |window| or BEZEL_NONE
-// if the location is outside of the bezel area.
-// Only implemented for LEFT and RIGHT bezels.
-BezelController::Bezel GetBezel(const gfx::PointF& location,
- aura::Window* window) {
- int screen_width = GetDisplay(window).bounds().width();
- gfx::Point point_in_screen(gfx::ToRoundedPoint(location));
- wm::ConvertPointToScreen(window, &point_in_screen);
- if (point_in_screen.x() < kBezelWidth)
- return BezelController::BEZEL_LEFT;
- if (point_in_screen.x() > screen_width - kBezelWidth)
- return BezelController::BEZEL_RIGHT;
- return BezelController::BEZEL_NONE;
-}
-
} // namespace
BezelController::BezelController(aura::Window* container)
@@ -84,9 +69,9 @@ void BezelController::SetState(BezelController::State state,
return;
if (state == BEZEL_SCROLLING_TWO_FINGERS)
- left_right_delegate_->BezelScrollBegin(scroll_bezel_, scroll_delta);
+ left_right_delegate_->ScrollBegin(scroll_bezel_, scroll_delta);
else if (state_ == BEZEL_SCROLLING_TWO_FINGERS)
- left_right_delegate_->BezelScrollEnd();
+ left_right_delegate_->ScrollEnd();
state_ = state;
if (state == NONE) {
scroll_bezel_ = BEZEL_NONE;
@@ -94,6 +79,18 @@ void BezelController::SetState(BezelController::State state,
}
}
+// Only implemented for LEFT and RIGHT bezels ATM.
+BezelController::Bezel BezelController::GetBezel(const gfx::PointF& location) {
+ int screen_width = GetDisplay(container_).bounds().width();
+ if (location.x() < kBezelWidth) {
+ return BEZEL_LEFT;
+ } else if (location.x() > screen_width - kBezelWidth) {
+ return BEZEL_RIGHT;
+ } else {
+ return BEZEL_NONE;
+ }
+}
+
void BezelController::OnGestureEvent(ui::GestureEvent* event) {
// TODO(mfomitchev): Currently we aren't retargetting or consuming any of the
// touch events. This means that content can prevent the generation of gesture
@@ -108,35 +105,24 @@ void BezelController::OnGestureEvent(ui::GestureEvent* event) {
if (!ShouldProcessGesture(type))
return;
- const ui::GestureEventDetails& event_details = event->details();
- int num_touch_points = event_details.touch_points();
- if (num_touch_points == 1 && type == ui::ET_GESTURE_BEGIN) {
- // Reset the state when the first finger touches and starts a gesture.
- // Normally, the state gets reset when the last finger is lifted and we
- // receive ET_GESTURE_END. However ET_GESTURE_END doesn't always get
- // dispatched. (E.g. if the gesture target was hidden or deleted).
- // Since we can't rely on receiving ET_GESTURE_END when the last finger is
- // lifted, we also reset the state on ET_GESTURE_BEGIN when the first
- // finger touches the screen.
- SetState(NONE);
- }
-
if (scroll_target_ && event->target() != scroll_target_)
return;
const gfx::PointF& event_location = event->location_f();
+ const ui::GestureEventDetails& event_details = event->details();
+ int num_touch_points = event_details.touch_points();
float scroll_delta = kScrollDeltaNone;
- aura::Window* target_window = static_cast<aura::Window*>(event->target());
- if (scroll_bezel_ != BEZEL_NONE)
+ if (scroll_bezel_ != BEZEL_NONE) {
+ aura::Window* target_window = static_cast<aura::Window*>(event->target());
scroll_delta = GetDistance(event_location, target_window, scroll_bezel_);
+ }
if (type == ui::ET_GESTURE_BEGIN) {
if (num_touch_points > 2) {
SetState(IGNORE_CURRENT_SCROLL);
return;
}
- BezelController::Bezel event_bezel =
- GetBezel(event->location_f(), target_window);
+ BezelController::Bezel event_bezel = GetBezel(event->location_f());
switch (state_) {
case NONE:
scroll_bezel_ = event_bezel;
@@ -188,14 +174,14 @@ void BezelController::OnGestureEvent(ui::GestureEvent* event) {
DCHECK_EQ(num_touch_points, 2);
SetState(BEZEL_SCROLLING_TWO_FINGERS, scroll_delta);
- if (left_right_delegate_->BezelCanScroll())
+ if (left_right_delegate_->CanScroll())
event->SetHandled();
} else if (type == ui::ET_GESTURE_SCROLL_UPDATE) {
if (state_ != BEZEL_SCROLLING_TWO_FINGERS)
return;
- left_right_delegate_->BezelScrollUpdate(scroll_delta);
- if (left_right_delegate_->BezelCanScroll())
+ left_right_delegate_->ScrollUpdate(scroll_delta);
+ if (left_right_delegate_->CanScroll())
event->SetHandled();
}
}
diff --git a/athena/wm/bezel_controller.h b/athena/wm/bezel_controller.h
index ec0cee1..7bec71a 100644
--- a/athena/wm/bezel_controller.h
+++ b/athena/wm/bezel_controller.h
@@ -37,18 +37,18 @@ class BezelController : public ui::EventHandler {
// Beginning of a bezel scroll gesture started from the |bezel|.
// |delta| is the difference between the x-coordinate of the current scroll
// position and the bezel. It will be zero or negative for the right bezel.
- virtual void BezelScrollBegin(Bezel bezel, float delta) = 0;
+ virtual void ScrollBegin(Bezel bezel, float delta) = 0;
// End of the current bezel scroll
- virtual void BezelScrollEnd() = 0;
+ virtual void ScrollEnd() = 0;
// Update of the scroll position for the currently active bezel scroll.
// |delta| has the same meaning as in ScrollBegin().
- virtual void BezelScrollUpdate(float delta) = 0;
+ virtual void ScrollUpdate(float delta) = 0;
// Should return false if the delegate isn't going to react to the scroll
// events.
- virtual bool BezelCanScroll() = 0;
+ virtual bool CanScroll() = 0;
};
explicit BezelController(aura::Window* container);
@@ -75,6 +75,10 @@ class BezelController : public ui::EventHandler {
// BEZEL_SROLLING states.
void SetState(State state, float scroll_delta);
+ // Returns the bezel corresponding to the |location| or BEZEL_NONE if the
+ // location is outside of the bezel area.
+ Bezel GetBezel(const gfx::PointF& location);
+
// ui::EventHandler overrides
virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
diff --git a/athena/wm/split_view_controller.cc b/athena/wm/split_view_controller.cc
index 0326255..36ce6c2 100644
--- a/athena/wm/split_view_controller.cc
+++ b/athena/wm/split_view_controller.cc
@@ -10,128 +10,23 @@
#include "athena/wm/public/window_list_provider.h"
#include "athena/wm/public/window_manager.h"
#include "base/bind.h"
-#include "ui/aura/scoped_window_targeter.h"
#include "ui/aura/window.h"
-#include "ui/aura/window_targeter.h"
#include "ui/compositor/closure_animation_observer.h"
-#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animation_observer.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/display.h"
#include "ui/gfx/screen.h"
-#include "ui/views/background.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/widget/root_view.h"
-#include "ui/views/widget/root_view_targeter.h"
-#include "ui/views/widget/widget.h"
#include "ui/wm/core/window_util.h"
namespace athena {
namespace {
-const int kDragHandleWidth = 4;
-const int kDragHandleHeight = 80;
-const int kDragHandleMargin = 1;
-const int kDividerWidth = kDragHandleWidth + 2 * kDragHandleMargin;
-
-// Always returns the same target.
-class StaticViewTargeterDelegate : public views::ViewTargeterDelegate {
- public:
- explicit StaticViewTargeterDelegate(views::View* target) : target_(target) {}
-
- virtual ~StaticViewTargeterDelegate() {}
-
- private:
- // views::ViewTargeterDelegate:
- virtual views::View* TargetForRect(views::View* root,
- const gfx::Rect& rect) OVERRIDE {
- return target_;
- }
-
- // Not owned.
- views::View* target_;
-
- DISALLOW_COPY_AND_ASSIGN(StaticViewTargeterDelegate);
-};
-
-// Expands the effective target area of the window of the widget containing the
-// specified view. If the view is large enough to begin with, there should be
-// no change from the default targeting behavior.
-class PriorityWindowTargeter : public aura::WindowTargeter,
- public aura::WindowObserver {
- public:
- explicit PriorityWindowTargeter(views::View* priority_view)
- : priority_view_(priority_view) {
- CHECK(priority_view->GetWidget());
- window_ = priority_view->GetWidget()->GetNativeWindow();
- CHECK(window_);
- window_->AddObserver(this);
- }
-
- virtual ~PriorityWindowTargeter() {
- window_->RemoveObserver(this);
- }
-
- private:
- // aura::WindowTargeter:
- virtual ui::EventTarget* FindTargetForLocatedEvent(
- ui::EventTarget* root,
- ui::LocatedEvent* event) OVERRIDE {
- if (!window_ || (event->type() != ui::ET_TOUCH_PRESSED))
- return WindowTargeter::FindTargetForLocatedEvent(root, event);
- CHECK_EQ(window_, priority_view_->GetWidget()->GetNativeWindow());
-
- // Bounds of the view in root window's coordinates.
- gfx::Rect view_bounds = priority_view_->GetBoundsInScreen();
- // If there is a transform on the window's layer - apply it.
- gfx::Transform window_transform = window_->layer()->transform();
- gfx::RectF transformed_bounds_f = view_bounds;
- window_transform.TransformRect(&transformed_bounds_f);
- gfx::Rect transformed_bounds = gfx::Rect(transformed_bounds_f.x(),
- transformed_bounds_f.y(),
- transformed_bounds_f.width(),
- transformed_bounds_f.height());
- // Now expand the bounds to be at least
- // kMinTouchDimension x kMinTouchDimension and target the event to the
- // window if it falls within the expanded bounds
- gfx::Point center = transformed_bounds.CenterPoint();
- gfx::Rect extension_rect = gfx::Rect(
- center.x() - kMinTouchDimension / 2,
- center.y() - kMinTouchDimension / 2,
- kMinTouchDimension,
- kMinTouchDimension);
- gfx::Rect extended_bounds =
- gfx::UnionRects(transformed_bounds, extension_rect);
- if (extended_bounds.Contains(event->root_location())) {
- root->ConvertEventToTarget(window_, event);
- return window_;
- }
-
- return WindowTargeter::FindTargetForLocatedEvent(root, event);
- }
-
- // aura::WindowObserver:
- virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {
- DCHECK_EQ(window, window_);
- window_->RemoveObserver(this);
- window_ = NULL;
- }
-
- // Minimum dimension of a target to be comfortably touchable.
- // The effective touch target area of |priority_window_| gets expanded so
- // that it's width and height is ayt least |kMinTouchDimension|.
- int const kMinTouchDimension = 26;
-
- aura::Window* window_;
- views::View* priority_view_;
-
- DISALLOW_COPY_AND_ASSIGN(PriorityWindowTargeter);
-};
-
-// Returns a target transform required to transform |from| to |to|.
-gfx::Transform GetTransformForBounds(const gfx::Rect& from,
- const gfx::Rect& to) {
+// Returns a target transform which is suitable for animating a windows's
+// bounds.
+gfx::Transform GetTargetTransformForBoundsAnimation(const gfx::Rect& from,
+ const gfx::Rect& to) {
gfx::Transform transform;
transform.Translate(to.x() - from.x(), to.y() - from.y());
transform.Scale(to.width() / static_cast<float>(from.width()),
@@ -154,10 +49,7 @@ SplitViewController::SplitViewController(
window_list_provider_(window_list_provider),
left_window_(NULL),
right_window_(NULL),
- divider_position_(0),
- divider_scroll_start_position_(0),
- divider_widget_(NULL),
- drag_handle_(NULL),
+ separator_position_(0),
weak_factory_(this) {
}
@@ -211,7 +103,6 @@ void SplitViewController::ActivateSplitMode(aura::Window* left,
if (right_window_ && right_window_ != left && right_window_ != right)
to_hide_.push_back(right_window_);
- divider_position_ = GetDefaultDividerPosition();
SetState(ACTIVE);
right_window_ = right;
left_window_ = left;
@@ -243,125 +134,41 @@ void SplitViewController::DeactivateSplitMode() {
left_window_ = right_window_ = NULL;
}
-void SplitViewController::InitializeDivider() {
- CHECK(!divider_widget_);
- CHECK(!drag_handle_);
-
- drag_handle_ = CreateDragHandleView(DRAG_HANDLE_HORIZONTAL,
- this,
- kDragHandleWidth,
- kDragHandleHeight);
- views::View* content_view = new views::View;
- content_view->set_background(
- views::Background::CreateSolidBackground(SK_ColorBLACK));
- views::BoxLayout* layout =
- new views::BoxLayout(views::BoxLayout::kHorizontal,
- kDragHandleMargin,
- kDragHandleMargin,
- 0);
- layout->set_main_axis_alignment(views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
- layout->set_cross_axis_alignment(
- views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
- content_view->SetLayoutManager(layout);
- content_view->AddChildView(drag_handle_);
-
- divider_widget_ = new views::Widget();
- views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
- params.parent = container_;
- params.bounds = gfx::Rect(-kDividerWidth / 2,
- 0,
- kDividerWidth,
- container_->bounds().height());
- divider_widget_->Init(params);
- divider_widget_->SetContentsView(content_view);
-
- // Install a static view targeter on the root view which always targets
- // divider_view.
- // TODO(mfomitchev,tdanderson): This should not be needed:
- // 1. crbug.com/414339 - divider_view is the only view and it completely
- // overlaps the root view.
- // 2. The logic in ViewTargeterDelegate::TargetForRect could be improved to
- // work better for views that are narrow in one dimension and long in
- // another dimension.
- views::internal::RootView* root_view =
- static_cast<views::internal::RootView*>(divider_widget_->GetRootView());
- view_targeter_delegate_.reset(new StaticViewTargeterDelegate(drag_handle_));
- views::ViewTargeter* targeter =
- new views::RootViewTargeter(view_targeter_delegate_.get(), root_view);
- divider_widget_->GetRootView()->SetEventTargeter(
- scoped_ptr<views::ViewTargeter>(targeter));
-}
-
-void SplitViewController::HideDivider() {
- divider_widget_->Hide();
- window_targeter_.reset();
-}
-
-void SplitViewController::ShowDivider() {
- divider_widget_->Show();
- if (!window_targeter_) {
- scoped_ptr<ui::EventTargeter> window_targeter =
- scoped_ptr<ui::EventTargeter>(new PriorityWindowTargeter(drag_handle_));
- window_targeter_.reset(
- new aura::ScopedWindowTargeter(container_, window_targeter.Pass()));
- }
-}
-
-gfx::Rect SplitViewController::GetLeftAreaBounds() {
+gfx::Rect SplitViewController::GetLeftTargetBounds() {
gfx::Rect work_area =
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area();
- return gfx::Rect(
- 0, 0, divider_position_ - kDividerWidth / 2, work_area.height());
+ return gfx::Rect(0, 0, container_->bounds().width() / 2, work_area.height());
}
-gfx::Rect SplitViewController::GetRightAreaBounds() {
+gfx::Rect SplitViewController::GetRightTargetBounds() {
gfx::Rect work_area =
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area();
int container_width = container_->bounds().width();
- return gfx::Rect(divider_position_ + kDividerWidth / 2,
- 0,
- container_width - divider_position_ - kDividerWidth / 2,
- work_area.height());
+ return gfx::Rect(
+ container_width / 2, 0, container_width / 2, work_area.height());
}
void SplitViewController::SetState(SplitViewController::State state) {
if (state_ == state)
return;
- if (divider_widget_ == NULL)
- InitializeDivider();
-
state_ = state;
-
ScreenManager::Get()->SetRotationLocked(state_ != INACTIVE);
- if (state == INACTIVE)
- HideDivider();
- else
- ShowDivider();
}
void SplitViewController::UpdateLayout(bool animate) {
CHECK(left_window_);
CHECK(right_window_);
+
// Splitview can be activated from SplitViewController::ActivateSplitMode or
// SplitViewController::ScrollEnd. Additionally we don't want to rotate the
// screen while engaging splitview (i.e. state_ == SCROLLING).
if (state_ == INACTIVE && !animate) {
- gfx::Rect work_area =
- gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area();
- aura::Window* top_window = window_list_provider_->GetWindowList().back();
- if (top_window != left_window_) {
- // TODO(mfomitchev): Use to_hide_ instead
+ if (!wm::IsActiveWindow(left_window_))
left_window_->Hide();
- right_window_->SetBounds(gfx::Rect(work_area.size()));
- }
- if (top_window != right_window_) {
- left_window_->SetBounds(gfx::Rect(work_area.size()));
- // TODO(mfomitchev): Use to_hide_ instead
+ if (!wm::IsActiveWindow(right_window_))
right_window_->Hide();
- }
- SetWindowTransforms(
- gfx::Transform(), gfx::Transform(), gfx::Transform(), false);
+ SetWindowTransforms(gfx::Transform(), gfx::Transform(), false);
return;
}
@@ -370,46 +177,25 @@ void SplitViewController::UpdateLayout(bool animate) {
window_list_provider_->MoveToFront(right_window_);
window_list_provider_->MoveToFront(left_window_);
- gfx::Transform divider_transform;
- divider_transform.Translate(divider_position_, 0);
if (state_ == ACTIVE) {
if (animate) {
- gfx::Transform left_transform =
- GetTransformForBounds(left_window_->bounds(), GetLeftAreaBounds());
- gfx::Transform right_transform =
- GetTransformForBounds(right_window_->bounds(), GetRightAreaBounds());
- SetWindowTransforms(
- left_transform, right_transform, divider_transform, true);
+ gfx::Transform left_transform = GetTargetTransformForBoundsAnimation(
+ left_window_->bounds(), GetLeftTargetBounds());
+ gfx::Transform right_transform = GetTargetTransformForBoundsAnimation(
+ right_window_->bounds(), GetRightTargetBounds());
+ SetWindowTransforms(left_transform, right_transform, true);
} else {
- left_window_->SetBounds(GetLeftAreaBounds());
- right_window_->SetBounds(GetRightAreaBounds());
- SetWindowTransforms(
- gfx::Transform(), gfx::Transform(), divider_transform, false);
+ left_window_->SetBounds(GetLeftTargetBounds());
+ right_window_->SetBounds(GetRightTargetBounds());
+ SetWindowTransforms(gfx::Transform(), gfx::Transform(), false);
}
} else {
gfx::Transform left_transform;
+ left_transform.Translate(separator_position_ - container_->bounds().width(),
+ 0);
gfx::Transform right_transform;
- gfx::Rect left_area_bounds = GetLeftAreaBounds();
- gfx::Rect right_area_bounds = GetRightAreaBounds();
- // If the width of the window is greater than the width of the area which it
- // is supposed to occupy - translate the window. Otherwise scale the window
- // up to fill the target area.
- if (left_window_->bounds().width() >= left_area_bounds.width()) {
- left_transform.Translate(
- left_area_bounds.right() - left_window_->bounds().right(), 0);
- } else {
- left_transform =
- GetTransformForBounds(left_window_->bounds(), left_area_bounds);
- }
- if (right_window_->bounds().width() >= right_area_bounds.width()) {
- right_transform.Translate(
- right_area_bounds.x() - right_window_->bounds().x(), 0);
- } else {
- right_transform =
- GetTransformForBounds(right_window_->bounds(), right_area_bounds);
- }
- SetWindowTransforms(
- left_transform, right_transform, divider_transform, animate);
+ right_transform.Translate(separator_position_, 0);
+ SetWindowTransforms(left_transform, right_transform, animate);
}
// Note: |left_window_| and |right_window_| may be NULL if calling
// SetWindowTransforms():
@@ -420,7 +206,6 @@ void SplitViewController::UpdateLayout(bool animate) {
void SplitViewController::SetWindowTransforms(
const gfx::Transform& left_transform,
const gfx::Transform& right_transform,
- const gfx::Transform& divider_transform,
bool animate) {
if (animate) {
ui::ScopedLayerAnimationSettings left_settings(
@@ -429,12 +214,6 @@ void SplitViewController::SetWindowTransforms(
ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
left_window_->SetTransform(left_transform);
- ui::ScopedLayerAnimationSettings divider_widget_settings(
- divider_widget_->GetNativeWindow()->layer()->GetAnimator());
- divider_widget_settings.SetPreemptionStrategy(
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- divider_widget_->GetNativeWindow()->SetTransform(divider_transform);
-
ui::ScopedLayerAnimationSettings right_settings(
right_window_->layer()->GetAnimator());
right_settings.SetPreemptionStrategy(
@@ -445,7 +224,6 @@ void SplitViewController::SetWindowTransforms(
right_window_->SetTransform(right_transform);
} else {
left_window_->SetTransform(left_transform);
- divider_widget_->GetNativeWindow()->SetTransform(divider_transform);
right_window_->SetTransform(right_transform);
}
}
@@ -466,24 +244,30 @@ void SplitViewController::OnAnimationCompleted() {
}
}
-int SplitViewController::GetDefaultDividerPosition() {
- return container_->GetBoundsInScreen().width() / 2;
+void SplitViewController::UpdateSeparatorPositionFromScrollDelta(float delta) {
+ gfx::Screen* screen = gfx::Screen::GetScreenFor(container_);
+ const gfx::Rect& display_bounds =
+ screen->GetDisplayNearestWindow(container_).bounds();
+ gfx::Rect container_bounds = container_->GetBoundsInScreen();
+ separator_position_ =
+ delta > 0 ? ((int)delta) + display_bounds.x() - container_bounds.x()
+ : display_bounds.right() - container_bounds.x() + delta;
}
///////////////////////////////////////////////////////////////////////////////
// BezelController::ScrollDelegate:
-void SplitViewController::BezelScrollBegin(BezelController::Bezel bezel,
- float delta) {
- if (!BezelCanScroll())
+void SplitViewController::ScrollBegin(BezelController::Bezel bezel,
+ float delta) {
+ if (!CanScroll())
return;
-
SetState(SCROLLING);
const aura::Window::Windows& windows = window_list_provider_->GetWindowList();
CHECK(windows.size() >= 2);
aura::Window::Windows::const_reverse_iterator iter = windows.rbegin();
aura::Window* current_window = *(iter);
+ CHECK(wm::IsActiveWindow(current_window));
if (delta > 0) {
right_window_ = current_window;
@@ -496,90 +280,43 @@ void SplitViewController::BezelScrollBegin(BezelController::Bezel bezel,
CHECK(left_window_);
CHECK(right_window_);
- // Calculate divider_scroll_start_position_
- gfx::Screen* screen = gfx::Screen::GetScreenFor(container_);
- const gfx::Rect& display_bounds =
- screen->GetDisplayNearestWindow(container_).bounds();
- gfx::Rect container_bounds = container_->GetBoundsInScreen();
- divider_scroll_start_position_ =
- delta > 0 ? display_bounds.x() - container_bounds.x()
- : display_bounds.right() - container_bounds.x();
-
- divider_position_ = divider_scroll_start_position_ + delta;
+ UpdateSeparatorPositionFromScrollDelta(delta);
UpdateLayout(false);
}
-void SplitViewController::BezelScrollEnd() {
+void SplitViewController::ScrollEnd() {
if (state_ != SCROLLING)
return;
// Max distance from the scroll end position to the middle of the screen where
// we would go into the split view mode.
const int kMaxDistanceFromMiddle = 120;
- const int default_divider_position = GetDefaultDividerPosition();
- if (std::abs(default_divider_position - divider_position_) <=
+ int container_width = container_->GetBoundsInScreen().width();
+ if (std::abs(container_width / 2 - separator_position_) <=
kMaxDistanceFromMiddle) {
- divider_position_ = default_divider_position;
SetState(ACTIVE);
- } else if (divider_position_ < default_divider_position) {
- divider_position_ = 0;
+ separator_position_ = container_width / 2;
+ } else if (separator_position_ < container_width / 2) {
+ separator_position_ = 0;
SetState(INACTIVE);
wm::ActivateWindow(right_window_);
} else {
- divider_position_ = container_->GetBoundsInScreen().width();
+ separator_position_ = container_width;
SetState(INACTIVE);
wm::ActivateWindow(left_window_);
}
UpdateLayout(true);
}
-void SplitViewController::BezelScrollUpdate(float delta) {
+void SplitViewController::ScrollUpdate(float delta) {
if (state_ != SCROLLING)
return;
- divider_position_ = divider_scroll_start_position_ + delta;
+ UpdateSeparatorPositionFromScrollDelta(delta);
UpdateLayout(false);
}
-bool SplitViewController::BezelCanScroll() {
+bool SplitViewController::CanScroll() {
return CanActivateSplitViewMode();
}
-///////////////////////////////////////////////////////////////////////////////
-// DragHandleScrollDelegate:
-
-void SplitViewController::HandleScrollBegin(float delta) {
- CHECK(state_ == ACTIVE);
- state_ = SCROLLING;
- divider_scroll_start_position_ = GetDefaultDividerPosition();
- divider_position_ = divider_scroll_start_position_ + delta;
- UpdateLayout(false);
-}
-
-void SplitViewController::HandleScrollEnd() {
- BezelScrollEnd();
-}
-
-void SplitViewController::HandleScrollUpdate(float delta) {
- BezelScrollUpdate(delta);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// WindowManagerObserver:
-
-void SplitViewController::OnOverviewModeEnter() {
- if (divider_widget_)
- HideDivider();
-}
-
-void SplitViewController::OnOverviewModeExit() {
- if (state_ != INACTIVE)
- ShowDivider();
-}
-
-void SplitViewController::OnSplitViewModeEnter() {
-}
-
-void SplitViewController::OnSplitViewModeExit() {
-}
-
} // namespace athena
diff --git a/athena/wm/split_view_controller.h b/athena/wm/split_view_controller.h
index e41b389..5e87918 100644
--- a/athena/wm/split_view_controller.h
+++ b/athena/wm/split_view_controller.h
@@ -6,9 +6,7 @@
#define ATHENA_WM_SPLIT_VIEW_CONTROLLER_H_
#include "athena/athena_export.h"
-#include "athena/util/drag_handle.h"
#include "athena/wm/bezel_controller.h"
-#include "athena/wm/public/window_manager_observer.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
@@ -17,26 +15,13 @@ class Rect;
class Transform;
}
-namespace aura {
-class ScopedWindowTargeter;
-class Window;
-class WindowTargeter;
-}
-
-namespace views {
-class ViewTargeterDelegate;
-class Widget;
-}
-
namespace athena {
class WindowListProvider;
// Responsible for entering split view mode, exiting from split view mode, and
// laying out the windows in split view mode.
class ATHENA_EXPORT SplitViewController
- : public BezelController::ScrollDelegate,
- public DragHandleScrollDelegate,
- public WindowManagerObserver {
+ : public BezelController::ScrollDelegate {
public:
SplitViewController(aura::Window* container,
WindowListProvider* window_list_provider);
@@ -60,10 +45,12 @@ class ATHENA_EXPORT SplitViewController
void ReplaceWindow(aura::Window* window,
aura::Window* replace_with);
- // Returns the bounds of the left and right parts of the |container_| based
- // on the current value of |divider_position_|.
- gfx::Rect GetLeftAreaBounds();
- gfx::Rect GetRightAreaBounds();
+ // Returns the bounds that the left and right windows will have once split
+ // view is active and they are done animating. If |left_window_| and
+ // |right_window_| are still animating this may be different than their
+ // current bounds.
+ gfx::Rect GetLeftTargetBounds();
+ gfx::Rect GetRightTargetBounds();
aura::Window* left_window() { return left_window_; }
aura::Window* right_window() { return right_window_; }
@@ -74,7 +61,7 @@ class ATHENA_EXPORT SplitViewController
// NULL.
INACTIVE,
// Two windows |left_window_| and |right_window| are shown side by side and
- // there is a horizontal scroll in progress which is dragging the divider
+ // there is a horizontal scroll in progress which is dragging the separator
// between the two windows.
SCROLLING,
// Split View mode is active with |left_window_| and |right_window| showing
@@ -83,42 +70,22 @@ class ATHENA_EXPORT SplitViewController
};
void SetState(State state);
-
- void InitializeDivider();
- void HideDivider();
- void ShowDivider();
-
void UpdateLayout(bool animate);
void SetWindowTransforms(const gfx::Transform& left_transform,
const gfx::Transform& right_transform,
- const gfx::Transform& divider_transform,
bool animate);
// Called when the animation initiated by SetWindowTransforms() completes.
void OnAnimationCompleted();
- // Returns the default divider position for when the split view mode is
- // active and the divider is not being dragged.
- int GetDefaultDividerPosition();
+ void UpdateSeparatorPositionFromScrollDelta(float delta);
// BezelController::ScrollDelegate:
- virtual void BezelScrollBegin(BezelController::Bezel bezel,
- float delta) OVERRIDE;
- virtual void BezelScrollEnd() OVERRIDE;
- virtual void BezelScrollUpdate(float delta) OVERRIDE;
- virtual bool BezelCanScroll() OVERRIDE;
-
- // DragHandleScrollDelegate:
- virtual void HandleScrollBegin(float delta) OVERRIDE;
- virtual void HandleScrollEnd() OVERRIDE;
- virtual void HandleScrollUpdate(float delta) OVERRIDE;
-
- // WindowManagerObserver:
- virtual void OnOverviewModeEnter() OVERRIDE;
- virtual void OnOverviewModeExit() OVERRIDE;
- virtual void OnSplitViewModeEnter() OVERRIDE;
- virtual void OnSplitViewModeExit() OVERRIDE;
+ virtual void ScrollBegin(BezelController::Bezel bezel, float delta) OVERRIDE;
+ virtual void ScrollEnd() OVERRIDE;
+ virtual void ScrollUpdate(float delta) OVERRIDE;
+ virtual bool CanScroll() OVERRIDE;
State state_;
@@ -132,23 +99,9 @@ class ATHENA_EXPORT SplitViewController
aura::Window* left_window_;
aura::Window* right_window_;
- // X-Coordinate of the (center of the) divider between left_window_ and
- // right_window_ in |container_| coordinates.
- int divider_position_;
-
- // Meaningful only when state_ is SCROLLING.
- // X-Coordinate of the divider when the scroll started.
- int divider_scroll_start_position_;
-
- // Visually separates the windows and contains the drag handle.
- views::Widget* divider_widget_;
-
- // The drag handle which can be used when split view is active to exit the
- // split view mode.
- views::View* drag_handle_;
-
- scoped_ptr<aura::ScopedWindowTargeter> window_targeter_;
- scoped_ptr<views::ViewTargeterDelegate> view_targeter_delegate_;
+ // Position of the separator between left_window_ and right_window_ in
+ // container_ coordinates (along the x axis).
+ int separator_position_;
// Windows which should be hidden when the animation initiated by
// UpdateLayout() completes.
diff --git a/athena/wm/window_manager_impl.cc b/athena/wm/window_manager_impl.cc
index 7c7df9e..eb370c5 100644
--- a/athena/wm/window_manager_impl.cc
+++ b/athena/wm/window_manager_impl.cc
@@ -149,7 +149,6 @@ WindowManagerImpl::WindowManagerImpl() {
bezel_controller_.reset(new BezelController(container_.get()));
split_view_controller_.reset(
new SplitViewController(container_.get(), window_list_provider_.get()));
- AddObserver(split_view_controller_.get());
bezel_controller_->set_left_right_delegate(split_view_controller_.get());
container_->AddPreTargetHandler(bezel_controller_.get());
title_drag_controller_.reset(new TitleDragController(container_.get(), this));
@@ -163,7 +162,6 @@ WindowManagerImpl::WindowManagerImpl() {
WindowManagerImpl::~WindowManagerImpl() {
overview_.reset();
- RemoveObserver(split_view_controller_.get());
split_view_controller_.reset();
window_list_provider_.reset();
if (container_) {
diff --git a/athena/wm/window_manager_unittest.cc b/athena/wm/window_manager_unittest.cc
index 0723148..9bcb5b8 100644
--- a/athena/wm/window_manager_unittest.cc
+++ b/athena/wm/window_manager_unittest.cc
@@ -318,8 +318,8 @@ TEST_F(WindowManagerTest, SplitModeActivationByShortcut) {
int width =
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().width();
- EXPECT_EQ(w1->bounds().width(), w2->bounds().width());
- EXPECT_GE(width / 2, w1->bounds().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);