Chromium Code Reviews| Index: components/mus/display_manager.cc |
| diff --git a/components/mus/display_manager.cc b/components/mus/display_manager.cc |
| index af29f1f6d4128ec12289b1f3ce1d724520a5c6fa..5793f9f8c9ca78179da286eeb8a098156cdf5992 100644 |
| --- a/components/mus/display_manager.cc |
| +++ b/components/mus/display_manager.cc |
| @@ -56,12 +56,14 @@ void DrawViewTree(cc::RenderPass* pass, |
| const gfx::Rect absolute_bounds = |
| view->bounds() + parent_to_root_origin_offset; |
| - std::vector<const ServerView*> children(view->GetChildren()); |
| - const float combined_opacity = opacity * view->opacity(); |
| - for (std::vector<const ServerView*>::reverse_iterator it = children.rbegin(); |
| - it != children.rend(); ++it) { |
| - DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(), |
| - combined_opacity); |
| + |
| + if (!view->parent() || view->surface_id().is_null()) { |
| + std::vector<const ServerView*> children(view->GetChildren()); |
| + const float combined_opacity = opacity * view->opacity(); |
| + for (auto it = children.rbegin(); it != children.rend(); ++it) { |
| + DrawViewTree(pass, *it, absolute_bounds.OffsetFromOrigin(), |
|
rjkroege
2015/09/16 21:31:37
can you remind me why there are multiple view tree
Fady Samuel
2015/09/17 18:31:42
We don't really. This is recursively visiting the
|
| + combined_opacity); |
| + } |
| } |
| gfx::Transform quad_to_target_transform; |
| @@ -201,19 +203,7 @@ void DefaultDisplayManager::Draw() { |
| if (!delegate_->GetRootView()->visible()) |
| return; |
| - scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| - render_pass->damage_rect = dirty_rect_; |
| - render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>()); |
| - |
| - DrawViewTree(render_pass.get(), delegate_->GetRootView(), gfx::Vector2d(), |
| - 1.0f); |
| - |
| - scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); |
| - frame_data->device_scale_factor = 1.f; |
| - frame_data->render_pass_list.push_back(render_pass.Pass()); |
| - |
| - scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| - frame->delegated_frame_data = frame_data.Pass(); |
| + scoped_ptr<cc::CompositorFrame> frame(GenerateCompositorFrame()); |
|
rjkroege
2015/09/16 21:31:37
you assemble the top-level OutputSurface Composito
Fady Samuel
2015/09/17 18:31:42
Done.
|
| frame_pending_ = true; |
| if (top_level_display_client_) { |
| top_level_display_client_->SubmitCompositorFrame( |
| @@ -255,6 +245,33 @@ void DefaultDisplayManager::UpdateMetrics(const gfx::Size& size, |
| delegate_->OnViewportMetricsChanged(old_metrics, metrics_); |
| } |
| +scoped_ptr<cc::CompositorFrame> |
| +DefaultDisplayManager::GenerateCompositorFrame() { |
| + scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
| + render_pass->damage_rect = dirty_rect_; |
| + render_pass->output_rect = gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>()); |
| + |
| + DrawViewTree(render_pass.get(), |
| + delegate_->GetRootView(), |
| + gfx::Vector2d(), 1.0f); |
| + |
| + scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); |
| + frame_data->device_scale_factor = 1.f; |
| + frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + |
| + scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| + frame->delegated_frame_data = frame_data.Pass(); |
| + return frame.Pass(); |
| +} |
| + |
| +const cc::CompositorFrame* |
| +DefaultDisplayManager::GetLastCompositorFrame() const { |
| + if (!top_level_display_client_) |
| + return nullptr; |
| + |
| + return top_level_display_client_->GetLastCompositorFrame(); |
| +} |
| + |
| void DefaultDisplayManager::OnBoundsChanged(const gfx::Rect& new_bounds) { |
| UpdateMetrics(new_bounds.size(), metrics_.device_pixel_ratio); |
| } |
| @@ -276,7 +293,21 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) { |
| mojo_event->pointer_data->horizontal_wheel = |
| ConvertUIWheelValueToMojoValue(wheel_event->y_offset()); |
| } |
| - delegate_->OnEvent(mojo_event.Pass()); |
| + ViewId id; |
| + if (event->IsLocatedEvent() && !!top_level_display_client_) { |
| + ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(event); |
| + gfx::Point transformed_point; |
| + cc::SurfaceId target_surface = |
| + surfaces_state_->hit_tester()->GetTargetSurfaceAtPoint( |
| + top_level_display_client_->surface_id(), |
| + located_event->location(), |
| + &transformed_point); |
| + id = ViewIdFromTransportId( |
| + cc::SurfaceIdAllocator::NamespaceForId(target_surface)); |
| + mojo_event->pointer_data->x = transformed_point.x(); |
|
rjkroege
2015/09/16 21:31:37
you don't translate the screen coords? they are in
Fady Samuel
2015/09/17 18:31:42
I'm not translating the screen coordinates. I'm ac
|
| + mojo_event->pointer_data->y = transformed_point.y(); |
| + } |
| + delegate_->OnEvent(id, mojo_event.Pass()); |
| switch (event->type()) { |
| case ui::ET_MOUSE_PRESSED: |
| @@ -319,7 +350,7 @@ void DefaultDisplayManager::DispatchEvent(ui::Event* event) { |
| key_press_event->GetText(), key_press_event->GetUnmodifiedText()))); |
| char_event.set_platform_keycode(key_press_event->platform_keycode()); |
| - delegate_->OnEvent(mojo::Event::From(char_event)); |
| + delegate_->OnEvent(id, mojo::Event::From(char_event)); |
| } |
| #endif |
| } |