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

Side by Side Diff: ash/common/wm/overview/scoped_transform_overview_window.cc

Issue 2129213003: [ash-md] Hides frame headers in overview mode not using a mask (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [ash-md] Hides frame headers in overview mode not using a mask (comments) Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/common/wm/overview/scoped_transform_overview_window.h" 5 #include "ash/common/wm/overview/scoped_transform_overview_window.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ash/common/material_design/material_design_controller.h" 10 #include "ash/common/material_design/material_design_controller.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 TransientDescendantIterator(GetTransientRoot(window))); 173 TransientDescendantIterator(GetTransientRoot(window)));
174 } 174 }
175 175
176 } // namespace 176 } // namespace
177 177
178 // Mask layer that clips the window's original header in overview mode. 178 // Mask layer that clips the window's original header in overview mode.
179 // Only used with Material Design. 179 // Only used with Material Design.
180 class ScopedTransformOverviewWindow::OverviewContentMask 180 class ScopedTransformOverviewWindow::OverviewContentMask
181 : public ui::LayerDelegate { 181 : public ui::LayerDelegate {
182 public: 182 public:
183 OverviewContentMask(int inset, int radius); 183 explicit OverviewContentMask(float radius);
184 ~OverviewContentMask() override; 184 ~OverviewContentMask() override;
185 185
186 ui::Layer* layer() { return &layer_; } 186 ui::Layer* layer() { return &layer_; }
187 187
188 // Overridden from LayerDelegate. 188 // Overridden from LayerDelegate.
189 void OnPaintLayer(const ui::PaintContext& context) override; 189 void OnPaintLayer(const ui::PaintContext& context) override;
190 void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} 190 void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {}
191 void OnDeviceScaleFactorChanged(float device_scale_factor) override; 191 void OnDeviceScaleFactorChanged(float device_scale_factor) override;
192 base::Closure PrepareForLayerBoundsChange() override; 192 base::Closure PrepareForLayerBoundsChange() override;
193 193
194 private: 194 private:
195 ui::Layer layer_; 195 ui::Layer layer_;
196 int inset_; 196 float radius_;
197 int radius_;
198 197
199 DISALLOW_COPY_AND_ASSIGN(OverviewContentMask); 198 DISALLOW_COPY_AND_ASSIGN(OverviewContentMask);
200 }; 199 };
201 200
202 ScopedTransformOverviewWindow::OverviewContentMask::OverviewContentMask( 201 ScopedTransformOverviewWindow::OverviewContentMask::OverviewContentMask(
203 int inset, 202 float radius)
204 int radius) 203 : layer_(ui::LAYER_TEXTURED), radius_(radius) {
205 : layer_(ui::LAYER_TEXTURED), inset_(inset), radius_(radius) {
206 layer_.set_delegate(this); 204 layer_.set_delegate(this);
207 } 205 }
208 206
209 ScopedTransformOverviewWindow::OverviewContentMask::~OverviewContentMask() { 207 ScopedTransformOverviewWindow::OverviewContentMask::~OverviewContentMask() {
210 layer_.set_delegate(nullptr); 208 layer_.set_delegate(nullptr);
211 } 209 }
212 210
213 void ScopedTransformOverviewWindow::OverviewContentMask::OnPaintLayer( 211 void ScopedTransformOverviewWindow::OverviewContentMask::OnPaintLayer(
214 const ui::PaintContext& context) { 212 const ui::PaintContext& context) {
215 ui::PaintRecorder recorder(context, layer()->size()); 213 ui::PaintRecorder recorder(context, layer()->size());
216 gfx::Rect bounds(layer()->bounds().size()); 214 gfx::Rect bounds(layer()->bounds().size());
217 bounds.Inset(0, inset_, 0, 0);
218 215
219 // Tile a window into an area, rounding the bottom corners. 216 // Tile a window into an area, rounding the bottom corners.
220 const SkRect rect = gfx::RectToSkRect(bounds); 217 const SkRect rect = gfx::RectToSkRect(bounds);
221 const SkScalar corner_radius_scalar = SkIntToScalar(radius_); 218 const SkScalar corner_radius_scalar = SkIntToScalar(radius_);
222 SkScalar radii[8] = {0, 219 SkScalar radii[8] = {0,
223 0, // top-left 220 0, // top-left
224 0, 221 0,
225 0, // top-right 222 0, // top-right
226 corner_radius_scalar, 223 corner_radius_scalar,
227 corner_radius_scalar, // bottom-right 224 corner_radius_scalar, // bottom-right
(...skipping 25 matching lines...) Expand all
253 minimized_(window->GetShowState() == ui::SHOW_STATE_MINIMIZED), 250 minimized_(window->GetShowState() == ui::SHOW_STATE_MINIMIZED),
254 ignored_by_shelf_(window->GetWindowState()->ignored_by_shelf()), 251 ignored_by_shelf_(window->GetWindowState()->ignored_by_shelf()),
255 overview_started_(false), 252 overview_started_(false),
256 original_transform_(window->GetTargetTransform()), 253 original_transform_(window->GetTargetTransform()),
257 original_opacity_(window->GetTargetOpacity()), 254 original_opacity_(window->GetTargetOpacity()),
258 weak_ptr_factory_(this) {} 255 weak_ptr_factory_(this) {}
259 256
260 ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {} 257 ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {}
261 258
262 void ScopedTransformOverviewWindow::RestoreWindow() { 259 void ScopedTransformOverviewWindow::RestoreWindow() {
263 if (ash::MaterialDesignController::IsOverviewMaterial()) {
264 window()->GetLayer()->SetMaskLayer(nullptr);
265 mask_.reset();
266 }
267
268 ScopedAnimationSettings animation_settings_list; 260 ScopedAnimationSettings animation_settings_list;
269 BeginScopedAnimation(OverviewAnimationType::OVERVIEW_ANIMATION_RESTORE_WINDOW, 261 BeginScopedAnimation(OverviewAnimationType::OVERVIEW_ANIMATION_RESTORE_WINDOW,
270 &animation_settings_list); 262 &animation_settings_list);
271 SetTransform(window()->GetRootWindow(), original_transform_, 0); 263 SetTransform(window()->GetRootWindow(), original_transform_, 0);
272 264
273 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings = 265 std::unique_ptr<ScopedOverviewAnimationSettings> animation_settings =
274 CreateScopedOverviewAnimationSettings( 266 CreateScopedOverviewAnimationSettings(
275 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS, 267 OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS,
276 window_); 268 window_);
277 gfx::Transform transform; 269 gfx::Transform transform;
278 if (minimized_ && window_->GetShowState() != ui::SHOW_STATE_MINIMIZED) { 270 if (minimized_ && window_->GetShowState() != ui::SHOW_STATE_MINIMIZED) {
279 // Setting opacity 0 and visible false ensures that the property change 271 // Setting opacity 0 and visible false ensures that the property change
280 // to SHOW_STATE_MINIMIZED will not animate the window from its original 272 // to SHOW_STATE_MINIMIZED will not animate the window from its original
281 // bounds to the minimized position. 273 // bounds to the minimized position.
282 // Hiding the window needs to be done before the target opacity is 0, 274 // Hiding the window needs to be done before the target opacity is 0,
283 // otherwise the layer's visibility will not be updated 275 // otherwise the layer's visibility will not be updated
284 // (See VisibilityController::UpdateLayerVisibility). 276 // (See VisibilityController::UpdateLayerVisibility).
285 window_->Hide(); 277 window_->Hide();
286 window_->SetOpacity(0); 278 window_->SetOpacity(0);
287 window_->SetShowState(ui::SHOW_STATE_MINIMIZED); 279 window_->SetShowState(ui::SHOW_STATE_MINIMIZED);
288 } 280 }
289 window_->GetWindowState()->set_ignored_by_shelf(ignored_by_shelf_); 281 window_->GetWindowState()->set_ignored_by_shelf(ignored_by_shelf_);
290 SetOpacity(original_opacity_); 282 SetOpacity(original_opacity_);
283
284 if (ash::MaterialDesignController::IsOverviewMaterial()) {
285 ui::Layer* layer = window()->GetLayer();
286 layer->SetMaskLayer(nullptr);
287 mask_.reset();
288
289 if (original_window_shape_) {
290 layer->SetAlphaShape(
291 base::WrapUnique(new SkRegion(*original_window_shape_.get())));
292 } else {
293 layer->SetAlphaShape(nullptr);
294 }
295 window()->SetMasksToBounds(false);
296 }
291 } 297 }
292 298
293 void ScopedTransformOverviewWindow::BeginScopedAnimation( 299 void ScopedTransformOverviewWindow::BeginScopedAnimation(
294 OverviewAnimationType animation_type, 300 OverviewAnimationType animation_type,
295 ScopedAnimationSettings* animation_settings) { 301 ScopedAnimationSettings* animation_settings) {
296 for (auto* window : GetTransientTreeIterator(window_)) { 302 for (auto* window : GetTransientTreeIterator(window_)) {
297 animation_settings->push_back( 303 animation_settings->push_back(
298 CreateScopedOverviewAnimationSettings(animation_type, window)); 304 CreateScopedOverviewAnimationSettings(animation_type, window));
299 } 305 }
300 } 306 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 gfx::Transform transform; 393 gfx::Transform transform;
388 transform.Translate(dst_rect.x() - src_rect.x(), dst_rect.y() - src_rect.y()); 394 transform.Translate(dst_rect.x() - src_rect.x(), dst_rect.y() - src_rect.y());
389 transform.Scale(static_cast<float>(dst_rect.width()) / src_rect.width(), 395 transform.Scale(static_cast<float>(dst_rect.width()) / src_rect.width(),
390 static_cast<float>(dst_rect.height()) / src_rect.height()); 396 static_cast<float>(dst_rect.height()) / src_rect.height());
391 return transform; 397 return transform;
392 } 398 }
393 399
394 void ScopedTransformOverviewWindow::SetTransform( 400 void ScopedTransformOverviewWindow::SetTransform(
395 WmWindow* root_window, 401 WmWindow* root_window,
396 const gfx::Transform& transform, 402 const gfx::Transform& transform,
397 int radius) { 403 float radius) {
398 DCHECK(overview_started_); 404 DCHECK(overview_started_);
399 405
400 if (ash::MaterialDesignController::IsOverviewMaterial() && !mask_) { 406 if (ash::MaterialDesignController::IsOverviewMaterial() &&
401 mask_.reset(new OverviewContentMask( 407 &transform != &original_transform_) {
402 window()->GetIntProperty(WmWindowProperty::TOP_VIEW_INSET), radius)); 408 gfx::Rect bounds(GetTargetBoundsInScreen().size());
403 mask_->layer()->SetBounds(GetTargetBoundsInScreen()); 409 mask_.reset(new OverviewContentMask(radius));
410 mask_->layer()->SetFillsBoundsOpaquely(false);
411 mask_->layer()->SetBounds(bounds);
404 window()->GetLayer()->SetMaskLayer(mask_->layer()); 412 window()->GetLayer()->SetMaskLayer(mask_->layer());
413
414 SkRegion* window_shape = window()->GetLayer()->alpha_shape();
415 if (!original_window_shape_ && window_shape)
416 original_window_shape_.reset(new SkRegion(*window_shape));
417 const int inset =
418 window()->GetIntProperty(WmWindowProperty::TOP_VIEW_INSET);
419 if (inset > 0) {
420 bounds.Inset(0, inset, 0, 0);
421 SkRegion* region = new SkRegion;
422 region->setRect(RectToSkIRect(bounds));
423 if (original_window_shape_)
424 region->op(*original_window_shape_, SkRegion::kIntersect_Op);
425 window()->GetLayer()->SetAlphaShape(base::WrapUnique(region));
426 window()->SetMasksToBounds(true);
427 }
405 } 428 }
406 429
407 gfx::Point target_origin(GetTargetBoundsInScreen().origin()); 430 gfx::Point target_origin(GetTargetBoundsInScreen().origin());
408 431
409 for (auto* window : GetTransientTreeIterator(window_)) { 432 for (auto* window : GetTransientTreeIterator(window_)) {
410 WmWindow* parent_window = window->GetParent(); 433 WmWindow* parent_window = window->GetParent();
411 gfx::Point original_origin = 434 gfx::Point original_origin =
412 parent_window->ConvertRectToScreen(window->GetTargetBounds()).origin(); 435 parent_window->ConvertRectToScreen(window->GetTargetBounds()).origin();
413 gfx::Transform new_transform = 436 gfx::Transform new_transform =
414 TransformAboutPivot(gfx::Point(target_origin.x() - original_origin.x(), 437 TransformAboutPivot(gfx::Point(target_origin.x() - original_origin.x(),
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 if (parent_window) 471 if (parent_window)
449 parent_window->CloseWidget(); 472 parent_window->CloseWidget();
450 } 473 }
451 474
452 // static 475 // static
453 void ScopedTransformOverviewWindow::SetImmediateCloseForTests() { 476 void ScopedTransformOverviewWindow::SetImmediateCloseForTests() {
454 immediate_close_for_tests = true; 477 immediate_close_for_tests = true;
455 } 478 }
456 479
457 } // namespace ash 480 } // namespace ash
OLDNEW
« no previous file with comments | « ash/common/wm/overview/scoped_transform_overview_window.h ('k') | ash/common/wm/overview/window_grid.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698