Chromium Code Reviews| Index: services/ui/service.cc |
| diff --git a/services/ui/service.cc b/services/ui/service.cc |
| index b7ff96918dc2a27bcbf7f241e2a52e78dbdd7947..ada338c46c813b4c991435124456c8e105bdd193 100644 |
| --- a/services/ui/service.cc |
| +++ b/services/ui/service.cc |
| @@ -42,6 +42,7 @@ |
| #include "ui/base/platform_window_defaults.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/base/ui_base_paths.h" |
| +#include "ui/display/screen_base.h" |
| #include "ui/events/event_switches.h" |
| #include "ui/events/platform/platform_event_source.h" |
| #include "ui/gfx/geometry/rect.h" |
| @@ -52,6 +53,7 @@ |
| #include "ui/base/x/x11_util.h" // nogncheck |
| #include "ui/platform_window/x11/x11_window.h" |
| #elif defined(USE_OZONE) |
| +#include "services/ui/display/screen_manager_forwarding.h" |
| #include "ui/events/ozone/layout/keyboard_layout_engine.h" |
| #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" |
| #include "ui/ozone/public/ozone_platform.h" |
| @@ -86,7 +88,6 @@ struct Service::UserState { |
| Service::Service() |
| : test_config_(false), |
| - screen_manager_(display::ScreenManager::Create()), |
| ime_registrar_(&ime_server_) {} |
| Service::~Service() { |
| @@ -98,6 +99,9 @@ Service::~Service() { |
| #if defined(USE_OZONE) |
| OzonePlatform::Shutdown(); |
| #endif |
| + |
| + if (screen_) |
| + display::Screen::SetScreenInstance(nullptr); |
| } |
| void Service::InitializeResources(service_manager::Connector* connector) { |
| @@ -220,8 +224,6 @@ void Service::OnStart() { |
| if (input_device_server_.IsRegisteredAsObserver()) |
| input_device_server_.AddInterface(®istry_); |
| - screen_manager_->AddInterfaces(®istry_); |
| - |
| #if defined(USE_OZONE) |
| ui::OzonePlatform::GetInstance()->AddInterfaces(®istry_); |
| #endif |
| @@ -235,7 +237,10 @@ void Service::OnBindInterface(const service_manager::ServiceInfo& source_info, |
| } |
| void Service::StartDisplayInit() { |
| - screen_manager_->Init(window_server_->display_manager()); |
| + DCHECK(!is_gpu_ready_); // This should only be called once. |
| + is_gpu_ready_ = true; |
| + if (screen_manager_) |
| + screen_manager_->Init(window_server_->display_manager()); |
| } |
| void Service::OnFirstDisplayReady() { |
| @@ -261,6 +266,36 @@ bool Service::IsTestConfig() const { |
| return test_config_; |
| } |
| +void Service::OnWillCreateTreeForWindowManager( |
|
kylechar
2017/04/19 18:06:08
What's the expected order that StartDisplayInit()
sky
2017/04/19 19:30:03
You are correct. One is not guaranteed to be calle
|
| + bool automatically_create_display_roots) { |
| + if (screen_manager_config_ != ScreenManagerConfig::UNKNOWN) |
| + return; |
| + |
| + DVLOG(3) << "OnWillCreateTreeForWindowManager " |
| + << automatically_create_display_roots; |
| + screen_manager_config_ = automatically_create_display_roots |
| + ? ScreenManagerConfig::INTERNAL |
| + : ScreenManagerConfig::FORWARDING; |
| + if (screen_manager_config_ == ScreenManagerConfig::FORWARDING) { |
| + screen_ = base::MakeUnique<display::ScreenBase>(); |
| + display::Screen::SetScreenInstance(screen_.get()); |
| +#if defined(USE_OZONE) |
| + screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>(); |
| +#else |
| + CHECK(false); |
| +#endif |
| + } else { |
| + screen_manager_ = display::ScreenManager::Create(); |
| + } |
| + screen_manager_->AddInterfaces(®istry_); |
| + if (is_gpu_ready_) |
| + screen_manager_->Init(window_server_->display_manager()); |
| +} |
| + |
| +display::ScreenBase* Service::GetScreen() { |
| + return screen_.get(); |
| +} |
| + |
| void Service::Create(const service_manager::Identity& remote_identity, |
| mojom::AccessibilityManagerRequest request) { |
| UserState* user_state = GetUserState(remote_identity); |