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); |