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

Side by Side Diff: ash/wm/default_state.cc

Issue 2860163005: chromeos: gets rid of wm_screen_util (Closed)
Patch Set: include Created 3 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/wm/default_state.h" 5 #include "ash/wm/default_state.h"
6 6
7 #include "ash/public/cpp/shell_window_ids.h" 7 #include "ash/public/cpp/shell_window_ids.h"
8 #include "ash/root_window_controller.h" 8 #include "ash/root_window_controller.h"
9 #include "ash/screen_util.h"
9 #include "ash/shell.h" 10 #include "ash/shell.h"
10 #include "ash/shell_port.h" 11 #include "ash/shell_port.h"
11 #include "ash/wm/screen_pinning_controller.h" 12 #include "ash/wm/screen_pinning_controller.h"
12 #include "ash/wm/window_animation_types.h" 13 #include "ash/wm/window_animation_types.h"
13 #include "ash/wm/window_parenting_utils.h" 14 #include "ash/wm/window_parenting_utils.h"
14 #include "ash/wm/window_positioning_utils.h" 15 #include "ash/wm/window_positioning_utils.h"
15 #include "ash/wm/window_state.h" 16 #include "ash/wm/window_state.h"
16 #include "ash/wm/window_state_delegate.h" 17 #include "ash/wm/window_state_delegate.h"
17 #include "ash/wm/window_state_util.h" 18 #include "ash/wm/window_state_util.h"
18 #include "ash/wm/wm_event.h" 19 #include "ash/wm/wm_event.h"
19 #include "ash/wm/wm_screen_util.h"
20 #include "ash/wm_window.h" 20 #include "ash/wm_window.h"
21 #include "ui/aura/window.h" 21 #include "ui/aura/window.h"
22 #include "ui/display/display.h" 22 #include "ui/display/display.h"
23 #include "ui/display/screen.h" 23 #include "ui/display/screen.h"
24 24
25 namespace ash { 25 namespace ash {
26 namespace wm { 26 namespace wm {
27 namespace { 27 namespace {
28 28
29 // This specifies how much percent (30%) of a window rect 29 // This specifies how much percent (30%) of a window rect
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 if (window_state->IsFullscreen()) { 243 if (window_state->IsFullscreen()) {
244 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); 244 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
245 window_state->OnWMEvent(&event); 245 window_state->OnWMEvent(&event);
246 } else if (window_state->IsMaximized()) { 246 } else if (window_state->IsMaximized()) {
247 window_state->Restore(); 247 window_state->Restore();
248 } else if (window_state->CanMaximize()) { 248 } else if (window_state->CanMaximize()) {
249 window_state->Maximize(); 249 window_state->Maximize();
250 } 250 }
251 return true; 251 return true;
252 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: { 252 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: {
253 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window); 253 gfx::Rect work_area =
254 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window());
254 255
255 // Maximize vertically if: 256 // Maximize vertically if:
256 // - The window does not have a max height defined. 257 // - The window does not have a max height defined.
257 // - The window has the normal state type. Snapped windows are excluded 258 // - The window has the normal state type. Snapped windows are excluded
258 // because they are already maximized vertically and reverting to the 259 // because they are already maximized vertically and reverting to the
259 // restored bounds looks weird. 260 // restored bounds looks weird.
260 if (window->GetMaximumSize().height() != 0 || 261 if (window->GetMaximumSize().height() != 0 ||
261 !window_state->IsNormalStateType()) { 262 !window_state->IsNormalStateType()) {
262 return true; 263 return true;
263 } 264 }
(...skipping 10 matching lines...) Expand all
274 return true; 275 return true;
275 } 276 }
276 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: { 277 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: {
277 // Maximize horizontally if: 278 // Maximize horizontally if:
278 // - The window does not have a max width defined. 279 // - The window does not have a max width defined.
279 // - The window is snapped or has the normal state type. 280 // - The window is snapped or has the normal state type.
280 if (window->GetMaximumSize().width() != 0) 281 if (window->GetMaximumSize().width() != 0)
281 return true; 282 return true;
282 if (!window_state->IsNormalOrSnapped()) 283 if (!window_state->IsNormalOrSnapped())
283 return true; 284 return true;
284 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window); 285 gfx::Rect work_area =
286 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window());
285 if (window_state->IsNormalStateType() && 287 if (window_state->IsNormalStateType() &&
286 window_state->HasRestoreBounds() && 288 window_state->HasRestoreBounds() &&
287 (window->GetBounds().width() == work_area.width() && 289 (window->GetBounds().width() == work_area.width() &&
288 window->GetBounds().x() == work_area.x())) { 290 window->GetBounds().x() == work_area.x())) {
289 window_state->SetAndClearRestoreBounds(); 291 window_state->SetAndClearRestoreBounds();
290 } else { 292 } else {
291 gfx::Rect new_bounds(work_area.x(), window->GetBounds().y(), 293 gfx::Rect new_bounds(work_area.x(), window->GetBounds().y(),
292 work_area.width(), window->GetBounds().height()); 294 work_area.width(), window->GetBounds().height());
293 295
294 gfx::Rect restore_bounds = window->GetBounds(); 296 gfx::Rect restore_bounds = window->GetBounds();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 // Only windows of type WINDOW_TYPE_NORMAL or WINDOW_TYPE_PANEL need to be 364 // Only windows of type WINDOW_TYPE_NORMAL or WINDOW_TYPE_PANEL need to be
363 // adjusted to have minimum visibility, because they are positioned by the 365 // adjusted to have minimum visibility, because they are positioned by the
364 // user and user should always be able to interact with them. Other 366 // user and user should always be able to interact with them. Other
365 // windows are positioned programmatically. 367 // windows are positioned programmatically.
366 if (!window_state->IsUserPositionable()) 368 if (!window_state->IsUserPositionable())
367 return true; 369 return true;
368 370
369 // Use entire display instead of workarea. The logic ensures 30% 371 // Use entire display instead of workarea. The logic ensures 30%
370 // visibility which should be enough to see where the window gets 372 // visibility which should be enough to see where the window gets
371 // moved. 373 // moved.
372 gfx::Rect display_area = GetDisplayBoundsInParent(window); 374 gfx::Rect display_area =
375 ScreenUtil::GetDisplayBoundsInParent(window->aura_window());
373 int min_width = bounds.width() * wm::kMinimumPercentOnScreenArea; 376 int min_width = bounds.width() * wm::kMinimumPercentOnScreenArea;
374 int min_height = bounds.height() * wm::kMinimumPercentOnScreenArea; 377 int min_height = bounds.height() * wm::kMinimumPercentOnScreenArea;
375 wm::AdjustBoundsToEnsureWindowVisibility(display_area, min_width, 378 wm::AdjustBoundsToEnsureWindowVisibility(display_area, min_width,
376 min_height, &bounds); 379 min_height, &bounds);
377 window_state->AdjustSnappedBounds(&bounds); 380 window_state->AdjustSnappedBounds(&bounds);
378 if (window->GetBounds() != bounds) 381 if (window->GetBounds() != bounds)
379 window_state->SetBoundsConstrained(bounds); 382 window_state->SetBoundsConstrained(bounds);
380 return true; 383 return true;
381 } 384 }
382 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: { 385 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: {
383 if (window_state->is_dragged() || 386 if (window_state->is_dragged() ||
384 window_state->allow_set_bounds_direct() || 387 window_state->allow_set_bounds_direct() ||
385 SetMaximizedOrFullscreenBounds(window_state)) { 388 SetMaximizedOrFullscreenBounds(window_state)) {
386 return true; 389 return true;
387 } 390 }
388 gfx::Rect work_area_in_parent = 391 gfx::Rect work_area_in_parent =
389 GetDisplayWorkAreaBoundsInParent(window_state->window()); 392 ScreenUtil::GetDisplayWorkAreaBoundsInParent(
393 window_state->window()->aura_window());
390 gfx::Rect bounds = window_state->window()->GetTargetBounds(); 394 gfx::Rect bounds = window_state->window()->GetTargetBounds();
391 // When display bounds has changed, make sure the entire window is fully 395 // When display bounds has changed, make sure the entire window is fully
392 // visible. 396 // visible.
393 bounds.AdjustToFit(work_area_in_parent); 397 bounds.AdjustToFit(work_area_in_parent);
394 window_state->AdjustSnappedBounds(&bounds); 398 window_state->AdjustSnappedBounds(&bounds);
395 if (window_state->window()->GetTargetBounds() != bounds) 399 if (window_state->window()->GetTargetBounds() != bounds)
396 window_state->SetBoundsDirectAnimated(bounds); 400 window_state->SetBoundsDirectAnimated(bounds);
397 return true; 401 return true;
398 } 402 }
399 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: { 403 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: {
400 // Don't resize the maximized window when the desktop is covered 404 // Don't resize the maximized window when the desktop is covered
401 // by fullscreen window. crbug.com/504299. 405 // by fullscreen window. crbug.com/504299.
402 bool in_fullscreen = 406 bool in_fullscreen =
403 window_state->window() 407 window_state->window()
404 ->GetRootWindowController() 408 ->GetRootWindowController()
405 ->GetWorkspaceWindowState() == WORKSPACE_WINDOW_STATE_FULL_SCREEN; 409 ->GetWorkspaceWindowState() == WORKSPACE_WINDOW_STATE_FULL_SCREEN;
406 if (in_fullscreen && window_state->IsMaximized()) 410 if (in_fullscreen && window_state->IsMaximized())
407 return true; 411 return true;
408 412
409 if (window_state->is_dragged() || 413 if (window_state->is_dragged() ||
410 window_state->allow_set_bounds_direct() || 414 window_state->allow_set_bounds_direct() ||
411 SetMaximizedOrFullscreenBounds(window_state)) { 415 SetMaximizedOrFullscreenBounds(window_state)) {
412 return true; 416 return true;
413 } 417 }
414 gfx::Rect work_area_in_parent = 418 gfx::Rect work_area_in_parent =
415 GetDisplayWorkAreaBoundsInParent(window_state->window()); 419 ScreenUtil::GetDisplayWorkAreaBoundsInParent(
420 window_state->window()->aura_window());
416 gfx::Rect bounds = window_state->window()->GetTargetBounds(); 421 gfx::Rect bounds = window_state->window()->GetTargetBounds();
417 if (!window_state->window()->GetTransientParent()) { 422 if (!window_state->window()->GetTransientParent()) {
418 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent, 423 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent,
419 &bounds); 424 &bounds);
420 } 425 }
421 window_state->AdjustSnappedBounds(&bounds); 426 window_state->AdjustSnappedBounds(&bounds);
422 if (window_state->window()->GetTargetBounds() != bounds) 427 if (window_state->window()->GetTargetBounds() != bounds)
423 window_state->SetBoundsDirectAnimated(bounds); 428 window_state->SetBoundsDirectAnimated(bounds);
424 return true; 429 return true;
425 } 430 }
(...skipping 18 matching lines...) Expand all
444 break; 449 break;
445 } 450 }
446 return false; 451 return false;
447 } 452 }
448 453
449 // static 454 // static
450 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) { 455 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) {
451 DCHECK(!window_state->is_dragged()); 456 DCHECK(!window_state->is_dragged());
452 DCHECK(!window_state->allow_set_bounds_direct()); 457 DCHECK(!window_state->allow_set_bounds_direct());
453 if (window_state->IsMaximized()) { 458 if (window_state->IsMaximized()) {
454 window_state->SetBoundsDirect( 459 window_state->SetBoundsDirect(ScreenUtil::GetMaximizedWindowBoundsInParent(
455 GetMaximizedWindowBoundsInParent(window_state->window())); 460 window_state->window()->aura_window()));
456 return true; 461 return true;
457 } 462 }
458 if (window_state->IsFullscreen()) { 463 if (window_state->IsFullscreen()) {
459 window_state->SetBoundsDirect( 464 window_state->SetBoundsDirect(ScreenUtil::GetDisplayBoundsInParent(
460 GetDisplayBoundsInParent(window_state->window())); 465 window_state->window()->aura_window()));
461 return true; 466 return true;
462 } 467 }
463 return false; 468 return false;
464 } 469 }
465 470
466 // static 471 // static
467 void DefaultState::SetBounds(WindowState* window_state, 472 void DefaultState::SetBounds(WindowState* window_state,
468 const SetBoundsEvent* event) { 473 const SetBoundsEvent* event) {
469 if (window_state->is_dragged() || window_state->allow_set_bounds_direct()) { 474 if (window_state->is_dragged() || window_state->allow_set_bounds_direct()) {
470 // TODO(oshima|varkha): Is this still needed? crbug.com/485612. 475 // TODO(oshima|varkha): Is this still needed? crbug.com/485612.
471 window_state->SetBoundsDirect(event->requested_bounds()); 476 window_state->SetBoundsDirect(event->requested_bounds());
472 } else if (window_state->IsSnapped()) { 477 } else if (window_state->IsSnapped()) {
473 gfx::Rect work_area_in_parent = 478 gfx::Rect work_area_in_parent =
474 GetDisplayWorkAreaBoundsInParent(window_state->window()); 479 ScreenUtil::GetDisplayWorkAreaBoundsInParent(
480 window_state->window()->aura_window());
475 gfx::Rect child_bounds(event->requested_bounds()); 481 gfx::Rect child_bounds(event->requested_bounds());
476 wm::AdjustBoundsSmallerThan(work_area_in_parent.size(), &child_bounds); 482 wm::AdjustBoundsSmallerThan(work_area_in_parent.size(), &child_bounds);
477 window_state->AdjustSnappedBounds(&child_bounds); 483 window_state->AdjustSnappedBounds(&child_bounds);
478 window_state->SetBoundsDirect(child_bounds); 484 window_state->SetBoundsDirect(child_bounds);
479 } else if (!SetMaximizedOrFullscreenBounds(window_state)) { 485 } else if (!SetMaximizedOrFullscreenBounds(window_state)) {
480 window_state->SetBoundsConstrained(event->requested_bounds()); 486 window_state->SetBoundsConstrained(event->requested_bounds());
481 } 487 }
482 } 488 }
483 489
484 void DefaultState::EnterToNextState(WindowState* window_state, 490 void DefaultState::EnterToNextState(WindowState* window_state,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 case WINDOW_STATE_TYPE_LEFT_SNAPPED: 590 case WINDOW_STATE_TYPE_LEFT_SNAPPED:
585 case WINDOW_STATE_TYPE_RIGHT_SNAPPED: 591 case WINDOW_STATE_TYPE_RIGHT_SNAPPED:
586 bounds_in_parent = 592 bounds_in_parent =
587 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED 593 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED
588 ? GetDefaultLeftSnappedWindowBoundsInParent(window) 594 ? GetDefaultLeftSnappedWindowBoundsInParent(window)
589 : GetDefaultRightSnappedWindowBoundsInParent(window); 595 : GetDefaultRightSnappedWindowBoundsInParent(window);
590 break; 596 break;
591 597
592 case WINDOW_STATE_TYPE_DEFAULT: 598 case WINDOW_STATE_TYPE_DEFAULT:
593 case WINDOW_STATE_TYPE_NORMAL: { 599 case WINDOW_STATE_TYPE_NORMAL: {
594 gfx::Rect work_area_in_parent = GetDisplayWorkAreaBoundsInParent(window); 600 gfx::Rect work_area_in_parent =
601 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window());
595 if (window_state->HasRestoreBounds()) { 602 if (window_state->HasRestoreBounds()) {
596 bounds_in_parent = window_state->GetRestoreBoundsInParent(); 603 bounds_in_parent = window_state->GetRestoreBoundsInParent();
597 // Check if the |window|'s restored size is bigger than the working area 604 // Check if the |window|'s restored size is bigger than the working area
598 // This may happen if a window was resized to maximized bounds or if the 605 // This may happen if a window was resized to maximized bounds or if the
599 // display resolution changed while the window was maximized. 606 // display resolution changed while the window was maximized.
600 if (previous_state_type == WINDOW_STATE_TYPE_MAXIMIZED && 607 if (previous_state_type == WINDOW_STATE_TYPE_MAXIMIZED &&
601 bounds_in_parent.width() >= work_area_in_parent.width() && 608 bounds_in_parent.width() >= work_area_in_parent.width() &&
602 bounds_in_parent.height() >= work_area_in_parent.height()) { 609 bounds_in_parent.height() >= work_area_in_parent.height()) {
603 bounds_in_parent = work_area_in_parent; 610 bounds_in_parent = work_area_in_parent;
604 bounds_in_parent.Inset(kMaximizedWindowInset, kMaximizedWindowInset, 611 bounds_in_parent.Inset(kMaximizedWindowInset, kMaximizedWindowInset,
605 kMaximizedWindowInset, kMaximizedWindowInset); 612 kMaximizedWindowInset, kMaximizedWindowInset);
606 } 613 }
607 } else { 614 } else {
608 bounds_in_parent = window->GetBounds(); 615 bounds_in_parent = window->GetBounds();
609 } 616 }
610 // Make sure that part of the window is always visible. 617 // Make sure that part of the window is always visible.
611 if (!window_state->is_dragged()) { 618 if (!window_state->is_dragged()) {
612 // Avoid doing this while the window is being dragged as its root 619 // Avoid doing this while the window is being dragged as its root
613 // window hasn't been updated yet in the case of dragging to another 620 // window hasn't been updated yet in the case of dragging to another
614 // display. crbug.com/666836. 621 // display. crbug.com/666836.
615 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent, 622 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent,
616 &bounds_in_parent); 623 &bounds_in_parent);
617 } 624 }
618 break; 625 break;
619 } 626 }
620 case WINDOW_STATE_TYPE_MAXIMIZED: 627 case WINDOW_STATE_TYPE_MAXIMIZED:
621 bounds_in_parent = GetMaximizedWindowBoundsInParent(window); 628 bounds_in_parent =
629 ScreenUtil::GetMaximizedWindowBoundsInParent(window->aura_window());
622 break; 630 break;
623 631
624 case WINDOW_STATE_TYPE_FULLSCREEN: 632 case WINDOW_STATE_TYPE_FULLSCREEN:
625 case WINDOW_STATE_TYPE_PINNED: 633 case WINDOW_STATE_TYPE_PINNED:
626 case WINDOW_STATE_TYPE_TRUSTED_PINNED: 634 case WINDOW_STATE_TYPE_TRUSTED_PINNED:
627 bounds_in_parent = GetDisplayBoundsInParent(window); 635 bounds_in_parent =
636 ScreenUtil::GetDisplayBoundsInParent(window->aura_window());
628 break; 637 break;
629 638
630 case WINDOW_STATE_TYPE_MINIMIZED: 639 case WINDOW_STATE_TYPE_MINIMIZED:
631 break; 640 break;
632 case WINDOW_STATE_TYPE_INACTIVE: 641 case WINDOW_STATE_TYPE_INACTIVE:
633 case WINDOW_STATE_TYPE_END: 642 case WINDOW_STATE_TYPE_END:
634 case WINDOW_STATE_TYPE_AUTO_POSITIONED: 643 case WINDOW_STATE_TYPE_AUTO_POSITIONED:
635 return; 644 return;
636 } 645 }
637 646
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 WmWindow* window = window_state->window(); 693 WmWindow* window = window_state->window();
685 if (window_state->IsSnapped()) { 694 if (window_state->IsSnapped()) {
686 gfx::Rect center_in_screen = window->GetDisplayNearestWindow().work_area(); 695 gfx::Rect center_in_screen = window->GetDisplayNearestWindow().work_area();
687 gfx::Size size = window_state->HasRestoreBounds() 696 gfx::Size size = window_state->HasRestoreBounds()
688 ? window_state->GetRestoreBoundsInScreen().size() 697 ? window_state->GetRestoreBoundsInScreen().size()
689 : window->GetBounds().size(); 698 : window->GetBounds().size();
690 center_in_screen.ClampToCenteredSize(size); 699 center_in_screen.ClampToCenteredSize(size);
691 window_state->SetRestoreBoundsInScreen(center_in_screen); 700 window_state->SetRestoreBoundsInScreen(center_in_screen);
692 window_state->Restore(); 701 window_state->Restore();
693 } else { 702 } else {
694 gfx::Rect center_in_parent = GetDisplayWorkAreaBoundsInParent(window); 703 gfx::Rect center_in_parent =
704 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window());
695 center_in_parent.ClampToCenteredSize(window->GetBounds().size()); 705 center_in_parent.ClampToCenteredSize(window->GetBounds().size());
696 window_state->SetBoundsDirectAnimated(center_in_parent); 706 window_state->SetBoundsDirectAnimated(center_in_parent);
697 } 707 }
698 // Centering window is treated as if a user moved and resized the window. 708 // Centering window is treated as if a user moved and resized the window.
699 window_state->set_bounds_changed_by_user(true); 709 window_state->set_bounds_changed_by_user(true);
700 } 710 }
701 711
702 } // namespace wm 712 } // namespace wm
703 } // namespace ash 713 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698