Index: mash/wm/window_manager_application.cc |
diff --git a/mash/wm/window_manager_application.cc b/mash/wm/window_manager_application.cc |
index 742a54d76f6e398c5cb82c92d04d99f2af6ad390..8c514ed4cfeb6920c6a19e9d8eed233e28c2dece 100644 |
--- a/mash/wm/window_manager_application.cc |
+++ b/mash/wm/window_manager_application.cc |
@@ -12,6 +12,7 @@ |
#include "components/mus/public/interfaces/window_manager_factory.mojom.h" |
#include "mash/wm/accelerator_registrar_impl.h" |
#include "mash/wm/root_window_controller.h" |
+#include "mash/wm/root_windows_observer.h" |
#include "mash/wm/user_window_controller_impl.h" |
#include "mojo/services/tracing/public/cpp/tracing_impl.h" |
#include "mojo/shell/public/cpp/application_connection.h" |
@@ -27,10 +28,25 @@ WindowManagerApplication::WindowManagerApplication() |
: app_(nullptr), window_manager_factory_binding_(this) {} |
WindowManagerApplication::~WindowManagerApplication() { |
+ // AcceleratorRegistrarImpl removes an observer in its destructor. Destroy |
+ // it early on. |
+ std::set<AcceleratorRegistrarImpl*> accelerator_registrars( |
+ accelerator_registrars_); |
+ for (AcceleratorRegistrarImpl* registrar : accelerator_registrars) |
+ registrar->Destroy(); |
+ |
std::set<RootWindowController*> controllers(root_controllers_); |
- std::for_each( |
- controllers.begin(), controllers.end(), |
- [](RootWindowController* controller) { controller->Destroy(); }); |
+ for (RootWindowController* controller : controllers) |
+ controller->Destroy(); |
+} |
+ |
+std::set<RootWindowController*> WindowManagerApplication::GetRootControllers() { |
+ std::set<RootWindowController*> root_controllers; |
+ for (RootWindowController* controller : root_controllers_) { |
+ if (controller->root()) |
+ root_controllers.insert(controller); |
+ } |
+ return root_controllers; |
} |
void WindowManagerApplication::OnRootWindowControllerGotRoot( |
@@ -51,6 +67,9 @@ void WindowManagerApplication::OnRootWindowControllerDoneInit( |
user_window_controller_binding_.AddBinding(user_window_controller_.get(), |
std::move(*request)); |
user_window_controller_requests_.clear(); |
+ |
+ FOR_EACH_OBSERVER(RootWindowsObserver, root_windows_observers_, |
+ OnRootWindowControllerAdded(root_controller)); |
} |
void WindowManagerApplication::OnRootWindowDestroyed( |
@@ -69,6 +88,16 @@ void WindowManagerApplication::OnAccelerator(uint32_t id, |
} |
} |
+void WindowManagerApplication::AddRootWindowsObserver( |
+ RootWindowsObserver* observer) { |
+ root_windows_observers_.AddObserver(observer); |
+} |
+ |
+void WindowManagerApplication::RemoveRootWindowsObserver( |
+ RootWindowsObserver* observer) { |
+ root_windows_observers_.RemoveObserver(observer); |
+} |
+ |
void WindowManagerApplication::OnAcceleratorRegistrarDestroyed( |
AcceleratorRegistrarImpl* registrar) { |
accelerator_registrars_.erase(registrar); |
@@ -112,8 +141,6 @@ void WindowManagerApplication::Create( |
void WindowManagerApplication::Create( |
mojo::ApplicationConnection* connection, |
mojo::InterfaceRequest<mus::mojom::AcceleratorRegistrar> request) { |
- // TODO(sky): figure out the right place for this code. Should it |
- // automatically register for all displays? |
static int accelerator_registrar_count = 0; |
if (accelerator_registrar_count == std::numeric_limits<int>::max()) { |
// Restart from zero if we have reached the limit. It is technically |
@@ -123,11 +150,8 @@ void WindowManagerApplication::Create( |
// install accelerators. |
accelerator_registrar_count = 0; |
} |
- // TODO(sky): make global. |
- RootWindowController* root_controller = *root_controllers_.begin(); |
accelerator_registrars_.insert(new AcceleratorRegistrarImpl( |
- root_controller->window_tree_host(), ++accelerator_registrar_count, |
- std::move(request), |
+ this, ++accelerator_registrar_count, std::move(request), |
base::Bind(&WindowManagerApplication::OnAcceleratorRegistrarDestroyed, |
base::Unretained(this)))); |
} |