Index: components/exo/shell_surface.cc |
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc |
index 40bbd7f01dd034cbad5bc006063ee7afb0e971a1..163b55889d0b6e2e186257b4f34a7e4f47acb6de 100644 |
--- a/components/exo/shell_surface.cc |
+++ b/components/exo/shell_surface.cc |
@@ -180,6 +180,18 @@ void ShellSurface::Move() { |
} |
} |
+void ShellSurface::SetGeometry(const gfx::Rect& geometry) { |
+ TRACE_EVENT1("exo", "ShellSurface::SetGeometry", "geometry", |
+ geometry.ToString()); |
+ |
+ if (geometry.IsEmpty()) { |
+ DLOG(WARNING) << "Surface geometry must be non-empty"; |
+ return; |
+ } |
+ |
+ geometry_ = geometry; |
+} |
+ |
scoped_refptr<base::trace_event::TracedValue> ShellSurface::AsTracedValue() |
const { |
scoped_refptr<base::trace_event::TracedValue> value = |
@@ -198,7 +210,8 @@ void ShellSurface::OnSurfaceCommit() { |
// Update surface bounds and widget size. |
gfx::Point origin; |
views::View::ConvertPointToWidget(this, &origin); |
- surface_->SetBounds(gfx::Rect(origin, surface_->layer()->size())); |
+ surface_->SetBounds(gfx::Rect(origin - geometry_.OffsetFromOrigin(), |
+ surface_->layer()->size())); |
widget_->SetSize(widget_->non_client_view()->GetPreferredSize()); |
// Show widget if not already visible. |
@@ -248,6 +261,9 @@ views::NonClientFrameView* ShellSurface::CreateNonClientFrameView( |
// views::Views overrides: |
gfx::Size ShellSurface::GetPreferredSize() const { |
+ if (!geometry_.IsEmpty()) |
+ return geometry_.size(); |
+ |
return surface_ ? surface_->GetPreferredSize() : gfx::Size(); |
} |