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

Unified Diff: services/ui/public/cpp/window.cc

Issue 2369793002: WIP: Propagate SurfaceID up window tree hierarchy
Patch Set: Fix input events: EventDispatcher ignores container windows Created 4 years, 3 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/public/cpp/window.h ('k') | services/ui/public/cpp/window_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/public/cpp/window.cc
diff --git a/services/ui/public/cpp/window.cc b/services/ui/public/cpp/window.cc
index 81f07e148d87aba1b4f5beadab8273de636d86c7..dd331bb011f4ed64d068caa932a19c94b0e9c8e3 100644
--- a/services/ui/public/cpp/window.cc
+++ b/services/ui/public/cpp/window.cc
@@ -11,7 +11,13 @@
#include <string>
#include "base/bind.h"
+#include "base/containers/adapters.h"
#include "base/macros.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/quads/render_pass.h"
+#include "cc/quads/render_pass_draw_quad.h"
+#include "cc/quads/shared_quad_state.h"
+#include "cc/quads/surface_draw_quad.h"
#include "services/ui/common/transient_window_utils.h"
#include "services/ui/public/cpp/property_type_converters.h"
#include "services/ui/public/cpp/window_observer.h"
@@ -515,10 +521,20 @@ std::string Window::GetName() const {
////////////////////////////////////////////////////////////////////////////////
// Window, protected:
-Window::Window() : Window(nullptr, static_cast<Id>(-1)) {}
+Window::Window(bool container)
+ : Window(nullptr, static_cast<Id>(-1), container) {}
Window::~Window() {
FOR_EACH_OBSERVER(WindowObserver, observers_, OnWindowDestroying(this));
+ if (!surface_info_.surface_id.is_null()) {
+ // If the existing surface ID is non-null, then we should return the
+ // existing SurfaceSequence.
+ if (client_) {
+ client_->SatisfySurfaceSequence(
+ server_id_, surface_info_.surface_sequence);
+ }
+ }
+
if (client_)
client_->OnWindowDestroying(this);
@@ -572,8 +588,9 @@ Window::~Window() {
////////////////////////////////////////////////////////////////////////////////
// Window, private:
-Window::Window(WindowTreeClient* client, Id id)
+Window::Window(WindowTreeClient* client, Id id, bool container)
: client_(client),
+ container_(container),
server_id_(id),
parent_(nullptr),
stacking_target_(nullptr),
@@ -586,7 +603,79 @@ Window::Window(WindowTreeClient* client, Id id)
opacity_(1.0f),
display_id_(display::Display::kInvalidDisplayID),
cursor_id_(mojom::Cursor::CURSOR_NULL),
- parent_drawn_(false) {}
+ parent_drawn_(false),
+ draw_timer_(false, false),
+ weak_factory_(this) {
+ if (container) {
+ WantToDraw();
+ }
+}
+
+void Window::WantToDraw() {
+ if (draw_timer_.IsRunning())
+ return;
+
+ // TODO(rjkroege): Use vblank to kick off Draw.
+ draw_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(16),
+ base::Bind(&Window::Draw, weak_factory_.GetWeakPtr()));
+}
+
+void Window::Draw() {
+ if (!visible_)
+ return;
+
+ const cc::RenderPassId render_pass_id(1, 1);
+ std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
+ render_pass->SetNew(render_pass_id, bounds_, bounds_, gfx::Transform());
+
+ uint32_t children_drawn = 0;
+ for (Window* child : base::Reversed(children_)) {
+ if (child->surface_info_.surface_id.is_null())
+ continue;
+ children_drawn++;
+ gfx::Transform quad_to_target_transform;
+ quad_to_target_transform.Translate(child->bounds().x(),
+ child->bounds().y());
+ cc::SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState();
+ const gfx::Rect bounds_at_origin(child->bounds().size());
+ // TODO(fsamuel): These clipping and visible rects are incorrect. They need
+ // to be populated from CompositorFrame structs.
+ sqs->SetAll(quad_to_target_transform,
+ bounds_at_origin.size() /* layer_bounds */,
+ bounds_at_origin /* visible_layer_bounds */,
+ bounds_at_origin /* clip_rect */, false /* is_clipped */,
+ 1.f /* opacity */, SkXfermode::kSrcOver_Mode,
+ 0 /* sorting-context_id */);
+ auto* quad = render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
+ quad->SetAll(sqs, child->bounds() /* rect */, gfx::Rect() /* opaque_rect */,
+ bounds_at_origin /* visible_rect */, true /* needs_blending*/,
+ child->surface_info_.surface_id);
+ }
+ if (children_drawn) {
+ std::unique_ptr<cc::DelegatedFrameData> frame_data(
+ new cc::DelegatedFrameData);
+ frame_data->render_pass_list.push_back(std::move(render_pass));
+ cc::CompositorFrame frame;
+ frame.delegated_frame_data = std::move(frame_data);
+ if (!container_surface_) {
+ SetSharedProperty<bool>(
+ ui::mojom::WindowManager::kContainer_Property, true);
+ container_surface_ = RequestSurface(mojom::SurfaceType::DEFAULT);
+ container_surface_->BindToThread();
+ }
+ container_surface_->SubmitCompositorFrame(
+ std::move(frame), base::Bind(&base::DoNothing));
+ }
+
+ WantToDraw();
+}
+
+void Window::SetIsContainer() {
+ if (!container_) {
+ container_ = true;
+ WantToDraw();
+ }
+}
void Window::SetSharedPropertyInternal(const std::string& name,
const std::vector<uint8_t>* value) {
@@ -694,6 +783,28 @@ void Window::LocalSetBounds(const gfx::Rect& old_bounds,
bounds_ = new_bounds;
}
+void Window::LocalSetSurfaceId(const gfx::Size& size,
+ float device_scale_factor,
+ const cc::SurfaceId& surface_id,
+ const cc::SurfaceSequence& surface_sequence) {
+ const cc::SurfaceId& existing_surface_id = surface_info_.surface_id;
+ if (!existing_surface_id.is_null() && existing_surface_id != surface_id) {
+ // If the existing surface ID is non-null, then we should return the
+ // existing SurfaceSequence.
+ if (client_) {
+ client_->SatisfySurfaceSequence(
+ server_id_, surface_info_.surface_sequence);
+ }
+ }
+ surface_info_ = {size, device_scale_factor, surface_id, surface_sequence};
+ if (parent_) {
+ FOR_EACH_OBSERVER(
+ WindowObserver, observers_,
+ OnChildWindowSurfaceCreated(this, size, device_scale_factor, surface_id,
+ surface_sequence));
+ }
+}
+
void Window::LocalSetClientArea(
const gfx::Insets& new_client_area,
const std::vector<gfx::Rect>& additional_client_areas) {
« no previous file with comments | « services/ui/public/cpp/window.h ('k') | services/ui/public/cpp/window_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698