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

Unified Diff: athena/wm/window_manager_impl.cc

Issue 420603011: Split Screen mode implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@split_view
Patch Set: Created 6 years, 5 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: athena/wm/window_manager_impl.cc
diff --git a/athena/wm/window_manager_impl.cc b/athena/wm/window_manager_impl.cc
index a5bbf53b990b895244aa2bc9d6a69c7e023d8381..08eac8bbd7778cfc5a722da7b22892b7f62faee4 100644
--- a/athena/wm/window_manager_impl.cc
+++ b/athena/wm/window_manager_impl.cc
@@ -10,6 +10,7 @@
#include "athena/wm/public/window_manager_observer.h"
#include "athena/wm/split_view_controller.h"
#include "athena/wm/window_overview_mode.h"
+#include "athena/wm/window_stack_provider.h"
#include "base/logging.h"
#include "base/observer_list.h"
#include "ui/aura/layout_manager.h"
@@ -20,6 +21,7 @@ namespace athena {
namespace {
class WindowManagerImpl : public WindowManager,
+ public WindowStackProvider,
public WindowOverviewModeDelegate,
public aura::WindowObserver,
public AcceleratorHandler {
@@ -31,17 +33,28 @@ class WindowManagerImpl : public WindowManager,
// WindowManager:
virtual void ToggleOverview() OVERRIDE {
+ LOG(ERROR) << "ToggleOverview";
if (overview_) {
Jun Mukai 2014/07/25 20:21:30 Keep in mind that pkotwicz is changing the code ar
- overview_.reset();
FOR_EACH_OBSERVER(WindowManagerObserver, observers_,
OnOverviewModeExit());
+ overview_.reset();
} else {
- overview_ = WindowOverviewMode::Create(container_.get(), this);
+ // Re-stack all windows in the order defined by ordered_windows_.
+ aura::Window::Windows::iterator it;
+ for (it = ordered_windows_.begin(); it != ordered_windows_.end(); ++it) {
+ container_->StackChildAtTop(*it);
+ }
FOR_EACH_OBSERVER(WindowManagerObserver, observers_,
OnOverviewModeEnter());
+ overview_ =
+ WindowOverviewMode::Create(container_.get(), GetWindowStack(), this);
}
}
+ virtual bool IsOverviewModeActive() OVERRIDE {
+ return overview_;
+ }
+
private:
enum Command {
COMMAND_TOGGLE_OVERVIEW,
@@ -65,10 +78,24 @@ class WindowManagerImpl : public WindowManager,
observers_.RemoveObserver(observer);
}
- // WindowOverviewModeDelegate:
- virtual void OnSelectWindow(aura::Window* window) OVERRIDE {
+ // WindowStackProvider:
+ virtual void MoveWindowToFront(aura::Window* window) OVERRIDE{
CHECK_EQ(container_.get(), window->parent());
+ aura::Window::Windows::iterator it = std::find(
+ ordered_windows_.begin(), ordered_windows_.end(), window);
+ DCHECK(it != ordered_windows_.end());
+ ordered_windows_.erase(it);
+ ordered_windows_.push_back(window);
container_->StackChildAtTop(window);
oshima 2014/07/28 17:58:43 This should have called wm::ActivateWindow instead
mfomitchev 2014/08/05 19:56:57 Done.
+ }
+
+ virtual const aura::Window::Windows& GetWindowStack() OVERRIDE {
+ return ordered_windows_;
+ }
+
+ // WindowOverviewModeDelegate:
+ virtual void OnSelectWindow(aura::Window* window) OVERRIDE {
+ MoveWindowToFront(window);
overview_.reset();
FOR_EACH_OBSERVER(WindowManagerObserver, observers_,
OnOverviewModeExit());
@@ -80,6 +107,16 @@ class WindowManagerImpl : public WindowManager,
container_.reset();
}
+ virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE {
+ aura::Window::Windows::iterator it = std::find(
+ ordered_windows_.begin(), ordered_windows_.end(), window);
+ ordered_windows_.erase(it);
+ }
+
+ virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE {
+ ordered_windows_.push_back(new_window);
+ }
+
// AcceleratorHandler:
virtual bool IsCommandEnabled(int command_id) const OVERRIDE { return true; }
virtual bool OnAcceleratorFired(int command_id,
@@ -93,6 +130,7 @@ class WindowManagerImpl : public WindowManager,
}
scoped_ptr<aura::Window> container_;
+ aura::Window::Windows ordered_windows_;
oshima 2014/07/25 21:41:10 what's the reason to keep its own list?
mfomitchev 2014/07/25 23:27:38 The order within the container changes when you in
oshima 2014/07/28 17:58:42 StackChildAtTop does change the order within the c
mfomitchev 2014/07/28 18:15:00 I can't rely on the container's window order for t
oshima 2014/07/28 18:35:20 I know that container's window order isn't enough
mfomitchev 2014/07/28 18:57:42 SplitViewController implements window switching -
mfomitchev 2014/08/05 19:56:57 I have implemented a very basic, stripped down Mru
scoped_ptr<WindowOverviewMode> overview_;
scoped_ptr<BezelController> bezel_controller_;
scoped_ptr<SplitViewController> split_view_controller_;
@@ -138,7 +176,8 @@ WindowManagerImpl::WindowManagerImpl() {
container_->SetLayoutManager(new AthenaContainerLayoutManager);
container_->AddObserver(this);
bezel_controller_.reset(new BezelController(container_.get()));
- split_view_controller_.reset(new SplitViewController());
+ split_view_controller_.reset(new SplitViewController(
+ container_.get(), this, this));
bezel_controller_->set_left_right_delegate(split_view_controller_.get());
container_->AddPreTargetHandler(bezel_controller_.get());
instance = this;

Powered by Google App Engine
This is Rietveld 408576698