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

Unified Diff: services/ui/demo/mus_demo.cc

Issue 2622103004: Mus Demo: Demonstrate external window mode (Closed)
Patch Set: Rebase on top of 2679213003 and excluding 2645093003 Created 3 years, 10 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
« no previous file with comments | « services/ui/demo/mus_demo.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/demo/mus_demo.cc
diff --git a/services/ui/demo/mus_demo.cc b/services/ui/demo/mus_demo.cc
index 0fbcd356c25475ef3794f4687541853891d9582f..1cfb2619fbbb91c4846312cf6bb520db0af36002 100644
--- a/services/ui/demo/mus_demo.cc
+++ b/services/ui/demo/mus_demo.cc
@@ -4,11 +4,13 @@
#include "services/ui/demo/mus_demo.h"
+#include "base/command_line.h"
#include "base/memory/ptr_util.h"
#include "base/time/time.h"
#include "services/service_manager/public/cpp/connector.h"
#include "services/service_manager/public/cpp/service_context.h"
#include "services/ui/public/cpp/gpu/gpu.h"
+#include "services/ui/public/interfaces/constants.mojom.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
@@ -67,6 +69,55 @@ void DrawSquare(const gfx::Rect& bounds, double angle, SkCanvas* canvas) {
} // namespace
+class MusDemo::WindowTreeData {
+ public:
+ explicit WindowTreeData(
+ std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) {
+ Init(std::move(window_tree_host));
+ }
+ explicit WindowTreeData(mojom::WindowTreeHostFactory* factory,
+ mojom::WindowTreeClientPtr tree_client) {
+ factory->CreateWindowTreeHost(MakeRequest(&host_), std::move(tree_client));
+ }
+ ~WindowTreeData();
+
+ // Initializes the window tree host and start drawing frames.
+ void Init(std::unique_ptr<aura::WindowTreeHostMus> window_tree_host);
+
+ private:
+ bool IsInitialized() { return !!window_tree_host_; }
+
+ // Draws one frame, incrementing the rotation angle.
+ void DrawFrame();
+
+ // The Window tree host corresponding to this data.
+ // When the WindowTreeData is created with WindowTreeHostFactory, it remains
+ // null until an explicit call to Init.
+ std::unique_ptr<aura::WindowTreeHostMus> window_tree_host_;
+
+ // When the WindowTreeData is created with WindowTreeHostFactory, this holds
+ // the Mojo pointer to the window tree host.
+ mojom::WindowTreeHostPtr host_;
+
+ // Root window of the window tree host.
+ aura::Window* root_window_ = nullptr;
+
+ // Window to which we draw the bitmap.
+ std::unique_ptr<aura::Window> bitmap_window_;
+
+ // Destroys itself when the window gets destroyed.
+ aura_extra::ImageWindowDelegate* window_delegate_ = nullptr;
+
+ // Timer for calling DrawFrame().
+ base::RepeatingTimer timer_;
+
+ // Current rotation angle for drawing.
+ double angle_ = 0.0;
+
+ // Last time a frame was drawn.
+ base::TimeTicks last_draw_frame_time_;
+};
+
MusDemo::MusDemo() {}
MusDemo::~MusDemo() {
@@ -74,6 +125,8 @@ MusDemo::~MusDemo() {
}
void MusDemo::OnStart() {
+ external_window_mode_ =
+ base::CommandLine::ForCurrentProcess()->HasSwitch("external-window-mode");
screen_ = base::MakeUnique<display::ScreenBase>();
display::Screen::SetScreenInstance(screen_.get());
@@ -82,9 +135,21 @@ void MusDemo::OnStart() {
property_converter_ = base::MakeUnique<aura::PropertyConverter>();
wm_state_ = base::MakeUnique<::wm::WMState>();
- window_tree_client_ = base::MakeUnique<aura::WindowTreeClient>(
- context()->connector(), this, this);
- window_tree_client_->ConnectAsWindowManager();
+ if (external_window_mode_) {
+ context()->connector()->BindInterface(ui::mojom::kServiceName,
+ &window_tree_host_factory_);
+ mojom::WindowTreeClientPtr tree_client;
+ window_tree_client_ = base::MakeUnique<aura::WindowTreeClient>(
rjkroege 2017/02/09 18:03:53 I would like mus demo to not depend on aura in eit
fwang 2017/02/09 18:50:38 I'm not sure I understand this comment. Mus demo h
+ context()->connector(), this, this, MakeRequest(&tree_client));
+ window_tree_data_ = base::MakeUnique<WindowTreeData>(
+ window_tree_host_factory_.get(), std::move(tree_client));
+ // TODO: Management of display (CL 2645093003 and 2684623002)?
rjkroege 2017/02/09 18:03:53 Need a ScreenManagerOzoneExternal I would think. P
+ // TODO: Demo of two external windows.
+ } else {
+ window_tree_client_ = base::MakeUnique<aura::WindowTreeClient>(
+ context()->connector(), this, this);
+ window_tree_client_->ConnectAsWindowManager();
+ }
env_->SetWindowTreeClient(window_tree_client_.get());
}
@@ -96,8 +161,9 @@ bool MusDemo::OnConnect(const service_manager::ServiceInfo& remote_info,
void MusDemo::OnEmbed(
std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) {
- // Not called for the WindowManager.
- NOTREACHED();
+ DCHECK(external_window_mode_);
+ DCHECK(window_tree_data_);
+ window_tree_data_->Init(std::move(window_tree_host));
}
void MusDemo::OnUnembed(aura::Window* root) {
@@ -105,14 +171,13 @@ void MusDemo::OnUnembed(aura::Window* root) {
}
void MusDemo::OnEmbedRootDestroyed(aura::WindowTreeHostMus* window_tree_host) {
- // Not called for the WindowManager.
- NOTREACHED();
+ DCHECK(external_window_mode_);
+ window_tree_data_.reset();
}
void MusDemo::OnLostConnection(aura::WindowTreeClient* client) {
- root_window_ = nullptr;
window_tree_client_.reset();
- timer_.Stop();
+ window_tree_data_.reset();
}
void MusDemo::OnPointerEventObserved(const PointerEvent& event,
@@ -157,8 +222,14 @@ void MusDemo::OnWmWillCreateDisplay(const display::Display& display) {
void MusDemo::OnWmNewDisplay(
std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
const display::Display& display) {
- DCHECK(!root_window_); // Only support one display.
+ DCHECK(!external_window_mode_);
+ DCHECK(!window_tree_data_); // Only support one display.
+ window_tree_data_ =
+ base::MakeUnique<WindowTreeData>(std::move(window_tree_host));
+}
+void MusDemo::WindowTreeData::Init(
+ std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) {
window_tree_host->InitHost();
window_tree_host->Show();
root_window_ = window_tree_host->window();
@@ -178,13 +249,19 @@ void MusDemo::OnWmNewDisplay(
// Draw initial frame and start the timer to regularly draw frames.
DrawFrame();
timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kFrameDelay),
- base::Bind(&MusDemo::DrawFrame, base::Unretained(this)));
+ base::Bind(&WindowTreeData::DrawFrame, base::Unretained(this)));
}
void MusDemo::OnWmDisplayRemoved(aura::WindowTreeHostMus* window_tree_host) {
- timer_.Stop();
- root_window_->RemoveChild(bitmap_window_.get());
- bitmap_window_.reset();
+ window_tree_data_.reset();
+}
+
+MusDemo::WindowTreeData::~WindowTreeData() {
+ if (IsInitialized()) {
+ timer_.Stop();
+ root_window_->RemoveChild(bitmap_window_.get());
+ bitmap_window_.reset();
+ }
}
void MusDemo::OnWmDisplayModified(const display::Display& display) {}
@@ -211,7 +288,7 @@ bool MusDemo::IsWindowActive(aura::Window* window) { return false; }
void MusDemo::OnWmDeactivateWindow(aura::Window* window) {}
-void MusDemo::DrawFrame() {
+void MusDemo::WindowTreeData::DrawFrame() {
base::TimeTicks now = base::TimeTicks::Now();
VLOG(1) << (now - last_draw_frame_time_).InMilliseconds()
« no previous file with comments | « services/ui/demo/mus_demo.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698