Index: athena/screen/screen_manager_impl.cc |
diff --git a/athena/screen/screen_manager_impl.cc b/athena/screen/screen_manager_impl.cc |
index acc367bb2bfbcd451436df66166fd4acf7bf05e6..9faa7482e36d9611ef4eef8bb92ed57200a521ee 100644 |
--- a/athena/screen/screen_manager_impl.cc |
+++ b/athena/screen/screen_manager_impl.cc |
@@ -4,6 +4,7 @@ |
#include "athena/screen/public/screen_manager.h" |
+#include "athena/common/container_priorities.h" |
#include "athena/common/fill_layout_manager.h" |
#include "athena/input/public/accelerator_manager.h" |
#include "athena/screen/background_controller.h" |
@@ -127,10 +128,24 @@ class ScreenManagerImpl : public ScreenManager { |
DISALLOW_COPY_AND_ASSIGN(ScreenManagerImpl); |
}; |
+ScreenManagerImpl::ScreenManagerImpl(aura::Window* root_window) |
+ : root_window_(root_window) { |
+ DCHECK(root_window_); |
+ DCHECK(!instance); |
+ instance = this; |
+} |
+ |
+ScreenManagerImpl::~ScreenManagerImpl() { |
+ aura::client::SetScreenPositionClient(root_window_, NULL); |
+ aura::client::SetWindowTreeClient(root_window_, NULL); |
+ instance = NULL; |
+} |
+ |
void ScreenManagerImpl::Init() { |
// TODO(oshima): Move the background out from ScreenManager. |
root_window_->SetLayoutManager(new FillLayoutManager(root_window_)); |
- background_window_ = CreateContainer(ContainerParams("AthenaBackground")); |
+ background_window_ = |
+ CreateContainer(ContainerParams("AthenaBackground", CP_BACKGROUND)); |
background_window_->SetLayoutManager( |
new FillLayoutManager(background_window_)); |
@@ -153,14 +168,54 @@ aura::Window* ScreenManagerImpl::CreateDefaultContainer( |
return container; |
} |
+// A functor to find a container that has the higher priority. |
+struct HigherPriorityFinder { |
+ HigherPriorityFinder(int p) : priority(p) {} |
+ bool operator()(aura::Window* window) { |
+ return window->GetProperty(kContainerParamsKey)->z_order_priority > |
+ priority; |
+ } |
+ int priority; |
+}; |
+ |
+#if !defined(NDEBUG) |
+struct PriorityMatcher { |
+ PriorityMatcher(int p) : priority(p) {} |
+ bool operator()(aura::Window* window) { |
+ return window->GetProperty(kContainerParamsKey)->z_order_priority == |
+ priority; |
+ } |
+ int priority; |
+}; |
+#endif |
+ |
aura::Window* ScreenManagerImpl::CreateContainer( |
const ContainerParams& params) { |
aura::Window* container = new aura::Window(NULL); |
+ CHECK_GE(params.z_order_priority, 0); |
container->Init(aura::WINDOW_LAYER_NOT_DRAWN); |
container->SetName(params.name); |
+ |
+ const aura::Window::Windows& children = root_window_->children(); |
+ |
+ DCHECK(std::find_if(children.begin(), |
+ children.end(), |
+ PriorityMatcher(params.z_order_priority)) |
+ == children.end()) |
+ << "The container with the priority " |
+ << params.z_order_priority << " already exists."; |
sadrul
2014/07/23 18:37:24
nice
|
+ |
+ container->SetProperty(kContainerParamsKey, new ContainerParams(params)); |
root_window_->AddChild(container); |
+ |
+ aura::Window::Windows::const_iterator iter = |
+ std::find_if(children.begin(), |
+ children.end(), |
+ HigherPriorityFinder(params.z_order_priority)); |
+ if (iter != children.end()) |
+ root_window_->StackChildBelow(container, *iter); |
+ |
container->Show(); |
- container->SetProperty(kContainerParamsKey, new ContainerParams(params)); |
return container; |
} |
@@ -168,24 +223,11 @@ void ScreenManagerImpl::SetBackgroundImage(const gfx::ImageSkia& image) { |
background_controller_->SetImage(image); |
} |
-ScreenManagerImpl::ScreenManagerImpl(aura::Window* root_window) |
- : root_window_(root_window) { |
- DCHECK(root_window_); |
- DCHECK(!instance); |
- instance = this; |
-} |
- |
-ScreenManagerImpl::~ScreenManagerImpl() { |
- aura::client::SetScreenPositionClient(root_window_, NULL); |
- aura::client::SetWindowTreeClient(root_window_, NULL); |
- instance = NULL; |
-} |
- |
} // namespace |
-ScreenManager::ContainerParams::ContainerParams(const std::string& n) |
- : name(n), |
- can_activate_children(false) { |
+ScreenManager::ContainerParams::ContainerParams(const std::string& n, |
+ int priority) |
+ : name(n), can_activate_children(false), z_order_priority(priority) { |
} |
// static |