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

Unified Diff: ui/aura/mus/client_surface_embedder.cc

Issue 2797263002: Aura-Mus: Implement gutter in the embedder. (Closed)
Patch Set: Addressed sadrul's comments Created 3 years, 8 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 | « ui/aura/mus/client_surface_embedder.h ('k') | ui/aura/mus/window_port_mus.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/mus/client_surface_embedder.cc
diff --git a/ui/aura/mus/client_surface_embedder.cc b/ui/aura/mus/client_surface_embedder.cc
index eea54164b5a21aab7e9b97889df5f0171765409d..e04a77b22ea0fb7bca2623fc7a737d362fd2427d 100644
--- a/ui/aura/mus/client_surface_embedder.cc
+++ b/ui/aura/mus/client_surface_embedder.cc
@@ -30,51 +30,78 @@ class StubSurfaceReferenceFactory : public cc::SurfaceReferenceFactory {
};
} // namespace
-ClientSurfaceEmbedder::ClientSurfaceEmbedder(Window* window) : window_(window) {
+ClientSurfaceEmbedder::ClientSurfaceEmbedder(
+ Window* window,
+ const gfx::Insets& client_area_insets)
+ : window_(window), client_area_insets_(client_area_insets) {
surface_layer_ = base::MakeUnique<ui::Layer>(ui::LAYER_TEXTURED);
- surface_layer_->SetVisible(true);
+ surface_layer_->SetMasksToBounds(true);
// The frame provided by the parent window->layer() needs to show through
// the surface layer.
surface_layer_->SetFillsBoundsOpaquely(false);
- clip_layer_ = base::MakeUnique<ui::Layer>(ui::LAYER_NOT_DRAWN);
- clip_layer_->SetFillsBoundsOpaquely(false);
-
- clip_layer_->Add(surface_layer_.get());
- window_->layer()->Add(clip_layer_.get());
+ window_->layer()->Add(surface_layer_.get());
// Window's layer may contain content from this client (the embedder), e.g.
// this is the case with window decorations provided by Window Manager.
// This content should appear underneath the content of the embedded client.
- window_->layer()->StackAtTop(clip_layer_.get());
-
- // We can't set this on window's layer, because that would clip the window
- // shadow.
- clip_layer_->SetMasksToBounds(true);
+ window_->layer()->StackAtTop(surface_layer_.get());
}
ClientSurfaceEmbedder::~ClientSurfaceEmbedder() = default;
void ClientSurfaceEmbedder::SetPrimarySurfaceInfo(
const cc::SurfaceInfo& surface_info) {
- // TODO(mfomitchev): Currently the frame size may not match the window size.
- // In the future the surface id will be created by Ash (and used with the
- // surface layer) when the window resize happens, which will ensure that the
- // surface size matches the window size (unless a timeout occurs).
- gfx::Size frame_size = surface_info.size_in_pixels();
- surface_layer_->SetBounds(
- gfx::Rect(0, 0, frame_size.width(), frame_size.height()));
- // Clip to window bounds.
- clip_layer_->SetBounds(
- gfx::Rect(0, 0, window_->bounds().width(), window_->bounds().height()));
-
surface_layer_->SetShowPrimarySurface(
surface_info, make_scoped_refptr(new StubSurfaceReferenceFactory));
+ surface_layer_->SetBounds(gfx::Rect(window_->bounds().size()));
}
void ClientSurfaceEmbedder::SetFallbackSurfaceInfo(
const cc::SurfaceInfo& surface_info) {
surface_layer_->SetFallbackSurface(surface_info);
+ UpdateSizeAndGutters();
+}
+
+void ClientSurfaceEmbedder::UpdateSizeAndGutters() {
+ surface_layer_->SetBounds(gfx::Rect(window_->bounds().size()));
+ // TODO(fsamuel): Fix this for high DPI.
+ gfx::Size fallback_surface_size(
+ surface_layer_->GetFallbackSurfaceInfo()
+ ? surface_layer_->GetFallbackSurfaceInfo()->size_in_pixels()
+ : gfx::Size());
+ gfx::Rect window_bounds(window_->bounds());
+ if (fallback_surface_size.width() < window_bounds.width()) {
sadrul 2017/04/07 21:54:41 You should check for fallback_surface_size being e
Fady Samuel 2017/04/07 21:58:48 Actually that's deliberate. I want the right gutte
+ right_gutter_ = base::MakeUnique<ui::Layer>(ui::LAYER_SOLID_COLOR);
+ // TODO(fsamuel): Use the embedded client's background color.
+ right_gutter_->SetColor(SK_ColorWHITE);
+ int width = window_bounds.width() - fallback_surface_size.width();
+ // The right gutter also includes the bottom-right corner, if necessary.
+ int height = window_bounds.height() - client_area_insets_.height();
+ right_gutter_->SetBounds(
+ gfx::Rect(client_area_insets_.left() + fallback_surface_size.width(),
+ client_area_insets_.top(), width, height));
+ window_->layer()->Add(right_gutter_.get());
+ } else {
+ right_gutter_.reset();
+ }
+
+ // Only create a bottom gutter if a fallback surface is available. Otherwise,
+ // the right gutter will fill the whole window until a fallback is available.
+ if (!fallback_surface_size.IsEmpty() &&
+ fallback_surface_size.height() < window_bounds.height()) {
+ bottom_gutter_ = base::MakeUnique<ui::Layer>(ui::LAYER_SOLID_COLOR);
+ // TODO(fsamuel): Use the embedded client's background color.
+ bottom_gutter_->SetColor(SK_ColorWHITE);
+ int width = fallback_surface_size.width();
+ int height = window_bounds.height() - fallback_surface_size.height();
+ bottom_gutter_->SetBounds(
+ gfx::Rect(0, fallback_surface_size.height(), width, height));
+ window_->layer()->Add(bottom_gutter_.get());
+ } else {
+ bottom_gutter_.reset();
+ }
+ window_->layer()->StackAtTop(surface_layer_.get());
}
} // namespace aura
« no previous file with comments | « ui/aura/mus/client_surface_embedder.h ('k') | ui/aura/mus/window_port_mus.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698